--- /srv/rebuilderd/tmp/rebuilderdrsgga0/inputs/libopenmesh-doc_11.0.0-2_all.deb +++ /srv/rebuilderd/tmp/rebuilderdrsgga0/out/libopenmesh-doc_11.0.0-2_all.deb ├── file list │ @@ -1,3 +1,3 @@ │ -rw-r--r-- 0 0 0 4 2024-11-23 23:24:26.000000 debian-binary │ --rw-r--r-- 0 0 0 73444 2024-11-23 23:24:26.000000 control.tar.xz │ --rw-r--r-- 0 0 0 23371044 2024-11-23 23:24:26.000000 data.tar.xz │ +-rw-r--r-- 0 0 0 73168 2024-11-23 23:24:26.000000 control.tar.xz │ +-rw-r--r-- 0 0 0 23375764 2024-11-23 23:24:26.000000 data.tar.xz ├── control.tar.xz │ ├── control.tar │ │ ├── ./md5sums │ │ │ ├── ./md5sums │ │ │ │┄ Files differ │ │ │ ├── line order │ │ │ │ @@ -1,497 +1,497 @@ │ │ │ │ usr/share/doc/libopenmesh-dev/html/OpenMesh_text_128.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00005_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00011_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00032_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00014_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00047_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00233_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00245_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00257_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00260_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00272_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00278_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00284_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00293_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00302.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00302.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00302_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00317_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00304.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00304.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00304.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00305.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00305_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00306.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00306.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00306.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00308.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00308.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00308_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00309.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00309.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00309.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00311.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00311_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00312.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00312.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00312.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00314.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00314_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00315.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00315.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00315.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00317.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00318.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00318.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00318.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00320.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00320_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00321.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00321.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00321.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00323.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00323.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00323_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00324.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00324.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00324.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00325.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00325.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00325.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00326.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00326.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00326_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00327.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00327.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00327.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00328.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00328.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00328.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00329.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00329.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00329_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00330.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00330.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00330.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00331.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00331.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00331.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00332.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00332_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00333.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00333.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00333.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00335.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00335.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00335_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00336.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00336.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00336.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00338.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00338.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00338_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00339.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00339.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00339.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00340.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00340.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00340.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00341.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00341.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00341_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00342.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00342.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00342.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00343.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00343.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00343.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00344.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00344_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00345.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00345.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00345.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00347_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00350.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00350.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00350_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00351.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00351.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00351.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00352.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00352.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00352.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00353.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00353.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00353_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00354.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00354.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00354.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00355.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00355.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00355.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00356.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00356.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00356_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00357.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00357.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00357.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00358.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00358.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00358.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00359.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00359.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00359_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00360.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00360.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00360.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00361.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00361.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00361.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00362.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00362.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00362_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00363.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00363.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00363.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00364.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00364.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00364.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00365.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00365_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00366.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00366.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00366.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00368.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00368_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00369.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00369.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00369.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00371.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00371.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00371_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00372.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00372.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00372.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00373.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00373.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00373.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00374.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00374.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00374_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00375.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00375.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00375.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00376.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00376.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00376.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00377.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00377_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00378.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00378.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00378.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00380_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00383_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00386_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00392_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00395.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00395.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00395_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00396.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00396.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00396.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00397.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00397.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00397.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00398.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00398.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00398_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00399.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00399.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00399.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00401_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00404_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00410.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00410.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00410_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00411.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00411.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00411.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00412.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00412.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00412.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00416_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00419_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00425.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00425.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00425_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00426.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00426.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00426.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00428_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00431_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00434_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00440_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00443_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00449_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00452_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00458_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00461_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00455_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00464_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00470.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00470_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00471.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00471.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00471.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00473.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00473.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00473_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00491_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00494_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00474.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00474.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00474.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00475.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00475.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00475.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00476_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00479.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00479.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00479_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00480.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00480.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00480.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00481.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00481.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00481.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00482.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00482.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00482_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00483.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00483.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00483.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00484.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00484.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00484.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00485.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00485_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00486.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00486.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00486.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00488.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00488_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00489.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00489.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00489.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00497.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00497_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00498.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00498.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00498.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00500.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00500.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00500_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00509_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00501.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00501.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00501.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00502.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00502.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00502.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00503_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00512.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00512.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00512_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00513.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00513.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00513.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00515.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00515.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00515_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00516.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00516.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00516.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00518.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00518.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00518_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00519.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00519.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00519.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00520.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00520.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00520.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00521_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00524.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00524.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00524_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00525.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00525.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00525.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00527.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00527.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00527_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00528.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00528.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00528.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00529.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00529.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00529.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00530.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00530.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00530_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00531.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00531.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00531.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00533_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00536.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00536.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00536_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00537.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00537.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00537.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00539.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00539.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00539_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00540.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00540.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00540.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00542.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00542.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00542_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00543.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00543.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00543.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00545_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00548_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00551_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00554_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00557_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00560.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00560.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00560_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00563_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00561.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00561.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00561.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00566_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00569_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00572_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00578_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00581_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00584_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00587_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00590_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00593_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00596_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00599_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00602_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00605_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00608_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00614_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00617_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00620_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00626_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00623_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00629_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00632_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00635.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00635.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00635_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00636.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00636.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00636.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00637.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00637.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00637.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00638_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00641_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00644_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00647_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00650_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00653_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00656_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00659_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00665.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00665.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00662_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00665_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00666.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00666.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00666.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00667.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00667.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00667.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00668_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00671_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00674_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00677_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00680_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00683_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00686_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00689_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00692_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00695_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00698_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00701_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00704_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00707_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00710_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00713_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00716_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00719_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00722_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00725_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00728_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00731_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00734_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00743_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00737_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00740_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00746_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00749_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00752.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00752.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00752_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00753.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00753.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00753.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00754.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00754.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00754.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00755_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00758_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00764.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00764.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00761_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00764_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00765.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00765.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00765.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00766.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00766.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00766.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00767_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00770_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00773_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00776_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00779_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00782_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00785_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00788_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00791_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00794_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00797_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00800.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00800_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00801.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00801.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00801.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00802.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00802.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00802.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00803_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00806_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00812_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00815_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00809_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00818_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00821_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00824_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00827_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00836_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00839_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00842_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00845_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00848_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00851_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00854_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00857_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00860_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00863_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00866_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00869_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00872_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00878_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00881.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00881_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00882.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00882.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00882.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00884.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00884.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00884_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00885.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00885.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00885.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00886.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00886.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00886.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00893.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00893.js │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00890_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00893_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00894.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00894.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00894.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00896.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00896.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00896_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00897.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00897.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00897.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00898.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00898.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00898.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00899.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00899.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00899_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00900.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00900.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00900.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00902.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00902.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00902_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00903.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00903.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00903.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00905.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00905.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00905_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00906.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00906.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00906.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00908.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00908.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00908_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00909.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00909.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00909.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00910.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00910.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00910.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00911_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00914.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00914.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00914_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00915.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00915.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00915.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00917.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00917.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00917_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00918.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00918.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00918.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00920.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00920.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00920_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00921.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00921.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00921.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00923.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00923_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00924.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00924.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00924.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00925.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00925.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a00925.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00926_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00929_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00932_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00935.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00935.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00935_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00936.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00936.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00936.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00938_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00941_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00944_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00947_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00950.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00950.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00950_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00951.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00951.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00951.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00952.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00952.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00952.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00953.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00953_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00954.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00954.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00954.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00956.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00956_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00957.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00957.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00957.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00959_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00962.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00962.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00962_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00963.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00963.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00963.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00964.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00964.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00964.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00965.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00965.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00965_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00966.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00966.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00966.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00967.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00967.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00967.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00968.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00968_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00969.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00969.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00969.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00971.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00971.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00971_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00972.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00972.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00972.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00974.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00974.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00974_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00975.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00975.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00975.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00976.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00976.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00976.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00977.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00977.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00977_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00978.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00978.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00978.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00979.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00979.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00979.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00980.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00980.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00980_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00982.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00982.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00982.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00983.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00983.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00983_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00984.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00984.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00984.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00985.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00985.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00985.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00986.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00986.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a00986_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00987.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00987.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00987.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00988.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00988.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00988.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00989.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00989_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00990.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00990.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00990.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00992.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00993.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00993.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00993.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00995.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00995.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00995_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00996.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00996.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00996.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00997.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00997.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00997.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00998.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00998_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00999.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00999.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a00999.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01001.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01001.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01001_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01002.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01002.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01002.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01003.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01003.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01003.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01004.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01004_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01005.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01005.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01005.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01007.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01007_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01008.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01008.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01008.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01010_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01013.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01013.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01013_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01014.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01014.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01014.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01015.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01015.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01015.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01016.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01016_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01017.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01017.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01017.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01019.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01019.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01019_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01020.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01020.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01020.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01021.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01021.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01021.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01022.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01022.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01022_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01023.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01023.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01023.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01024.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01024.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01024.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01025.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01025_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01026.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01026.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01026.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01028.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01028.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01028_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01029.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01029.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01029.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01031.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01031_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01032.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01032.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01032.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01034.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01034.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01034_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01035.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01035.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01035.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01036.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01036.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01036.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01037.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01037_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01038.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01038.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01038.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01040.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01040_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01041.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01041.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01041.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01043.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01043.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01043_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01044.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01044.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01044.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01045.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01045.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01045.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01046.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01046.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01046_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01047.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01047.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01047.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01048.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01048.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01048.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01052_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01058_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01061_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01064_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01067_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01070_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01073_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01076_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01088_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01091_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01094.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01094.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01094_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01095.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01095.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01095.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01096.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01096.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01096.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01097.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01097.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01097_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01098.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01098.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01098.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01100_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01106.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01106.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01106_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01107.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01107.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01107.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01112_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01115.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01115.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01115_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01116.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01116.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01116.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01117.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01117.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01117.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01118_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01121_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01127_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01130_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01133_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01136_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01220_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a01223_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a01151_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a01154_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01235.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01236.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01237.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01237.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01238.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01238.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a01239.html │ │ │ │ @@ -2456,83 +2456,31 @@ │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06341.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06342.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06343.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06344.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06345.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06347_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06350_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06353_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06356.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06356_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06357.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06357.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06357.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06358.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06358.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06358.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06359_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06362_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06365.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06365.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06365_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06366.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06366.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06366.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06367.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06367.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06367.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06368.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06368.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06368_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06369.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06369.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06369.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06370.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06370.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06370.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06371.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06371.js │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06371_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06372.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06372.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06372.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06374_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06377_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06410_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06383_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06386_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06413_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06416_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06419_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06422_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06425_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06428_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06437_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06440_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06443_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06452_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06455_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06458.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06458.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06458_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06459.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06459.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06459.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06460.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06460.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06460.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06461.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06461.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06461_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06462.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06462.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06462.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06463.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06463.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06463.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06464.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06464_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06465.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06465.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06465.png │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06467.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06467_source.html │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06468.map │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06468.md5 │ │ │ │ -usr/share/doc/libopenmesh-dev/html/a06468.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06470.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06470.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06470_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06471.map │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06471.md5 │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06471.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06472.map │ │ │ │ @@ -2543,23 +2491,75 @@ │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06473_source.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06474.map │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06474.md5 │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06474.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06475.map │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06475.md5 │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06475.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06476.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06476_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06477.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06477.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06477.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06479.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06479_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06480.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06480.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06480.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06482.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06482.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06482_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06483.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06483.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06483.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06484.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06484.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06484.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06485.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06485.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06485_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06486.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06486.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06486.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06487.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06487.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06487.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06488.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06488.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06488_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06489.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06489.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06489.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06490.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06490.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06490.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06491.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06491.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06491_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06492.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06492.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06492.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06493.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06493.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06493.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06494.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06494.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06494_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06495.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06495.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06495.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06497_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06500.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/a06500_source.html │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06501.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06501.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06501.png │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06502.map │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06502.md5 │ │ │ │ +usr/share/doc/libopenmesh-dev/html/a06502.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/annotated.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/annotated_dup.js │ │ │ │ usr/share/doc/libopenmesh-dev/html/bc_s.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/bc_sd.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/class-hierarchy2.png │ │ │ │ usr/share/doc/libopenmesh-dev/html/classes.html │ │ │ │ usr/share/doc/libopenmesh-dev/html/closed.png ├── data.tar.xz │ ├── data.tar │ │ ├── file list │ │ │ @@ -1,503 +1,503 @@ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-23 23:24:26.000000 ./ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-23 23:24:26.000000 ./usr/ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-23 23:24:26.000000 ./usr/share/ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-23 23:24:26.000000 ./usr/share/doc/ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/ │ │ │ -rw-r--r-- 0 root (0) root (0) 9672 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/OpenMesh_text_128.png │ │ │ --rw-r--r-- 0 root (0) root (0) 40499 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00005_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 48620 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00011_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 32349 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00032_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16761 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00302_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14176 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00317_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30118 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00380_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 27008 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00443_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 34125 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00452_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20996 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00458_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 37775 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00461_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 37598 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00473_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 38899 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00491_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 127306 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00494_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 42265 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00500_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20184 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00509_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16676 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00512_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 124020 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00515_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30051 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00518_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16039 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00521_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39020 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00524_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39578 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00527_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 89625 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00530_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 84558 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00533_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18601 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00539_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 38634 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00545_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 29879 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00557_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 47556 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00560_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30552 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00563_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 36439 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00566_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23413 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00578_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30909 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00584_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 54312 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00587_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 36173 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00590_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 77845 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00593_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 29412 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00596_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 29306 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00599_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 35455 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00605_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16131 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00617_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30118 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00620_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 27576 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00626_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 27790 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00629_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 29574 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00638_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20524 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00641_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 56223 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00644_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00647_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16523 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00650_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14426 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00653_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 31635 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00656_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 76572 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00659_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21725 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00665.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1091 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00665.js │ │ │ --rw-r--r-- 0 root (0) root (0) 24526 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00665_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 782 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00666.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00666.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 14312 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00666.png │ │ │ --rw-r--r-- 0 root (0) root (0) 15614 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00667.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00667.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 327492 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00667.png │ │ │ --rw-r--r-- 0 root (0) root (0) 20346 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00668_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 40518 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00671_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 49102 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00674_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 144429 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00677_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 343828 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00680_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 138039 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00683_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 151835 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00686_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 202817 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00689_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23657 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00692_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 54926 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00695_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24307 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00698_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16515 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00704_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18583 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00710_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 34456 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00713_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20978 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00716_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 32051 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00719_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 113207 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00722_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 45009 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00725_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24213 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00728_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 117571 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00731_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 60618 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00734_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 513546 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00743_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19458 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00746_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 80415 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00752_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17947 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00755_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 40499 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00011_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 32349 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00014_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 48620 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00047_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 37598 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00233_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 42265 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00245_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 127306 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00257_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 38899 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00260_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 27008 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00272_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20996 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00278_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 37775 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00284_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 34125 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00293_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 11462 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00302.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 95 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00302.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 33578 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00302_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6118 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00304.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00304.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 101572 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00304.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 24243 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00305.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 35826 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00305_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21863 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00306.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00306.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 435658 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00306.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 7638 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00308.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 96 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00308.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 55248 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00308_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1506 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00309.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00309.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 28343 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00309.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 24232 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00311.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 38450 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00311_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 22214 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00312.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00312.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 445861 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00312.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 19987 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00314.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 40892 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00314_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17246 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00315.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00315.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 335544 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00315.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 6282 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00317.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 845 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00318.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00318.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 15463 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00318.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21917 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00320.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 89914 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00320_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19472 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00321.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00321.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 396039 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00321.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 8264 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00323.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 97 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00323.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 25460 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00323_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1508 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00324.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00324.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 28317 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00324.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 389 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00325.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00325.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 9360 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00325.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21152 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00326.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 98 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00326.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 30451 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00326_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17016 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00327.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00327.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 330698 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00327.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 391 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00328.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00328.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 10392 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00328.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21628 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00329.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 180 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00329.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 36083 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00329_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17010 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00330.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00330.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 330173 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00330.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 385 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00331.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00331.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 9594 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00331.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21149 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00332.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 64245 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00332_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18502 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00333.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00333.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 363354 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00333.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21710 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00335.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 102 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00335.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 50676 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00335_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18363 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00336.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00336.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 358748 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00336.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 22368 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00338.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 96 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00338.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 32017 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00338_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18240 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00339.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00339.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 360376 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00339.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 387 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00340.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00340.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 9476 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00340.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 24473 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00341.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 98 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00341.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 28144 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00341_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20998 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00342.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00342.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 419974 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00342.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 391 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00343.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00343.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 9979 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00343.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 22925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00344.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 31943 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00344_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20524 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00345.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00345.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 398535 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00345.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 22849 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00347_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8137 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00350.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 101 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00350.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 35949 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00350_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1329 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00351.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00351.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 25929 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00351.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 404 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00352.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00352.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 10263 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00352.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 22790 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00353.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 95 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00353.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 28878 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00353_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18685 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00354.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00354.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 365452 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00354.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 804 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00355.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00355.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 18236 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00355.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 25988 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00356.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 181 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00356.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 38546 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00356_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21262 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00357.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00357.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 416681 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00357.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1013 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00358.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00358.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 23645 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00358.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 23637 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00359.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 170 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00359.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 50664 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00359_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18162 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00360.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00360.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 338816 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00360.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1771 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00361.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00361.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 33541 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00361.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 24213 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00362.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 94 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00362.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 36538 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00362_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20220 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00363.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00363.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 391661 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00363.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 632 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00364.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00364.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 16317 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00364.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 6185 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00365.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 57721 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00365_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 561 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00366.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00366.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 8599 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00366.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 23507 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00368.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 65863 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00368_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21310 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00369.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00369.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 428100 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00369.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 9319 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00371.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 82 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00371.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 19904 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00371_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 631 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00372.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00372.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 10632 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00372.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 2272 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00373.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00373.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 41271 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00373.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 18693 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00374.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 337 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00374.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 47725 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00374_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1089 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00375.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00375.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 20624 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00375.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 5737 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00376.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00376.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 95262 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00376.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 7124 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00377.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23824 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00377_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1733 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00378.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00378.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 31789 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00378.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 38580 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00380_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 123920 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00383_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 27702 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00386_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33481 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00392_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10334 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00395.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 184 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00395.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 61465 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00395_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2443 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00396.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00396.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 36566 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00396.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1236 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00397.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00397.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 27828 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00397.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 9608 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00398.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 82 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00398.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 58914 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00398_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1918 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00399.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00399.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 30916 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00399.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 30741 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00401_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 42413 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00404_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9524 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00410.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 75 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00410.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 41283 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00410_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1131 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00411.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00411.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 19214 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00411.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 2205 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00412.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00412.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 56441 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00412.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 20050 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00416_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 47194 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00419_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7603 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00425.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 86 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00425.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 28758 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00425_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 989 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00426.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00426.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 13535 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00426.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 17745 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00428_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 34721 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00431_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 25755 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00434_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 28598 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00440_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23820 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00443_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 41679 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00449_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 41002 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00452_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19659 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00455_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 28244 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00464_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19714 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00470.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 37317 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00470_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17406 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00471.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00471.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 354548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00471.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21463 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00473.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 90 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00473.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 43329 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00473_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16698 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00474.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00474.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 335074 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00474.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1760 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00475.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00475.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 42017 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00475.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21179 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00476_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21284 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00479.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 93 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00479.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 26248 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00479_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16932 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00480.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00480.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 341542 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00480.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1352 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00481.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00481.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 31616 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00481.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 21189 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00482.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 103 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00482.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 23912 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00482_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17162 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00483.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00483.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 347548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00483.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 944 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00484.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00484.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 20700 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00484.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 20707 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00485.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 70919 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00485_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18613 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00486.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00486.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 366773 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00486.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 19489 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00488.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39240 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00488_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17160 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00489.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00489.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 347598 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00489.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 65572 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00497.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 272527 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00497_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 62910 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00498.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00498.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 1581029 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00498.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 19219 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00500.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1398 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00500.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 96101 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00500_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3888 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00501.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00501.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 70545 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00501.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 414 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00502.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00502.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 11515 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00502.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 80337 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00503_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10053 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00512.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 112 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00512.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 80964 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00512_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2315 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00513.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00513.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 40765 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00513.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 10841 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00515.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 361 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00515.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 29508 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00515_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4239 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00516.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00516.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 72545 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00516.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 10891 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00518.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 117 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00518.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 36271 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00518_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00519.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00519.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 19842 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00519.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 3373 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00520.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00520.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 77650 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00520.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 62950 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00521_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23986 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00524.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 124 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00524.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 91400 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00524_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19701 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00525.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00525.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 377809 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00525.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 8344 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00527.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 119 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00527.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 33867 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00527_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1332 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00528.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00528.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 27683 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00528.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 412 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00529.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00529.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 10176 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00529.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 23222 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00530.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 111 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00530.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 80897 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00530_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19135 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00531.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00531.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 378294 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00531.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 22619 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00533_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23406 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00536.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 225 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00536.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 41204 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00536_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19670 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00537.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00537.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 380548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00537.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 10214 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00539.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 127 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00539.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 99510 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00539_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2516 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00540.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00540.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 43138 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00540.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 10830 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00542.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 358 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00542.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 30239 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00542_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4237 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00543.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00543.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 72033 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00543.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 41327 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00545_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 36723 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00548_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 28800 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00551_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 74881 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00554_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33496 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00557_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39463 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00560.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 158 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00560.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 50335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00560_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 36183 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00561.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00561.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 837018 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00561.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 41094 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00566_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24803 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00569_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 59797 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00572_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18583 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00578_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20978 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00581_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 32051 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00584_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 34456 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00587_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 138039 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00590_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 49102 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00593_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 31635 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00596_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 117571 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00599_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 202817 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00602_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 45009 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00605_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 151835 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00608_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 76572 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00614_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24307 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00617_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24213 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00623_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17947 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00629_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16523 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00632_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21725 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00635.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1091 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00635.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 24526 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00635_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 782 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00636.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00636.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 14312 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00636.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 15614 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00637.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00637.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 327492 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00637.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 80415 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00638_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20346 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00641_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 40518 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00647_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19458 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00650_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16515 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00653_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 144429 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00656_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 113207 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00659_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23657 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00662_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 54926 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00665_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14426 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00668_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 343828 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00671_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 60618 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00674_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 513546 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00677_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20184 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00680_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16676 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00683_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8097 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00686_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 113202 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00692_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 15784 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00698_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 112950 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00701_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 25823 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00704_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 22709 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00707_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 59665 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00710_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 26962 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00713_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 62740 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00719_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18861 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00722_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17696 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00725_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 26683 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00728_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 53761 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00731_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20401 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00734_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39618 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00737_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 31562 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00740_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21198 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00746_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33479 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00749_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9482 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00752.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 241 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00752.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 52497 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00752_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1107 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00753.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00753.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 21779 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00753.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 838 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00754.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00754.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 21006 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00754.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 25850 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00755_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 31599 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00758_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9482 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00764.html │ │ │ --rw-r--r-- 0 root (0) root (0) 241 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00764.js │ │ │ --rw-r--r-- 0 root (0) root (0) 52497 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00764_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1107 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00765.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00765.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 21779 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00765.png │ │ │ --rw-r--r-- 0 root (0) root (0) 838 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00766.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00766.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 21006 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00766.png │ │ │ --rw-r--r-- 0 root (0) root (0) 184949 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00767_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 88587 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00770_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 25850 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00773_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33479 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00776_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23014 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00779_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 124050 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00782_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23131 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00785_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33406 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00788_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 12633 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00791_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 32066 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00794_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16076 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00797_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 38328 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00800.html │ │ │ --rw-r--r-- 0 root (0) root (0) 15962 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00800_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1785 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00801.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00801.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 25394 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00801.png │ │ │ --rw-r--r-- 0 root (0) root (0) 36846 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00802.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00802.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 917591 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00802.png │ │ │ --rw-r--r-- 0 root (0) root (0) 49169 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00806_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 26683 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00812_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 31562 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00815_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 112950 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00821_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 22709 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00824_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 15784 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00827_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21198 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00836_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18861 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00839_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20401 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00842_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8097 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00845_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 59665 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00848_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 53761 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00851_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 62740 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00857_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 25823 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00860_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 113202 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00863_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 26962 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00866_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17696 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00869_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39618 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00872_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 80337 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00878_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 65572 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00881.html │ │ │ --rw-r--r-- 0 root (0) root (0) 272527 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00881_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 62910 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00882.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00882.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 1581029 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00882.png │ │ │ --rw-r--r-- 0 root (0) root (0) 19219 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00884.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1398 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00884.js │ │ │ --rw-r--r-- 0 root (0) root (0) 96101 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00884_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3888 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00885.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00885.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 70545 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00885.png │ │ │ --rw-r--r-- 0 root (0) root (0) 414 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00886.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00886.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 11515 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00886.png │ │ │ --rw-r--r-- 0 root (0) root (0) 10830 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00893.html │ │ │ --rw-r--r-- 0 root (0) root (0) 358 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00893.js │ │ │ --rw-r--r-- 0 root (0) root (0) 30239 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00893_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4237 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00894.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00894.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 72033 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00894.png │ │ │ --rw-r--r-- 0 root (0) root (0) 8344 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00896.html │ │ │ --rw-r--r-- 0 root (0) root (0) 119 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00896.js │ │ │ --rw-r--r-- 0 root (0) root (0) 33867 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00896_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1332 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00897.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00897.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 27683 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00897.png │ │ │ --rw-r--r-- 0 root (0) root (0) 412 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00898.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00898.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 10176 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00898.png │ │ │ --rw-r--r-- 0 root (0) root (0) 10841 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00899.html │ │ │ --rw-r--r-- 0 root (0) root (0) 361 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00899.js │ │ │ --rw-r--r-- 0 root (0) root (0) 29508 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00899_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4239 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00900.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00900.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 72545 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00900.png │ │ │ --rw-r--r-- 0 root (0) root (0) 10214 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00902.html │ │ │ --rw-r--r-- 0 root (0) root (0) 127 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00902.js │ │ │ --rw-r--r-- 0 root (0) root (0) 99510 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00902_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 2516 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00903.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00903.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 43138 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00903.png │ │ │ --rw-r--r-- 0 root (0) root (0) 23986 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00905.html │ │ │ --rw-r--r-- 0 root (0) root (0) 124 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00905.js │ │ │ --rw-r--r-- 0 root (0) root (0) 91400 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00905_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19701 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00906.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00906.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 377809 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00906.png │ │ │ --rw-r--r-- 0 root (0) root (0) 10891 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00908.html │ │ │ --rw-r--r-- 0 root (0) root (0) 117 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00908.js │ │ │ --rw-r--r-- 0 root (0) root (0) 36271 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00908_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00909.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00909.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 19842 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00909.png │ │ │ --rw-r--r-- 0 root (0) root (0) 3373 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00910.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00910.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 77650 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00910.png │ │ │ --rw-r--r-- 0 root (0) root (0) 62950 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00911_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23222 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00914.html │ │ │ --rw-r--r-- 0 root (0) root (0) 111 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00914.js │ │ │ --rw-r--r-- 0 root (0) root (0) 80897 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00914_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19135 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00915.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00915.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 378294 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00915.png │ │ │ --rw-r--r-- 0 root (0) root (0) 10053 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00917.html │ │ │ --rw-r--r-- 0 root (0) root (0) 112 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00917.js │ │ │ --rw-r--r-- 0 root (0) root (0) 80964 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00917_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 2315 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00918.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00918.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 40765 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00918.png │ │ │ --rw-r--r-- 0 root (0) root (0) 23406 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00920.html │ │ │ --rw-r--r-- 0 root (0) root (0) 225 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00920.js │ │ │ --rw-r--r-- 0 root (0) root (0) 41204 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00920_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19670 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00921.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00921.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 380548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00921.png │ │ │ --rw-r--r-- 0 root (0) root (0) 22619 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00923_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33496 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00926_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 41094 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00929_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 59797 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00932_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39463 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00935.html │ │ │ --rw-r--r-- 0 root (0) root (0) 158 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00935.js │ │ │ --rw-r--r-- 0 root (0) root (0) 50335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00935_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 36183 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00936.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00936.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 837018 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00936.png │ │ │ --rw-r--r-- 0 root (0) root (0) 74881 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00938_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24803 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00941_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 36723 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00944_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 41327 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00947_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21284 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00950.html │ │ │ --rw-r--r-- 0 root (0) root (0) 93 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00950.js │ │ │ --rw-r--r-- 0 root (0) root (0) 26248 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00950_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16932 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00951.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00951.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 341542 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00951.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1352 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00952.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00952.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 31616 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00952.png │ │ │ --rw-r--r-- 0 root (0) root (0) 20707 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00953.html │ │ │ --rw-r--r-- 0 root (0) root (0) 70919 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00953_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18613 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00954.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00954.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 366773 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00954.png │ │ │ --rw-r--r-- 0 root (0) root (0) 19489 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00956.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39240 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00956_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17160 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00957.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00957.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 347598 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00957.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21179 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00959_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21463 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00962.html │ │ │ --rw-r--r-- 0 root (0) root (0) 90 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00962.js │ │ │ --rw-r--r-- 0 root (0) root (0) 43329 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00962_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16698 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00963.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00963.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 335074 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00963.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1760 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00964.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00964.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 42017 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00964.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21189 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00965.html │ │ │ --rw-r--r-- 0 root (0) root (0) 103 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00965.js │ │ │ --rw-r--r-- 0 root (0) root (0) 23912 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00965_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17162 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00966.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00966.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 347548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00966.png │ │ │ --rw-r--r-- 0 root (0) root (0) 944 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00967.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00967.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 20700 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00967.png │ │ │ --rw-r--r-- 0 root (0) root (0) 19714 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00968.html │ │ │ --rw-r--r-- 0 root (0) root (0) 37317 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00968_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17406 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00969.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00969.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 354548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00969.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21710 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00971.html │ │ │ --rw-r--r-- 0 root (0) root (0) 102 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00971.js │ │ │ --rw-r--r-- 0 root (0) root (0) 50676 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00971_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18363 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00972.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00972.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 358748 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00972.png │ │ │ --rw-r--r-- 0 root (0) root (0) 23637 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00974.html │ │ │ --rw-r--r-- 0 root (0) root (0) 170 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00974.js │ │ │ --rw-r--r-- 0 root (0) root (0) 50664 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00974_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18162 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00975.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00975.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 338816 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00975.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1771 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00976.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00976.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 33541 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00976.png │ │ │ --rw-r--r-- 0 root (0) root (0) 24213 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00977.html │ │ │ --rw-r--r-- 0 root (0) root (0) 94 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00977.js │ │ │ --rw-r--r-- 0 root (0) root (0) 36538 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00977_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20220 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00978.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00978.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 391661 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00978.png │ │ │ --rw-r--r-- 0 root (0) root (0) 632 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00979.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00979.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 16317 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00979.png │ │ │ --rw-r--r-- 0 root (0) root (0) 11462 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00980.html │ │ │ --rw-r--r-- 0 root (0) root (0) 95 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00980.js │ │ │ --rw-r--r-- 0 root (0) root (0) 33578 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00980_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6118 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00982.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00982.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 101572 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00982.png │ │ │ --rw-r--r-- 0 root (0) root (0) 18693 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00983.html │ │ │ --rw-r--r-- 0 root (0) root (0) 337 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00983.js │ │ │ --rw-r--r-- 0 root (0) root (0) 47725 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00983_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1089 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00984.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00984.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 20624 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00984.png │ │ │ --rw-r--r-- 0 root (0) root (0) 5737 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00985.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00985.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 95262 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00985.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21152 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00986.html │ │ │ --rw-r--r-- 0 root (0) root (0) 98 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00986.js │ │ │ --rw-r--r-- 0 root (0) root (0) 30451 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00986_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17016 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00987.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00987.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 330698 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00987.png │ │ │ --rw-r--r-- 0 root (0) root (0) 391 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00988.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00988.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 10392 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00988.png │ │ │ --rw-r--r-- 0 root (0) root (0) 24243 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00989.html │ │ │ --rw-r--r-- 0 root (0) root (0) 35826 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00989_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21863 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00990.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00990.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 435658 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00990.png │ │ │ --rw-r--r-- 0 root (0) root (0) 6282 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00992.html │ │ │ --rw-r--r-- 0 root (0) root (0) 845 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00993.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00993.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 15463 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00993.png │ │ │ --rw-r--r-- 0 root (0) root (0) 9319 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00995.html │ │ │ --rw-r--r-- 0 root (0) root (0) 82 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00995.js │ │ │ --rw-r--r-- 0 root (0) root (0) 19904 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00995_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 631 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00996.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00996.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 10632 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00996.png │ │ │ --rw-r--r-- 0 root (0) root (0) 2272 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00997.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00997.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 41271 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00997.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21149 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00998.html │ │ │ --rw-r--r-- 0 root (0) root (0) 64245 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00998_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18502 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00999.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00999.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 363354 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00999.png │ │ │ --rw-r--r-- 0 root (0) root (0) 25988 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01001.html │ │ │ --rw-r--r-- 0 root (0) root (0) 181 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01001.js │ │ │ --rw-r--r-- 0 root (0) root (0) 38546 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01001_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21262 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01002.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01002.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 416681 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01002.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1013 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01003.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01003.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 23645 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01003.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21917 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01004.html │ │ │ --rw-r--r-- 0 root (0) root (0) 89914 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01004_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19472 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01005.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01005.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 396039 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01005.png │ │ │ --rw-r--r-- 0 root (0) root (0) 22925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01007.html │ │ │ --rw-r--r-- 0 root (0) root (0) 31943 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01007_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20524 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01008.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01008.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 398535 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01008.png │ │ │ --rw-r--r-- 0 root (0) root (0) 22849 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01010_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8264 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01013.html │ │ │ --rw-r--r-- 0 root (0) root (0) 97 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01013.js │ │ │ --rw-r--r-- 0 root (0) root (0) 25460 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01013_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1508 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01014.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01014.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 28317 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01014.png │ │ │ --rw-r--r-- 0 root (0) root (0) 389 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01015.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01015.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 9360 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01015.png │ │ │ --rw-r--r-- 0 root (0) root (0) 7124 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01016.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23824 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01016_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1733 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01017.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01017.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 31789 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01017.png │ │ │ --rw-r--r-- 0 root (0) root (0) 21628 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01019.html │ │ │ --rw-r--r-- 0 root (0) root (0) 180 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01019.js │ │ │ --rw-r--r-- 0 root (0) root (0) 36083 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01019_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17010 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01020.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01020.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 330173 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01020.png │ │ │ --rw-r--r-- 0 root (0) root (0) 385 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01021.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01021.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 9594 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01021.png │ │ │ --rw-r--r-- 0 root (0) root (0) 22368 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01022.html │ │ │ --rw-r--r-- 0 root (0) root (0) 96 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01022.js │ │ │ --rw-r--r-- 0 root (0) root (0) 32017 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01022_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18240 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01023.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01023.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 360376 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01023.png │ │ │ --rw-r--r-- 0 root (0) root (0) 387 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01024.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01024.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 9476 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01024.png │ │ │ --rw-r--r-- 0 root (0) root (0) 19987 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01025.html │ │ │ --rw-r--r-- 0 root (0) root (0) 40892 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01025_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17246 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01026.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01026.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 335544 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01026.png │ │ │ --rw-r--r-- 0 root (0) root (0) 7638 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01028.html │ │ │ --rw-r--r-- 0 root (0) root (0) 96 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01028.js │ │ │ --rw-r--r-- 0 root (0) root (0) 55248 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01028_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1506 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01029.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01029.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 28343 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01029.png │ │ │ --rw-r--r-- 0 root (0) root (0) 6185 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01031.html │ │ │ --rw-r--r-- 0 root (0) root (0) 57721 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01031_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 561 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01032.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01032.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 8599 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01032.png │ │ │ --rw-r--r-- 0 root (0) root (0) 24473 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01034.html │ │ │ --rw-r--r-- 0 root (0) root (0) 98 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01034.js │ │ │ --rw-r--r-- 0 root (0) root (0) 28144 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01034_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20998 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01035.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01035.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 419974 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01035.png │ │ │ --rw-r--r-- 0 root (0) root (0) 391 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01036.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01036.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 9979 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01036.png │ │ │ --rw-r--r-- 0 root (0) root (0) 23507 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01037.html │ │ │ --rw-r--r-- 0 root (0) root (0) 65863 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01037_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21310 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01038.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01038.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 428100 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01038.png │ │ │ --rw-r--r-- 0 root (0) root (0) 24232 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01040.html │ │ │ --rw-r--r-- 0 root (0) root (0) 38450 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01040_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 22214 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01041.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01041.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 445861 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01041.png │ │ │ --rw-r--r-- 0 root (0) root (0) 8137 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01043.html │ │ │ --rw-r--r-- 0 root (0) root (0) 101 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01043.js │ │ │ --rw-r--r-- 0 root (0) root (0) 35949 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01043_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1329 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01044.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01044.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 25929 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01044.png │ │ │ --rw-r--r-- 0 root (0) root (0) 404 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01045.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01045.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 10263 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01045.png │ │ │ --rw-r--r-- 0 root (0) root (0) 22790 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01046.html │ │ │ --rw-r--r-- 0 root (0) root (0) 95 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01046.js │ │ │ --rw-r--r-- 0 root (0) root (0) 28878 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01046_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18685 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01047.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01047.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 365452 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01047.png │ │ │ --rw-r--r-- 0 root (0) root (0) 804 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01048.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01048.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 18236 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01048.png │ │ │ --rw-r--r-- 0 root (0) root (0) 41679 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01052_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19659 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01058_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 28598 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01061_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 28244 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01064_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 25755 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01067_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 34721 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01070_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23820 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01073_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 41002 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01076_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 47194 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01088_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 27702 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01091_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10334 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01094.html │ │ │ --rw-r--r-- 0 root (0) root (0) 184 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01094.js │ │ │ --rw-r--r-- 0 root (0) root (0) 61465 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01094_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 2443 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01095.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01095.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 36566 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01095.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1236 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01096.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01096.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 27828 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01096.png │ │ │ --rw-r--r-- 0 root (0) root (0) 9608 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01097.html │ │ │ --rw-r--r-- 0 root (0) root (0) 82 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01097.js │ │ │ --rw-r--r-- 0 root (0) root (0) 58914 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01097_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1918 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01098.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01098.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 30916 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01098.png │ │ │ --rw-r--r-- 0 root (0) root (0) 17745 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01100_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7603 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01106.html │ │ │ --rw-r--r-- 0 root (0) root (0) 86 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01106.js │ │ │ --rw-r--r-- 0 root (0) root (0) 28758 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01106_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 989 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01107.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01107.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 13535 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01107.png │ │ │ --rw-r--r-- 0 root (0) root (0) 20050 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01112_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9524 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01115.html │ │ │ --rw-r--r-- 0 root (0) root (0) 75 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01115.js │ │ │ --rw-r--r-- 0 root (0) root (0) 41283 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01115_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1131 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01116.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01116.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 19214 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01116.png │ │ │ --rw-r--r-- 0 root (0) root (0) 2205 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01117.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01117.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 56441 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01117.png │ │ │ --rw-r--r-- 0 root (0) root (0) 30741 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01118_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 42413 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01121_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33481 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01127_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 28800 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01130_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 38580 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01133_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 123920 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01136_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 38548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01220_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 185672 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01223_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 124050 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00761_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 88587 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00764_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33406 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00767_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 184949 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00770_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23014 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00773_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23131 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00776_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30909 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00779_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 84558 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00782_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39020 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00788_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 89625 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00791_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 36173 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00794_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23413 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00797_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 27576 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00803_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 29306 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00806_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30118 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00809_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16131 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00818_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 29574 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00821_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 27790 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00836_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 35455 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00839_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30051 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00842_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 54312 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00845_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00848_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 56223 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00851_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 124020 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00854_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39578 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00857_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 29412 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00860_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20524 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00863_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16039 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00866_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18601 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00869_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 77845 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00878_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 47556 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00881_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 36439 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00884_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 29879 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00890_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 38634 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00893_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30552 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00908_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 12633 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00914_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 49169 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00920_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 38328 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00923.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 15962 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00923_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1785 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00924.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00924.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 25394 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00924.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 36846 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00925.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00925.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 917591 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00925.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 16076 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00926_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 32066 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00929_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14176 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a00986_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16761 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01004_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30118 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01118_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 185672 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01151_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 38548 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01154_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 5863 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01235.html │ │ │ -rw-r--r-- 0 root (0) root (0) 8817 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01236.html │ │ │ -rw-r--r-- 0 root (0) root (0) 7713 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01237.html │ │ │ -rw-r--r-- 0 root (0) root (0) 316 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01237.js │ │ │ -rw-r--r-- 0 root (0) root (0) 6160 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01238.html │ │ │ -rw-r--r-- 0 root (0) root (0) 2506 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01238.js │ │ │ -rw-r--r-- 0 root (0) root (0) 6277 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a01239.html │ │ │ @@ -2462,110 +2462,110 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 7228 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06341.html │ │ │ -rw-r--r-- 0 root (0) root (0) 6469 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06342.html │ │ │ -rw-r--r-- 0 root (0) root (0) 6481 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06343.html │ │ │ -rw-r--r-- 0 root (0) root (0) 4797 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06344.html │ │ │ -rw-r--r-- 0 root (0) root (0) 4918 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06345.html │ │ │ -rw-r--r-- 0 root (0) root (0) 23522 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06347_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 24682 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06350_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16205 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06353_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7726 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06356.html │ │ │ --rw-r--r-- 0 root (0) root (0) 15915 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06356_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 342 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06357.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06357.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 7582 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06357.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1973 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06358.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06358.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 41310 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06358.png │ │ │ --rw-r--r-- 0 root (0) root (0) 134965 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06359_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 117697 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06362_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 25967 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06365.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1038 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06365.js │ │ │ --rw-r--r-- 0 root (0) root (0) 46319 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06365_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 2088 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06366.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06366.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 34693 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06366.png │ │ │ --rw-r--r-- 0 root (0) root (0) 7944 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06367.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06367.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 164652 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06367.png │ │ │ --rw-r--r-- 0 root (0) root (0) 11345 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06368.html │ │ │ --rw-r--r-- 0 root (0) root (0) 77 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06368.js │ │ │ --rw-r--r-- 0 root (0) root (0) 20288 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06368_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4675 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06369.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06369.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 80545 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06369.png │ │ │ --rw-r--r-- 0 root (0) root (0) 447 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06370.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06370.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 9090 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06370.png │ │ │ --rw-r--r-- 0 root (0) root (0) 7011 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06371.html │ │ │ --rw-r--r-- 0 root (0) root (0) 157 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06371.js │ │ │ --rw-r--r-- 0 root (0) root (0) 48119 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06371_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 574 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06372.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06372.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 12248 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06372.png │ │ │ --rw-r--r-- 0 root (0) root (0) 70651 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06374_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18536 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06377_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19159 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06410_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06413_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19159 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06383_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06386_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24687 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06413_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24569 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06416_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23155 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06419_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13090 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06422_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13091 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06425_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13069 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06428_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5328 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06437_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5329 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06440_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10682 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06443_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 7104 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06452_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 7105 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06455_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10552 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06458.html │ │ │ --rw-r--r-- 0 root (0) root (0) 100 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06458.js │ │ │ --rw-r--r-- 0 root (0) root (0) 50600 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06458_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3889 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06459.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06459.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 65455 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06459.png │ │ │ --rw-r--r-- 0 root (0) root (0) 422 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06460.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06460.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 11145 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06460.png │ │ │ --rw-r--r-- 0 root (0) root (0) 9299 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06461.html │ │ │ --rw-r--r-- 0 root (0) root (0) 219 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06461.js │ │ │ --rw-r--r-- 0 root (0) root (0) 53750 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06461_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1530 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06462.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06462.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 29695 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06462.png │ │ │ --rw-r--r-- 0 root (0) root (0) 838 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06463.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06463.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 23457 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06463.png │ │ │ --rw-r--r-- 0 root (0) root (0) 15187 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06464.html │ │ │ --rw-r--r-- 0 root (0) root (0) 54123 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06464_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7034 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06465.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06465.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 128586 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06465.png │ │ │ --rw-r--r-- 0 root (0) root (0) 7335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06467.html │ │ │ --rw-r--r-- 0 root (0) root (0) 186252 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06467_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 1923 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06468.map │ │ │ --rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06468.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 39098 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06468.png │ │ │ --rw-r--r-- 0 root (0) root (0) 14050 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06470.html │ │ │ --rw-r--r-- 0 root (0) root (0) 566 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06470.js │ │ │ --rw-r--r-- 0 root (0) root (0) 51394 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06470_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 2608 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06471.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 134965 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06458_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 117697 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06461_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 70651 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06464_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18536 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06467_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10552 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06470.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 100 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06470.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 50600 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06470_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3889 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06471.map │ │ │ -rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06471.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 43052 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06471.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1435 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06472.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 65455 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06471.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 422 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06472.map │ │ │ -rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06472.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 38728 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06472.png │ │ │ --rw-r--r-- 0 root (0) root (0) 11160 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06473.html │ │ │ --rw-r--r-- 0 root (0) root (0) 401 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06473.js │ │ │ --rw-r--r-- 0 root (0) root (0) 35295 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06473_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 2516 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06474.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 11145 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06472.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 9299 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06473.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 219 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06473.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 53750 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06473_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1530 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06474.map │ │ │ -rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06474.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 40822 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06474.png │ │ │ --rw-r--r-- 0 root (0) root (0) 1111 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06475.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 29695 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06474.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 838 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06475.map │ │ │ -rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06475.md5 │ │ │ --rw-r--r-- 0 root (0) root (0) 25489 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06475.png │ │ │ --rw-r--r-- 0 root (0) root (0) 24687 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06476_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24569 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06479_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23155 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06482_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13090 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06485_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13091 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06488_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13069 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06491_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5328 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06494_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5329 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06497_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10682 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06500_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23457 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06475.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 15187 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06476.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 54123 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06476_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7034 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06477.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06477.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 128586 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06477.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 7335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06479.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 186252 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06479_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1923 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06480.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06480.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 39098 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06480.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 14050 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06482.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 566 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06482.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 51394 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06482_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2608 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06483.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06483.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 43052 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06483.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1435 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06484.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06484.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 38728 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06484.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 11160 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06485.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 401 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06485.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 35295 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06485_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2516 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06486.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06486.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 40822 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06486.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1111 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06487.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06487.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 25489 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06487.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 25967 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06488.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 1038 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06488.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 46319 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06488_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 2088 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06489.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06489.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 34693 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06489.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 7944 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06490.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06490.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 164652 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06490.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 11345 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06491.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 77 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06491.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 20288 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06491_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4675 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06492.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06492.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 80545 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06492.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 447 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06493.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06493.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 9090 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06493.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 7011 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06494.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 157 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06494.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 48119 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06494_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 574 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06495.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06495.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 12248 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06495.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 16205 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06497_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7726 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06500.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 15915 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06500_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 342 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06501.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06501.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 7582 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06501.png │ │ │ +-rw-r--r-- 0 root (0) root (0) 1973 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06502.map │ │ │ +-rw-r--r-- 0 root (0) root (0) 32 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06502.md5 │ │ │ +-rw-r--r-- 0 root (0) root (0) 41310 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/a06502.png │ │ │ -rw-r--r-- 0 root (0) root (0) 125563 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/annotated.html │ │ │ -rw-r--r-- 0 root (0) root (0) 17833 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/annotated_dup.js │ │ │ -rw-r--r-- 0 root (0) root (0) 676 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/bc_s.png │ │ │ -rw-r--r-- 0 root (0) root (0) 635 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/bc_sd.png │ │ │ -rw-r--r-- 0 root (0) root (0) 50034 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/class-hierarchy2.png │ │ │ -rw-r--r-- 0 root (0) root (0) 46893 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/classes.html │ │ │ -rw-r--r-- 0 root (0) root (0) 132 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/closed.png │ │ │ @@ -3785,15 +3785,15 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 88 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_1b.js │ │ │ -rw-r--r-- 0 root (0) root (0) 542 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_1c.js │ │ │ -rw-r--r-- 0 root (0) root (0) 4925 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_1d.js │ │ │ -rw-r--r-- 0 root (0) root (0) 139 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_2.js │ │ │ -rw-r--r-- 0 root (0) root (0) 7528 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_3.js │ │ │ -rw-r--r-- 0 root (0) root (0) 10882 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_4.js │ │ │ -rw-r--r-- 0 root (0) root (0) 9472 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_5.js │ │ │ --rw-r--r-- 0 root (0) root (0) 56007 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_6.js │ │ │ +-rw-r--r-- 0 root (0) root (0) 56074 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_6.js │ │ │ -rw-r--r-- 0 root (0) root (0) 8335 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_7.js │ │ │ -rw-r--r-- 0 root (0) root (0) 14955 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_8.js │ │ │ -rw-r--r-- 0 root (0) root (0) 24064 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_9.js │ │ │ -rw-r--r-- 0 root (0) root (0) 12792 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_a.js │ │ │ -rw-r--r-- 0 root (0) root (0) 17528 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_b.js │ │ │ -rw-r--r-- 0 root (0) root (0) 13172 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_c.js │ │ │ -rw-r--r-- 0 root (0) root (0) 315 2024-11-23 23:24:26.000000 ./usr/share/doc/libopenmesh-dev/html/search/all_d.js │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00011_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/importer/BaseImporter.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/exporter/BaseExporter.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
BaseImporter.hh
│ │ │ +
BaseExporter.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -141,208 +141,143 @@ │ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45//=============================================================================
│ │ │
46//
│ │ │ -
47// Implements the baseclass for IOManager importer modules
│ │ │ +
47// Implements the baseclass for MeshWriter exporter modules
│ │ │
48//
│ │ │
49//=============================================================================
│ │ │
50
│ │ │
51
│ │ │ -
52#ifndef __BASEIMPORTER_HH__
│ │ │ -
53#define __BASEIMPORTER_HH__
│ │ │ +
52#ifndef __BASEEXPORTER_HH__
│ │ │ +
53#define __BASEEXPORTER_HH__
│ │ │
54
│ │ │
55
│ │ │
56//=== INCLUDES ================================================================
│ │ │
57
│ │ │
58
│ │ │
59// STL
│ │ │
60#include <vector>
│ │ │
61
│ │ │
62// OpenMesh
│ │ │
63#include <OpenMesh/Core/System/config.h>
│ │ │
64#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │
65#include <OpenMesh/Core/Mesh/BaseKernel.hh>
│ │ │
66
│ │ │
67
│ │ │ -
68//== NAMESPACES ===============================================================
│ │ │ +
68//=== NAMESPACES ==============================================================
│ │ │
69
│ │ │
70
│ │ │
71namespace OpenMesh {
│ │ │
72namespace IO {
│ │ │
73
│ │ │
74
│ │ │ -
75//=== IMPLEMENTATION ==========================================================
│ │ │ +
75//=== EXPORTER ================================================================
│ │ │
76
│ │ │
77
│ │ │ -
│ │ │ -
83class OPENMESHDLLEXPORT BaseImporter
│ │ │ -
84{
│ │ │ -
85public:
│ │ │ -
86
│ │ │ -
87 // base class needs virtual destructor
│ │ │ -
88 virtual ~BaseImporter() {}
│ │ │ +
│ │ │ +
84class OPENMESHDLLEXPORT BaseExporter
│ │ │ +
85{
│ │ │ +
86public:
│ │ │ +
87
│ │ │ +
88 virtual ~BaseExporter() { }
│ │ │
89
│ │ │
90
│ │ │ -
91 // add a vertex with coordinate \c _point
│ │ │ -
92 virtual VertexHandle add_vertex(const Vec3f& _point) = 0;
│ │ │ -
93
│ │ │ -
94 // add a vertex with coordinate \c _point
│ │ │ -
95 virtual VertexHandle add_vertex(const Vec3d& _point) { return add_vertex(Vec3f(_point)); }
│ │ │ -
96
│ │ │ -
97 // add a vertex without coordinate. Use set_point to set the position deferred
│ │ │ -
98 virtual VertexHandle add_vertex() = 0;
│ │ │ -
99
│ │ │ -
100 // add an edge. Use set_next, set_vertex and set_face to set corresponding entities for halfedges
│ │ │ -
101 virtual HalfedgeHandle add_edge(VertexHandle _vh0, VertexHandle _vh1) = 0;
│ │ │ -
102
│ │ │ -
103 // add a face with indices _indices refering to vertices
│ │ │ -
104 typedef std::vector<VertexHandle> VHandles;
│ │ │ -
105 virtual FaceHandle add_face(const VHandles& _indices) = 0;
│ │ │ -
106
│ │ │ -
107 // add a face with incident halfedge
│ │ │ -
108 virtual FaceHandle add_face(HalfedgeHandle _heh) = 0;
│ │ │ -
109
│ │ │ -
110 // add texture coordinates per face, _vh references the first texcoord
│ │ │ -
111 virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec2f>& _face_texcoords) = 0;
│ │ │ -
112
│ │ │ -
113 // add texture 3d coordinates per face, _vh references the first texcoord
│ │ │ -
114 virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec3f>& _face_texcoords) = 0;
│ │ │ -
115
│ │ │ -
116 // Set the texture index for a face
│ │ │ -
117 virtual void set_face_texindex( FaceHandle _fh, int _texId ) = 0;
│ │ │ -
118
│ │ │ -
119 // Set coordinate of the given vertex. Use this function, if you created a vertex without coordinate
│ │ │ -
120 virtual void set_point(VertexHandle _vh, const Vec3f& _point) = 0;
│ │ │ -
121
│ │ │ -
122 // Set outgoing halfedge for the given vertex.
│ │ │ -
123 virtual void set_halfedge(VertexHandle _vh, HalfedgeHandle _heh) = 0;
│ │ │ -
124
│ │ │ -
125 // set vertex normal
│ │ │ -
126 virtual void set_normal(VertexHandle _vh, const Vec3f& _normal) = 0;
│ │ │ -
127
│ │ │ -
128 // set vertex normal
│ │ │ -
129 virtual void set_normal(VertexHandle _vh, const Vec3d& _normal) = 0;
│ │ │ -
130
│ │ │ -
131 // set vertex color
│ │ │ -
132 virtual void set_color(VertexHandle _vh, const Vec3uc& _color) = 0;
│ │ │ +
91 // get vertex data
│ │ │ +
92 virtual Vec3f point(VertexHandle _vh) const = 0;
│ │ │ +
93 virtual Vec3d pointd(VertexHandle _vh) const = 0;
│ │ │ +
94 virtual bool is_point_double() const = 0;
│ │ │ +
95 virtual Vec3f normal(VertexHandle _vh) const = 0;
│ │ │ +
96 virtual Vec3d normald(VertexHandle _vh) const = 0;
│ │ │ +
97 virtual bool is_normal_double() const = 0;
│ │ │ +
98 virtual Vec3uc color(VertexHandle _vh) const = 0;
│ │ │ +
99 virtual Vec4uc colorA(VertexHandle _vh) const = 0;
│ │ │ +
100 virtual Vec3ui colori(VertexHandle _vh) const = 0;
│ │ │ +
101 virtual Vec4ui colorAi(VertexHandle _vh) const = 0;
│ │ │ +
102 virtual Vec3f colorf(VertexHandle _vh) const = 0;
│ │ │ +
103 virtual Vec4f colorAf(VertexHandle _vh) const = 0;
│ │ │ +
104 virtual Vec2f texcoord(VertexHandle _vh) const = 0;
│ │ │ +
105 virtual Vec2f texcoord(HalfedgeHandle _heh) const = 0;
│ │ │ +
106 virtual OpenMesh::Attributes::StatusInfo status(VertexHandle _vh) const = 0;
│ │ │ +
107
│ │ │ +
108
│ │ │ +
109 // get face data
│ │ │ +
110 virtual unsigned int
│ │ │ +
111 get_vhandles(FaceHandle _fh,
│ │ │ +
112 std::vector<VertexHandle>& _vhandles) const=0;
│ │ │ +
113
│ │ │ +
121 virtual HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const = 0;
│ │ │ +
122 virtual unsigned int
│ │ │ +
123 get_face_texcoords(std::vector<Vec2f>& _hehandles) const = 0;
│ │ │ +
124 virtual Vec3f normal(FaceHandle _fh) const = 0;
│ │ │ +
125 virtual Vec3d normald(FaceHandle _fh) const = 0;
│ │ │ +
126 virtual Vec3uc color (FaceHandle _fh) const = 0;
│ │ │ +
127 virtual Vec4uc colorA(FaceHandle _fh) const = 0;
│ │ │ +
128 virtual Vec3ui colori(FaceHandle _fh) const = 0;
│ │ │ +
129 virtual Vec4ui colorAi(FaceHandle _fh) const = 0;
│ │ │ +
130 virtual Vec3f colorf(FaceHandle _fh) const = 0;
│ │ │ +
131 virtual Vec4f colorAf(FaceHandle _fh) const = 0;
│ │ │ +
132 virtual OpenMesh::Attributes::StatusInfo status(FaceHandle _fh) const = 0;
│ │ │
133
│ │ │ -
134 // set vertex color
│ │ │ -
135 virtual void set_color(VertexHandle _vh, const Vec4uc& _color) = 0;
│ │ │ -
136
│ │ │ -
137 // set vertex color
│ │ │ -
138 virtual void set_color(VertexHandle _vh, const Vec3f& _color) = 0;
│ │ │ -
139
│ │ │ -
140 // set vertex color
│ │ │ -
141 virtual void set_color(VertexHandle _vh, const Vec4f& _color) = 0;
│ │ │ +
134 // get edge data
│ │ │ +
135 virtual Vec3uc color(EdgeHandle _eh) const = 0;
│ │ │ +
136 virtual Vec4uc colorA(EdgeHandle _eh) const = 0;
│ │ │ +
137 virtual Vec3ui colori(EdgeHandle _eh) const = 0;
│ │ │ +
138 virtual Vec4ui colorAi(EdgeHandle _eh) const = 0;
│ │ │ +
139 virtual Vec3f colorf(EdgeHandle _eh) const = 0;
│ │ │ +
140 virtual Vec4f colorAf(EdgeHandle _eh) const = 0;
│ │ │ +
141 virtual OpenMesh::Attributes::StatusInfo status(EdgeHandle _eh) const = 0;
│ │ │
142
│ │ │ -
143 // set vertex texture coordinate
│ │ │ -
144 virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord) = 0;
│ │ │ -
145
│ │ │ -
146 // set vertex status
│ │ │ -
147 virtual void set_status(VertexHandle _vh, const OpenMesh::Attributes::StatusInfo& _status) = 0;
│ │ │ -
148
│ │ │ -
149 // set next halfedge handle
│ │ │ -
150 virtual void set_next(HalfedgeHandle _heh, HalfedgeHandle _next) = 0;
│ │ │ -
151
│ │ │ -
152 // set incident face handle for given halfedge
│ │ │ -
153 virtual void set_face(HalfedgeHandle _heh, FaceHandle _fh) = 0;
│ │ │ +
143 // get halfedge data
│ │ │ +
144 virtual int get_halfedge_id(VertexHandle _vh) = 0;
│ │ │ +
145 virtual int get_halfedge_id(FaceHandle _vh) = 0;
│ │ │ +
146 virtual int get_next_halfedge_id(HalfedgeHandle _heh) = 0;
│ │ │ +
147 virtual int get_to_vertex_id(HalfedgeHandle _heh) = 0;
│ │ │ +
148 virtual int get_face_id(HalfedgeHandle _heh) = 0;
│ │ │ +
149 virtual OpenMesh::Attributes::StatusInfo status(HalfedgeHandle _heh) const = 0;
│ │ │ +
150
│ │ │ +
151 // get reference to base kernel
│ │ │ +
152 virtual const BaseKernel* kernel() { return nullptr; }
│ │ │ +
153
│ │ │
154
│ │ │ -
155 // request texture coordinate property
│ │ │ -
156 virtual void request_face_texcoords2D() = 0;
│ │ │ -
157
│ │ │ -
158 // set vertex texture coordinate
│ │ │ -
159 virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) = 0;
│ │ │ +
155 // query number of faces, vertices, normals, texcoords
│ │ │ +
156 virtual size_t n_vertices() const = 0;
│ │ │ +
157 virtual size_t n_faces() const = 0;
│ │ │ +
158 virtual size_t n_edges() const = 0;
│ │ │ +
159
│ │ │
160
│ │ │ -
161 // set 3d vertex texture coordinate
│ │ │ -
162 virtual void set_texcoord(VertexHandle _vh, const Vec3f& _texcoord) = 0;
│ │ │ -
163
│ │ │ -
164 // set 3d vertex texture coordinate
│ │ │ -
165 virtual void set_texcoord(HalfedgeHandle _heh, const Vec3f& _texcoord) = 0;
│ │ │ -
166
│ │ │ -
167 // set halfedge status
│ │ │ -
168 virtual void set_status(HalfedgeHandle _heh, const OpenMesh::Attributes::StatusInfo& _status) = 0;
│ │ │ -
169
│ │ │ -
170 // set edge color
│ │ │ -
171 virtual void set_color(EdgeHandle _eh, const Vec3uc& _color) = 0;
│ │ │ -
172
│ │ │ -
173 // set edge color
│ │ │ -
174 virtual void set_color(EdgeHandle _eh, const Vec4uc& _color) = 0;
│ │ │ -
175
│ │ │ -
176 // set edge color
│ │ │ -
177 virtual void set_color(EdgeHandle _eh, const Vec3f& _color) = 0;
│ │ │ -
178
│ │ │ -
179 // set edge color
│ │ │ -
180 virtual void set_color(EdgeHandle _eh, const Vec4f& _color) = 0;
│ │ │ -
181
│ │ │ -
182 // set edge status
│ │ │ -
183 virtual void set_status(EdgeHandle _eh, const OpenMesh::Attributes::StatusInfo& _status) = 0;
│ │ │ -
184
│ │ │ -
185 // set face normal
│ │ │ -
186 virtual void set_normal(FaceHandle _fh, const Vec3f& _normal) = 0;
│ │ │ -
187
│ │ │ -
188 // set face normal
│ │ │ -
189 virtual void set_normal(FaceHandle _fh, const Vec3d& _normal) = 0;
│ │ │ -
190
│ │ │ -
191 // set face color
│ │ │ -
192 virtual void set_color(FaceHandle _fh, const Vec3uc& _color) = 0;
│ │ │ -
193
│ │ │ -
194 // set face color
│ │ │ -
195 virtual void set_color(FaceHandle _fh, const Vec4uc& _color) = 0;
│ │ │ -
196
│ │ │ -
197 // set face color
│ │ │ -
198 virtual void set_color(FaceHandle _fh, const Vec3f& _color) = 0;
│ │ │ -
199
│ │ │ -
200 // set face color
│ │ │ -
201 virtual void set_color(FaceHandle _fh, const Vec4f& _color) = 0;
│ │ │ -
202
│ │ │ -
203 // set face status
│ │ │ -
204 virtual void set_status(FaceHandle _fh, const OpenMesh::Attributes::StatusInfo& _status) = 0;
│ │ │ -
205
│ │ │ -
206 // Store a property in the mesh mapping from an int to a texture file
│ │ │ -
207 // Use set_face_texindex to set the index for each face
│ │ │ -
208 virtual void add_texture_information( int _id , std::string _name ) = 0;
│ │ │ -
209
│ │ │ -
210 // get reference to base kernel
│ │ │ -
211 virtual BaseKernel* kernel() { return nullptr; }
│ │ │ -
212
│ │ │ -
213 virtual bool is_triangle_mesh() const { return false; }
│ │ │ -
214
│ │ │ -
215 // reserve mem for elements
│ │ │ -
216 virtual void reserve( unsigned int /* nV */,
│ │ │ -
217 unsigned int /* nE */,
│ │ │ -
218 unsigned int /* nF */) {}
│ │ │ -
219
│ │ │ -
220 // query number of faces, vertices, normals, texcoords
│ │ │ -
221 virtual size_t n_vertices() const = 0;
│ │ │ -
222 virtual size_t n_faces() const = 0;
│ │ │ -
223 virtual size_t n_edges() const = 0;
│ │ │ -
224
│ │ │ -
225
│ │ │ -
226 // pre-processing
│ │ │ -
227 virtual void prepare() {}
│ │ │ -
228
│ │ │ -
229 // post-processing
│ │ │ -
230 virtual void finish() {}
│ │ │ -
231};
│ │ │ +
161 // property information
│ │ │ +
162 virtual bool is_triangle_mesh() const { return false; }
│ │ │ +
163 virtual bool has_vertex_normals() const { return false; }
│ │ │ +
164 virtual bool has_vertex_colors() const { return false; }
│ │ │ +
165 virtual bool has_vertex_status() const { return false; }
│ │ │ +
166 virtual bool has_vertex_texcoords() const { return false; }
│ │ │ +
167 virtual bool has_edge_colors() const { return false; }
│ │ │ +
168 virtual bool has_edge_status() const { return false; }
│ │ │ +
169 virtual bool has_halfedge_status() const { return false; }
│ │ │ +
170 virtual bool has_face_normals() const { return false; }
│ │ │ +
171 virtual bool has_face_colors() const { return false; }
│ │ │ +
172 virtual bool has_face_status() const { return false; }
│ │ │ +
173};
│ │ │
│ │ │ -
232
│ │ │ -
233
│ │ │ -
234//=============================================================================
│ │ │ -
235} // namespace IO
│ │ │ -
236} // namespace OpenMesh
│ │ │ -
237//=============================================================================
│ │ │ -
238#endif
│ │ │ -
239//=============================================================================
│ │ │ +
174
│ │ │ +
175
│ │ │ +
176//=============================================================================
│ │ │ +
177} // namespace IO
│ │ │ +
178} // namespace OpenMesh
│ │ │ +
179//=============================================================================
│ │ │ +
180#endif
│ │ │ +
181//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ │ │ │ │ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ +
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ +
virtual HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const =0
getHeh returns the HalfEdgeHandle that belongs to the face specified by _fh and has a toVertexHandle ...
│ │ │
This class provides low-level property management like adding/removing properties and access to prope...
Definition BaseKernel.hh:98
│ │ │
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │
Handle for a edge entity.
Definition Handles.hh:135
│ │ │
Handle for a face entity.
Definition Handles.hh:142
│ │ │
Add status information to a base class.
Definition Status.hh:95
│ │ │
│ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -BaseImporter.hh │ │ │ │ +BaseExporter.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -51,22 +51,22 @@ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45// │ │ │ │ ============================================================================= │ │ │ │ 46// │ │ │ │ -47// Implements the baseclass for IOManager importer modules │ │ │ │ +47// Implements the baseclass for MeshWriter exporter modules │ │ │ │ 48// │ │ │ │ 49// │ │ │ │ ============================================================================= │ │ │ │ 50 │ │ │ │ 51 │ │ │ │ -52#ifndef __BASEIMPORTER_HH__ │ │ │ │ -53#define __BASEIMPORTER_HH__ │ │ │ │ +52#ifndef __BASEEXPORTER_HH__ │ │ │ │ +53#define __BASEEXPORTER_HH__ │ │ │ │ 54 │ │ │ │ 55 │ │ │ │ 56//=== INCLUDES │ │ │ │ ================================================================ │ │ │ │ 57 │ │ │ │ 58 │ │ │ │ 59// STL │ │ │ │ @@ -74,205 +74,135 @@ │ │ │ │ 61 │ │ │ │ 62// OpenMesh │ │ │ │ 63#include │ │ │ │ 64#include │ │ │ │ 65#include │ │ │ │ 66 │ │ │ │ 67 │ │ │ │ -68//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ +68//=== NAMESPACES │ │ │ │ +============================================================== │ │ │ │ 69 │ │ │ │ 70 │ │ │ │ 71namespace _O_p_e_n_M_e_s_h { │ │ │ │ 72namespace IO { │ │ │ │ 73 │ │ │ │ 74 │ │ │ │ -75//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ +75//=== EXPORTER │ │ │ │ +================================================================ │ │ │ │ 76 │ │ │ │ 77 │ │ │ │ -_8_3class OPENMESHDLLEXPORT _B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -84{ │ │ │ │ -85public: │ │ │ │ -86 │ │ │ │ -87 // base class needs virtual destructor │ │ │ │ -88 virtual _~_B_a_s_e_I_m_p_o_r_t_e_r() {} │ │ │ │ +_8_4class OPENMESHDLLEXPORT _B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ +85{ │ │ │ │ +86public: │ │ │ │ +87 │ │ │ │ +88 virtual _~_B_a_s_e_E_x_p_o_r_t_e_r() { } │ │ │ │ 89 │ │ │ │ 90 │ │ │ │ -91 // add a vertex with coordinate \c _point │ │ │ │ -92 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex(const _V_e_c_3_f& _point) = 0; │ │ │ │ -93 │ │ │ │ -94 // add a vertex with coordinate \c _point │ │ │ │ -95 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex(const _V_e_c_3_d& _point) { return add_vertex │ │ │ │ -(_V_e_c_3_f(_point)); } │ │ │ │ -96 │ │ │ │ -97 // add a vertex without coordinate. Use set_point to set the position │ │ │ │ -deferred │ │ │ │ -98 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex() = 0; │ │ │ │ -99 │ │ │ │ -100 // add an edge. Use set_next, set_vertex and set_face to set corresponding │ │ │ │ -entities for halfedges │ │ │ │ -101 virtual _H_a_l_f_e_d_g_e_H_a_n_d_l_e add_edge(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1) = 0; │ │ │ │ -102 │ │ │ │ -103 // add a face with indices _indices refering to vertices │ │ │ │ -104 typedef std::vector VHandles; │ │ │ │ -105 virtual _F_a_c_e_H_a_n_d_l_e add_face(const VHandles& _indices) = 0; │ │ │ │ -106 │ │ │ │ -107 // add a face with incident halfedge │ │ │ │ -108 virtual _F_a_c_e_H_a_n_d_l_e add_face(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) = 0; │ │ │ │ -109 │ │ │ │ -110 // add texture coordinates per face, _vh references the first texcoord │ │ │ │ -111 virtual void add_face_texcoords( _F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ -std::vector& _face_texcoords) = 0; │ │ │ │ -112 │ │ │ │ -113 // add texture 3d coordinates per face, _vh references the first texcoord │ │ │ │ -114 virtual void add_face_texcoords( _F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ -std::vector& _face_texcoords) = 0; │ │ │ │ -115 │ │ │ │ -116 // Set the texture index for a face │ │ │ │ -117 virtual void set_face_texindex( _F_a_c_e_H_a_n_d_l_e _fh, int _texId ) = 0; │ │ │ │ -118 │ │ │ │ -119 // Set coordinate of the given vertex. Use this function, if you created a │ │ │ │ -vertex without coordinate │ │ │ │ -120 virtual void set_point(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _point) = 0; │ │ │ │ -121 │ │ │ │ -122 // Set outgoing halfedge for the given vertex. │ │ │ │ -123 virtual void set_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) = 0; │ │ │ │ -124 │ │ │ │ -125 // set vertex normal │ │ │ │ -126 virtual void set_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _normal) = 0; │ │ │ │ -127 │ │ │ │ -128 // set vertex normal │ │ │ │ -129 virtual void set_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_d& _normal) = 0; │ │ │ │ -130 │ │ │ │ -131 // set vertex color │ │ │ │ -132 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_u_c& _color) = 0; │ │ │ │ +91 // get vertex data │ │ │ │ +92 virtual _V_e_c_3_f point(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +93 virtual _V_e_c_3_d pointd(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +94 virtual bool is_point_double() const = 0; │ │ │ │ +95 virtual _V_e_c_3_f normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +96 virtual _V_e_c_3_d normald(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +97 virtual bool is_normal_double() const = 0; │ │ │ │ +98 virtual _V_e_c_3_u_c color(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +99 virtual _V_e_c_4_u_c colorA(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +100 virtual _V_e_c_3_u_i colori(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +101 virtual _V_e_c_4_u_i colorAi(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +102 virtual _V_e_c_3_f colorf(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +103 virtual _V_e_c_4_f colorAf(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +104 virtual _V_e_c_2_f texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +105 virtual _V_e_c_2_f texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const = 0; │ │ │ │ +106 virtual _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const = │ │ │ │ +0; │ │ │ │ +107 │ │ │ │ +108 │ │ │ │ +109 // get face data │ │ │ │ +110 virtual unsigned int │ │ │ │ +111 get_vhandles(_F_a_c_e_H_a_n_d_l_e _fh, │ │ │ │ +112 std::vector& _vhandles) const=0; │ │ │ │ +113 │ │ │ │ +_1_2_1 virtual _H_a_l_f_e_d_g_e_H_a_n_d_l_e _g_e_t_H_e_h(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) const = 0; │ │ │ │ +122 virtual unsigned int │ │ │ │ +123 get_face_texcoords(std::vector& _hehandles) const = 0; │ │ │ │ +124 virtual _V_e_c_3_f normal(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +125 virtual _V_e_c_3_d normald(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +126 virtual _V_e_c_3_u_c color (_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +127 virtual _V_e_c_4_u_c colorA(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +128 virtual _V_e_c_3_u_i colori(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +129 virtual _V_e_c_4_u_i colorAi(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +130 virtual _V_e_c_3_f colorf(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +131 virtual _V_e_c_4_f colorAf(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ +132 virtual _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_F_a_c_e_H_a_n_d_l_e _fh) const = 0; │ │ │ │ 133 │ │ │ │ -134 // set vertex color │ │ │ │ -135 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_4_u_c& _color) = 0; │ │ │ │ -136 │ │ │ │ -137 // set vertex color │ │ │ │ -138 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _color) = 0; │ │ │ │ -139 │ │ │ │ -140 // set vertex color │ │ │ │ -141 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_4_f& _color) = 0; │ │ │ │ +134 // get edge data │ │ │ │ +135 virtual _V_e_c_3_u_c color(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ +136 virtual _V_e_c_4_u_c colorA(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ +137 virtual _V_e_c_3_u_i colori(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ +138 virtual _V_e_c_4_u_i colorAi(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ +139 virtual _V_e_c_3_f colorf(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ +140 virtual _V_e_c_4_f colorAf(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ +141 virtual _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_E_d_g_e_H_a_n_d_l_e _eh) const = 0; │ │ │ │ 142 │ │ │ │ -143 // set vertex texture coordinate │ │ │ │ -144 virtual void set_texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_2_f& _texcoord) = 0; │ │ │ │ -145 │ │ │ │ -146 // set vertex status │ │ │ │ -147 virtual void set_status(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) = 0; │ │ │ │ -148 │ │ │ │ -149 // set next halfedge handle │ │ │ │ -150 virtual void set_next(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _next) = 0; │ │ │ │ -151 │ │ │ │ -152 // set incident face handle for given halfedge │ │ │ │ -153 virtual void set_face(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _F_a_c_e_H_a_n_d_l_e _fh) = 0; │ │ │ │ +143 // get halfedge data │ │ │ │ +144 virtual int get_halfedge_id(_V_e_r_t_e_x_H_a_n_d_l_e _vh) = 0; │ │ │ │ +145 virtual int get_halfedge_id(_F_a_c_e_H_a_n_d_l_e _vh) = 0; │ │ │ │ +146 virtual int get_next_halfedge_id(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) = 0; │ │ │ │ +147 virtual int get_to_vertex_id(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) = 0; │ │ │ │ +148 virtual int get_face_id(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) = 0; │ │ │ │ +149 virtual _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ += 0; │ │ │ │ +150 │ │ │ │ +151 // get reference to base kernel │ │ │ │ +152 virtual const _B_a_s_e_K_e_r_n_e_l* kernel() { return nullptr; } │ │ │ │ +153 │ │ │ │ 154 │ │ │ │ -155 // request texture coordinate property │ │ │ │ -156 virtual void request_face_texcoords2D() = 0; │ │ │ │ -157 │ │ │ │ -158 // set vertex texture coordinate │ │ │ │ -159 virtual void set_texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _V_e_c_2_f& _texcoord) = 0; │ │ │ │ +155 // query number of faces, vertices, normals, texcoords │ │ │ │ +156 virtual size_t n_vertices() const = 0; │ │ │ │ +157 virtual size_t n_faces() const = 0; │ │ │ │ +158 virtual size_t n_edges() const = 0; │ │ │ │ +159 │ │ │ │ 160 │ │ │ │ -161 // set 3d vertex texture coordinate │ │ │ │ -162 virtual void set_texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _texcoord) = 0; │ │ │ │ -163 │ │ │ │ -164 // set 3d vertex texture coordinate │ │ │ │ -165 virtual void set_texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _V_e_c_3_f& _texcoord) = 0; │ │ │ │ -166 │ │ │ │ -167 // set halfedge status │ │ │ │ -168 virtual void set_status(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) = 0; │ │ │ │ -169 │ │ │ │ -170 // set edge color │ │ │ │ -171 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_3_u_c& _color) = 0; │ │ │ │ -172 │ │ │ │ -173 // set edge color │ │ │ │ -174 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_4_u_c& _color) = 0; │ │ │ │ +161 // property information │ │ │ │ +162 virtual bool is_triangle_mesh() const { return false; } │ │ │ │ +163 virtual bool has_vertex_normals() const { return false; } │ │ │ │ +164 virtual bool has_vertex_colors() const { return false; } │ │ │ │ +165 virtual bool has_vertex_status() const { return false; } │ │ │ │ +166 virtual bool has_vertex_texcoords() const { return false; } │ │ │ │ +167 virtual bool has_edge_colors() const { return false; } │ │ │ │ +168 virtual bool has_edge_status() const { return false; } │ │ │ │ +169 virtual bool has_halfedge_status() const { return false; } │ │ │ │ +170 virtual bool has_face_normals() const { return false; } │ │ │ │ +171 virtual bool has_face_colors() const { return false; } │ │ │ │ +172 virtual bool has_face_status() const { return false; } │ │ │ │ +173}; │ │ │ │ +174 │ │ │ │ 175 │ │ │ │ -176 // set edge color │ │ │ │ -177 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_3_f& _color) = 0; │ │ │ │ -178 │ │ │ │ -179 // set edge color │ │ │ │ -180 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_4_f& _color) = 0; │ │ │ │ -181 │ │ │ │ -182 // set edge status │ │ │ │ -183 virtual void set_status(_E_d_g_e_H_a_n_d_l_e _eh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) = 0; │ │ │ │ -184 │ │ │ │ -185 // set face normal │ │ │ │ -186 virtual void set_normal(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_f& _normal) = 0; │ │ │ │ -187 │ │ │ │ -188 // set face normal │ │ │ │ -189 virtual void set_normal(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_d& _normal) = 0; │ │ │ │ -190 │ │ │ │ -191 // set face color │ │ │ │ -192 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_u_c& _color) = 0; │ │ │ │ -193 │ │ │ │ -194 // set face color │ │ │ │ -195 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_4_u_c& _color) = 0; │ │ │ │ -196 │ │ │ │ -197 // set face color │ │ │ │ -198 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_f& _color) = 0; │ │ │ │ -199 │ │ │ │ -200 // set face color │ │ │ │ -201 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_4_f& _color) = 0; │ │ │ │ -202 │ │ │ │ -203 // set face status │ │ │ │ -204 virtual void set_status(_F_a_c_e_H_a_n_d_l_e _fh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) = 0; │ │ │ │ -205 │ │ │ │ -206 // Store a property in the mesh mapping from an int to a texture file │ │ │ │ -207 // Use set_face_texindex to set the index for each face │ │ │ │ -208 virtual void add_texture_information( int _id , std::string _name ) = 0; │ │ │ │ -209 │ │ │ │ -210 // get reference to base kernel │ │ │ │ -211 virtual _B_a_s_e_K_e_r_n_e_l* kernel() { return nullptr; } │ │ │ │ -212 │ │ │ │ -213 virtual bool is_triangle_mesh() const { return false; } │ │ │ │ -214 │ │ │ │ -215 // reserve mem for elements │ │ │ │ -216 virtual void reserve( unsigned int /* nV */, │ │ │ │ -217 unsigned int /* nE */, │ │ │ │ -218 unsigned int /* nF */) {} │ │ │ │ -219 │ │ │ │ -220 // query number of faces, vertices, normals, texcoords │ │ │ │ -221 virtual size_t n_vertices() const = 0; │ │ │ │ -222 virtual size_t n_faces() const = 0; │ │ │ │ -223 virtual size_t n_edges() const = 0; │ │ │ │ -224 │ │ │ │ -225 │ │ │ │ -226 // pre-processing │ │ │ │ -227 virtual void prepare() {} │ │ │ │ -228 │ │ │ │ -229 // post-processing │ │ │ │ -230 virtual void finish() {} │ │ │ │ -231}; │ │ │ │ -232 │ │ │ │ -233 │ │ │ │ -234// │ │ │ │ +176// │ │ │ │ ============================================================================= │ │ │ │ -235} // namespace IO │ │ │ │ -236} // namespace OpenMesh │ │ │ │ -237// │ │ │ │ +177} // namespace IO │ │ │ │ +178} // namespace OpenMesh │ │ │ │ +179// │ │ │ │ ============================================================================= │ │ │ │ -238#endif │ │ │ │ -239// │ │ │ │ +180#endif │ │ │ │ +181// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ _V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _4_ _> │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ +Base class for exporter modules. │ │ │ │ +DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r_:_:_g_e_t_H_e_h │ │ │ │ +virtual HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const =0 │ │ │ │ +getHeh returns the HalfEdgeHandle that belongs to the face specified by _fh and │ │ │ │ +has a toVertexHandle ... │ │ │ │ _O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l │ │ │ │ This class provides low-level property management like adding/removing │ │ │ │ properties and access to prope... │ │ │ │ DDeeffiinniittiioonn BaseKernel.hh:98 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Handle for a vertex entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:121 │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00302_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: Unittests/unittests_common.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Decimater/CollapseInfoT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,106 +92,156 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
unittests_common.hh
│ │ │ +
CollapseInfoT.hh
│ │ │
│ │ │
│ │ │ -
1#ifndef INCLUDE_UNITTESTS_COMMON_HH
│ │ │ -
2#define INCLUDE_UNITTESTS_COMMON_HH
│ │ │ -
3
│ │ │ -
4#include <gtest/gtest.h>
│ │ │ -
5
│ │ │ -
6#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ -
7#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
│ │ │ -
8
│ │ │ -
9#include <OpenMesh/Core/IO/MeshIO.hh>
│ │ │ -
10
│ │ │ -
11#ifdef TEST_CUSTOM_TRAITS
│ │ │ -
12#include <Unittests/unittests_common_customtraits.hh>
│ │ │ -
13#elif defined(TEST_DOUBLE_TRAITS)
│ │ │ - │ │ │ -
15};
│ │ │ -
16#else
│ │ │ -
│ │ │ - │ │ │ -
18};
│ │ │ -
│ │ │ -
19#endif
│ │ │ -
20
│ │ │ -
21
│ │ │ - │ │ │ -
23
│ │ │ - │ │ │ -
25
│ │ │ -
26/*
│ │ │ -
27 * Simple test setting.
│ │ │ -
28 */
│ │ │ -
29
│ │ │ -
│ │ │ -
30class OpenMeshBase : public testing::Test {
│ │ │ -
31
│ │ │ -
32 protected:
│ │ │ -
33
│ │ │ -
34 // This function is called before each test is run
│ │ │ -
35 virtual void SetUp() {
│ │ │ -
36
│ │ │ -
37 // Do some initial stuff with the member data here...
│ │ │ -
38 }
│ │ │ -
39
│ │ │ -
40 // This function is called after all tests are through
│ │ │ -
41 virtual void TearDown() {
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │ +
2 * *
│ │ │ +
3 * OpenMesh *
│ │ │ +
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
5 * Department of Computer Graphics and Multimedia *
│ │ │ +
6 * All rights reserved. *
│ │ │ +
7 * www.openmesh.org *
│ │ │ +
8 * *
│ │ │ +
9 *---------------------------------------------------------------------------*
│ │ │ +
10 * This file is part of OpenMesh. *
│ │ │ +
11 *---------------------------------------------------------------------------*
│ │ │ +
12 * *
│ │ │ +
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ +
14 * modification, are permitted provided that the following conditions *
│ │ │ +
15 * are met: *
│ │ │ +
16 * *
│ │ │ +
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ +
18 * this list of conditions and the following disclaimer. *
│ │ │ +
19 * *
│ │ │ +
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ +
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ +
22 * documentation and/or other materials provided with the distribution. *
│ │ │ +
23 * *
│ │ │ +
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ +
25 * contributors may be used to endorse or promote products derived from *
│ │ │ +
26 * this software without specific prior written permission. *
│ │ │ +
27 * *
│ │ │ +
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ +
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ +
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ +
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ +
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ +
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ +
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ +
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ +
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ +
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ +
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ +
39 * *
│ │ │ +
40 * ========================================================================= */
│ │ │ +
41
│ │ │
42
│ │ │ -
43 // Do some final stuff with the member data here...
│ │ │ -
44 }
│ │ │ -
45
│ │ │ -
46 // This member will be accessible in all tests
│ │ │ -
47 Mesh mesh_;
│ │ │ -
48};
│ │ │ -
│ │ │ -
49
│ │ │ -
50/*
│ │ │ -
51 * Simple test setting.
│ │ │ -
52 */
│ │ │ -
53
│ │ │ -
│ │ │ -
54class OpenMeshBasePoly : public testing::Test {
│ │ │ +
48//=============================================================================
│ │ │ +
49//
│ │ │ +
50// STRUCT CollpaseInfoT
│ │ │ +
51//
│ │ │ +
52//=============================================================================
│ │ │ +
53#ifndef OPENMESH_DECIMATER_COLLAPSEINFOT_HH
│ │ │ +
54#define OPENMESH_DECIMATER_COLLAPSEINFOT_HH
│ │ │
55
│ │ │ -
56 protected:
│ │ │ +
56//== INCLUDES =================================================================
│ │ │
57
│ │ │ -
58 // This function is called before each test is run
│ │ │ -
59 virtual void SetUp() {
│ │ │ -
60
│ │ │ -
61 // Do some initial stuff with the member data here...
│ │ │ -
62 }
│ │ │ -
63
│ │ │ -
64 // This function is called after all tests are through
│ │ │ -
65 virtual void TearDown() {
│ │ │ -
66
│ │ │ -
67 // Do some final stuff with the member data here...
│ │ │ -
68 }
│ │ │ -
69
│ │ │ -
70 // This member will be accessible in all tests
│ │ │ -
71 PolyMesh mesh_;
│ │ │ -
72};
│ │ │ -
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75
│ │ │ -
76#endif // INCLUDE GUARD
│ │ │ -
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Base class for all traits.
Definition Traits.hh:122
│ │ │ -
Version of Default Traits that uses double precision for points and normals as well as floating point...
Definition Traits.hh:164
│ │ │ -
Definition unittests_common.hh:17
│ │ │ -
Definition unittests_common.hh:30
│ │ │ -
Definition unittests_common.hh:54
│ │ │ +
58//== NAMESPACE ================================================================
│ │ │ +
59
│ │ │ +
60namespace OpenMesh {
│ │ │ +
61namespace Decimater {
│ │ │ +
62
│ │ │ +
63//== CLASS DEFINITION =========================================================
│ │ │ +
64
│ │ │ +
73template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
75 public:
│ │ │ +
76 CollapseInfoT(Mesh& _mesh, typename Mesh::HalfedgeHandle _heh);
│ │ │ +
77
│ │ │ +
78 Mesh& mesh;
│ │ │ +
79
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
84 typename Mesh::Point p0;
│ │ │ +
85 typename Mesh::Point p1;
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
91
│ │ │ +
94 typename Mesh::HalfedgeHandle vlv1, v0vl, vrv0, v1vr;
│ │ │ +
96};
│ │ │ +
│ │ │ +
97
│ │ │ +
98//-----------------------------------------------------------------------------
│ │ │ +
99
│ │ │ +
126template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
128 typename Mesh::HalfedgeHandle _heh) :
│ │ │ +
129 mesh(_mesh), v0v1(_heh), v1v0(_mesh.opposite_halfedge_handle(v0v1)), v0(
│ │ │ +
130 _mesh.to_vertex_handle(v1v0)), v1(_mesh.to_vertex_handle(v0v1)), p0(
│ │ │ +
131 _mesh.point(v0)), p1(_mesh.point(v1)), fl(_mesh.face_handle(v0v1)), fr(
│ │ │ +
132 _mesh.face_handle(v1v0))
│ │ │ +
133
│ │ │ +
134{
│ │ │ +
135 // get vl
│ │ │ +
136 if (fl.is_valid()) {
│ │ │ +
137 vlv1 = mesh.next_halfedge_handle(v0v1);
│ │ │ +
138 v0vl = mesh.next_halfedge_handle(vlv1);
│ │ │ +
139 vl = mesh.to_vertex_handle(vlv1);
│ │ │ +
140 vlv1 = mesh.opposite_halfedge_handle(vlv1);
│ │ │ +
141 v0vl = mesh.opposite_halfedge_handle(v0vl);
│ │ │ +
142 }
│ │ │ +
143
│ │ │ +
144 // get vr
│ │ │ +
145 if (fr.is_valid()) {
│ │ │ +
146 vrv0 = mesh.next_halfedge_handle(v1v0);
│ │ │ +
147 v1vr = mesh.next_halfedge_handle(vrv0);
│ │ │ +
148 vr = mesh.to_vertex_handle(vrv0);
│ │ │ +
149 vrv0 = mesh.opposite_halfedge_handle(vrv0);
│ │ │ +
150 v1vr = mesh.opposite_halfedge_handle(v1vr);
│ │ │ +
151 }
│ │ │ +
152}
│ │ │ +
│ │ │ +
153
│ │ │ +
154//=============================================================================
│ │ │ +
155}// END_NS_DECIMATER
│ │ │ +
156} // END_NS_OPENMESH
│ │ │ +
157//=============================================================================
│ │ │ +
158#endif // OPENMESH_DECIMATER_COLLAPSEINFOT_HH defined
│ │ │ +
159//=============================================================================
│ │ │ +
160
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
Stores information about a halfedge collapse.
Definition CollapseInfoT.hh:74
│ │ │ +
Mesh::HalfedgeHandle vlv1
Outer remaining halfedge of diamond spanned by v0, v1, vl, and vr.
Definition CollapseInfoT.hh:94
│ │ │ +
Mesh::FaceHandle fr
Right face.
Definition CollapseInfoT.hh:87
│ │ │ +
CollapseInfoT(Mesh &_mesh, typename Mesh::HalfedgeHandle _heh)
Initializing constructor.
Definition CollapseInfoT.hh:127
│ │ │ +
Mesh::VertexHandle vl
Left vertex.
Definition CollapseInfoT.hh:88
│ │ │ +
Mesh::Point p0
Position of removed vertex.
Definition CollapseInfoT.hh:84
│ │ │ +
Mesh::HalfedgeHandle v0v1
Halfedge to be collapsed.
Definition CollapseInfoT.hh:80
│ │ │ +
Mesh::HalfedgeHandle v1v0
Reverse halfedge.
Definition CollapseInfoT.hh:81
│ │ │ +
Mesh::VertexHandle v1
Remaining vertex.
Definition CollapseInfoT.hh:83
│ │ │ +
Mesh::Point p1
Positions of remaining vertex.
Definition CollapseInfoT.hh:85
│ │ │ +
Mesh::VertexHandle v0
Vertex to be removed.
Definition CollapseInfoT.hh:82
│ │ │ +
Mesh::FaceHandle fl
Left face.
Definition CollapseInfoT.hh:86
│ │ │ +
Mesh::VertexHandle vr
Right vertex.
Definition CollapseInfoT.hh:89
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,103 +1,211 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -unittests_common.hh │ │ │ │ -1#ifndef INCLUDE_UNITTESTS_COMMON_HH │ │ │ │ -2#define INCLUDE_UNITTESTS_COMMON_HH │ │ │ │ -3 │ │ │ │ -4#include │ │ │ │ -5 │ │ │ │ -6#include │ │ │ │ -7#include │ │ │ │ -8 │ │ │ │ -9#include │ │ │ │ -10 │ │ │ │ -11#ifdef TEST_CUSTOM_TRAITS │ │ │ │ -12#include │ │ │ │ -13#elif defined(TEST_DOUBLE_TRAITS) │ │ │ │ -14struct _C_u_s_t_o_m_T_r_a_i_t_s : public _O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s_D_o_u_b_l_e { │ │ │ │ -15}; │ │ │ │ -16#else │ │ │ │ -_1_7struct _C_u_s_t_o_m_T_r_a_i_t_s : public _O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s { │ │ │ │ -18}; │ │ │ │ -19#endif │ │ │ │ -20 │ │ │ │ -21 │ │ │ │ -22typedef _O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T_<_C_u_s_t_o_m_T_r_a_i_t_s_> Mesh; │ │ │ │ -23 │ │ │ │ -24typedef _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T_<_C_u_s_t_o_m_T_r_a_i_t_s_> PolyMesh; │ │ │ │ -25 │ │ │ │ -26/* │ │ │ │ -27 * Simple test setting. │ │ │ │ -28 */ │ │ │ │ -29 │ │ │ │ -_3_0class _O_p_e_n_M_e_s_h_B_a_s_e : public testing::Test { │ │ │ │ -31 │ │ │ │ -32 protected: │ │ │ │ -33 │ │ │ │ -34 // This function is called before each test is run │ │ │ │ -35 virtual void SetUp() { │ │ │ │ -36 │ │ │ │ -37 // Do some initial stuff with the member data here... │ │ │ │ -38 } │ │ │ │ -39 │ │ │ │ -40 // This function is called after all tests are through │ │ │ │ -41 virtual void TearDown() { │ │ │ │ +CollapseInfoT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ +1/* ========================================================================= * │ │ │ │ +2 * * │ │ │ │ +3 * OpenMesh * │ │ │ │ +4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +5 * Department of Computer Graphics and Multimedia * │ │ │ │ +6 * All rights reserved. * │ │ │ │ +7 * www.openmesh.org * │ │ │ │ +8 * * │ │ │ │ +9 *---------------------------------------------------------------------------* │ │ │ │ +10 * This file is part of OpenMesh. * │ │ │ │ +11 *--------------------------------------------------------------------------- │ │ │ │ +* │ │ │ │ +12 * * │ │ │ │ +13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ +14 * modification, are permitted provided that the following conditions * │ │ │ │ +15 * are met: * │ │ │ │ +16 * * │ │ │ │ +17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ +* │ │ │ │ +18 * this list of conditions and the following disclaimer. * │ │ │ │ +19 * * │ │ │ │ +20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ +21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ +22 * documentation and/or other materials provided with the distribution. * │ │ │ │ +23 * * │ │ │ │ +24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ +25 * contributors may be used to endorse or promote products derived from * │ │ │ │ +26 * this software without specific prior written permission. * │ │ │ │ +27 * * │ │ │ │ +28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ +29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ +* │ │ │ │ +30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ +31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ +* │ │ │ │ +32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ +33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ +34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ +35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ +36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ +37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ +38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ +39 * * │ │ │ │ +40 * ========================================================================= │ │ │ │ +*/ │ │ │ │ +41 │ │ │ │ 42 │ │ │ │ -43 // Do some final stuff with the member data here... │ │ │ │ -44 } │ │ │ │ -45 │ │ │ │ -46 // This member will be accessible in all tests │ │ │ │ -47 _M_e_s_h mesh_; │ │ │ │ -48}; │ │ │ │ -49 │ │ │ │ -50/* │ │ │ │ -51 * Simple test setting. │ │ │ │ -52 */ │ │ │ │ -53 │ │ │ │ -_5_4class _O_p_e_n_M_e_s_h_B_a_s_e_P_o_l_y : public testing::Test { │ │ │ │ +48// │ │ │ │ +============================================================================= │ │ │ │ +49// │ │ │ │ +50// STRUCT CollpaseInfoT │ │ │ │ +51// │ │ │ │ +52// │ │ │ │ +============================================================================= │ │ │ │ +53#ifndef OPENMESH_DECIMATER_COLLAPSEINFOT_HH │ │ │ │ +54#define OPENMESH_DECIMATER_COLLAPSEINFOT_HH │ │ │ │ 55 │ │ │ │ -56 protected: │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 57 │ │ │ │ -58 // This function is called before each test is run │ │ │ │ -59 virtual void SetUp() { │ │ │ │ -60 │ │ │ │ -61 // Do some initial stuff with the member data here... │ │ │ │ -62 } │ │ │ │ -63 │ │ │ │ -64 // This function is called after all tests are through │ │ │ │ -65 virtual void TearDown() { │ │ │ │ -66 │ │ │ │ -67 // Do some final stuff with the member data here... │ │ │ │ -68 } │ │ │ │ -69 │ │ │ │ -70 // This member will be accessible in all tests │ │ │ │ -71 _P_o_l_y_M_e_s_h mesh_; │ │ │ │ -72}; │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -75 │ │ │ │ -76#endif // INCLUDE GUARD │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Triangle mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s │ │ │ │ -Base class for all traits. │ │ │ │ -DDeeffiinniittiioonn Traits.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s_D_o_u_b_l_e │ │ │ │ -Version of Default Traits that uses double precision for points and normals as │ │ │ │ -well as floating point... │ │ │ │ -DDeeffiinniittiioonn Traits.hh:164 │ │ │ │ -_C_u_s_t_o_m_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn unittests_common.hh:17 │ │ │ │ -_O_p_e_n_M_e_s_h_B_a_s_e │ │ │ │ -DDeeffiinniittiioonn unittests_common.hh:30 │ │ │ │ -_O_p_e_n_M_e_s_h_B_a_s_e_P_o_l_y │ │ │ │ -DDeeffiinniittiioonn unittests_common.hh:54 │ │ │ │ +58//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ +59 │ │ │ │ +60namespace _O_p_e_n_M_e_s_h { │ │ │ │ +61namespace Decimater { │ │ │ │ +62 │ │ │ │ +63//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +64 │ │ │ │ +73template │ │ │ │ +_7_4struct _C_o_l_l_a_p_s_e_I_n_f_o_T { │ │ │ │ +75 public: │ │ │ │ +76 _C_o_l_l_a_p_s_e_I_n_f_o_T(Mesh& _mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +77 │ │ │ │ +78 Mesh& mesh; │ │ │ │ +79 │ │ │ │ +_8_0 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _v_0_v_1; │ │ │ │ +_8_1 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _v_1_v_0; │ │ │ │ +_8_2 typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _v_0; │ │ │ │ +_8_3 typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _v_1; │ │ │ │ +_8_4 typename _M_e_s_h_:_:_P_o_i_n_t _p_0; │ │ │ │ +_8_5 typename _M_e_s_h_:_:_P_o_i_n_t _p_1; │ │ │ │ +_8_6 typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _f_l; │ │ │ │ +_8_7 typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _f_r; │ │ │ │ +_8_8 typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _v_l; │ │ │ │ +_8_9 typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _v_r; │ │ │ │ +91 │ │ │ │ +_9_4 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _v_l_v_1, v0vl, vrv0, v1vr; │ │ │ │ +96}; │ │ │ │ +97 │ │ │ │ +98//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +99 │ │ │ │ +126template │ │ │ │ +_1_2_7inline _C_o_l_l_a_p_s_e_I_n_f_o_T_<_M_e_s_h_>_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T(Mesh& _mesh, │ │ │ │ +128 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) : │ │ │ │ +129 mesh(_mesh), v0v1(_heh), v1v0(_mesh.opposite_halfedge_handle(v0v1)), v0( │ │ │ │ +130 _mesh.to_vertex_handle(v1v0)), v1(_mesh.to_vertex_handle(v0v1)), p0( │ │ │ │ +131 _mesh.point(v0)), p1(_mesh.point(v1)), fl(_mesh.face_handle(v0v1)), fr( │ │ │ │ +132 _mesh.face_handle(v1v0)) │ │ │ │ +133 │ │ │ │ +134{ │ │ │ │ +135 // get vl │ │ │ │ +136 if (_f_l.is_valid()) { │ │ │ │ +137 _v_l_v_1 = mesh.next_halfedge_handle(_v_0_v_1); │ │ │ │ +138 v0vl = mesh.next_halfedge_handle(_v_l_v_1); │ │ │ │ +139 _v_l = mesh.to_vertex_handle(_v_l_v_1); │ │ │ │ +140 _v_l_v_1 = mesh.opposite_halfedge_handle(_v_l_v_1); │ │ │ │ +141 v0vl = mesh.opposite_halfedge_handle(v0vl); │ │ │ │ +142 } │ │ │ │ +143 │ │ │ │ +144 // get vr │ │ │ │ +145 if (_f_r.is_valid()) { │ │ │ │ +146 vrv0 = mesh.next_halfedge_handle(_v_1_v_0); │ │ │ │ +147 v1vr = mesh.next_halfedge_handle(vrv0); │ │ │ │ +148 _v_r = mesh.to_vertex_handle(vrv0); │ │ │ │ +149 vrv0 = mesh.opposite_halfedge_handle(vrv0); │ │ │ │ +150 v1vr = mesh.opposite_halfedge_handle(v1vr); │ │ │ │ +151 } │ │ │ │ +152} │ │ │ │ +153 │ │ │ │ +154// │ │ │ │ +============================================================================= │ │ │ │ +155}// END_NS_DECIMATER │ │ │ │ +156} // END_NS_OPENMESH │ │ │ │ +157// │ │ │ │ +============================================================================= │ │ │ │ +158#endif // OPENMESH_DECIMATER_COLLAPSEINFOT_HH defined │ │ │ │ +159// │ │ │ │ +============================================================================= │ │ │ │ +160 │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T │ │ │ │ +Stores information about a halfedge collapse. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_l_v_1 │ │ │ │ +Mesh::HalfedgeHandle vlv1 │ │ │ │ +Outer remaining halfedge of diamond spanned by v0, v1, vl, and vr. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_f_r │ │ │ │ +Mesh::FaceHandle fr │ │ │ │ +Right face. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:87 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T │ │ │ │ +CollapseInfoT(Mesh &_mesh, typename Mesh::HalfedgeHandle _heh) │ │ │ │ +Initializing constructor. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:127 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_l │ │ │ │ +Mesh::VertexHandle vl │ │ │ │ +Left vertex. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:88 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_p_0 │ │ │ │ +Mesh::Point p0 │ │ │ │ +Position of removed vertex. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:84 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_0_v_1 │ │ │ │ +Mesh::HalfedgeHandle v0v1 │ │ │ │ +Halfedge to be collapsed. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:80 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_1_v_0 │ │ │ │ +Mesh::HalfedgeHandle v1v0 │ │ │ │ +Reverse halfedge. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_1 │ │ │ │ +Mesh::VertexHandle v1 │ │ │ │ +Remaining vertex. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:83 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_p_1 │ │ │ │ +Mesh::Point p1 │ │ │ │ +Positions of remaining vertex. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:85 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_0 │ │ │ │ +Mesh::VertexHandle v0 │ │ │ │ +Vertex to be removed. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:82 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_f_l │ │ │ │ +Mesh::FaceHandle fl │ │ │ │ +Left face. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:86 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_D_e_c_i_m_a_t_e_r_:_:_C_o_l_l_a_p_s_e_I_n_f_o_T_:_:_v_r │ │ │ │ +Mesh::VertexHandle vr │ │ │ │ +Right vertex. │ │ │ │ +DDeeffiinniittiioonn CollapseInfoT.hh:89 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00380_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: Unittests/unittests_common_customtraits.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/HoleFiller/HoleFillerT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,164 +92,225 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
unittests_common_customtraits.hh
│ │ │ +
HoleFillerT.hh
│ │ │
│ │ │
│ │ │ -
1#ifndef UNITTESTS_COMMON_DUMMYTRAITS
│ │ │ -
2#define UNITTESTS_COMMON_DUMMYTRAITS
│ │ │ -
3#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ -
4#include <OpenMesh/Core/Utils/color_cast.hh>
│ │ │ -
5#include <array>
│ │ │ -
6
│ │ │ -
7namespace Custom {
│ │ │ -
8
│ │ │ -
│ │ │ -
11template <int DIM> class Vec {
│ │ │ -
12 public:
│ │ │ -
13 // Constructor with DIM components
│ │ │ -
14 Vec(float x) : data({ x }) {}
│ │ │ -
15 Vec(float x, float y) : data({ x, y }) {}
│ │ │ -
16 Vec(float x, float y, float z) : data({{ x, y, z }}) {}
│ │ │ -
17 Vec(float x, float y, float z, float w) : data({ x, y, z, w }) {}
│ │ │ -
18
│ │ │ -
19 Vec() = default;
│ │ │ -
20
│ │ │ -
21 float &operator[](int i) { return data[i]; }
│ │ │ -
22 float operator[](int i) const { return data[i]; }
│ │ │ -
23
│ │ │ -
24 private:
│ │ │ -
25 std::array<float, DIM> data;
│ │ │ -
26};
│ │ │ -
│ │ │ -
27
│ │ │ -
28template <int DIM> bool operator==(Vec<DIM> const &lhs, Vec<DIM> const &rhs) {
│ │ │ -
29 for (int i = 0; i < DIM; i++)
│ │ │ -
30 if (lhs[i] != rhs[i]) return false;
│ │ │ -
31 return true;
│ │ │ -
32}
│ │ │ -
33
│ │ │ -
34template <int DIM>
│ │ │ -
35Vec<DIM> operator+(Vec<DIM> const &lhs, Vec<DIM> const &rhs) {
│ │ │ -
36 Vec<DIM> result;
│ │ │ -
37 for (int i = 0; i < DIM; i++)
│ │ │ -
38 result[i] = lhs[i] + rhs[i];
│ │ │ -
39 return result;
│ │ │ -
40}
│ │ │ +
1/* ========================================================================= *
│ │ │ +
2 * *
│ │ │ +
3 * OpenMesh *
│ │ │ +
4 * Copyright (c) 2001-2023, RWTH-Aachen University *
│ │ │ +
5 * Department of Computer Graphics and Multimedia *
│ │ │ +
6 * All rights reserved. *
│ │ │ +
7 * www.openmesh.org *
│ │ │ +
8 * *
│ │ │ +
9 *---------------------------------------------------------------------------*
│ │ │ +
10 * This file is part of OpenMesh. *
│ │ │ +
11 *---------------------------------------------------------------------------*
│ │ │ +
12 * *
│ │ │ +
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ +
14 * modification, are permitted provided that the following conditions *
│ │ │ +
15 * are met: *
│ │ │ +
16 * *
│ │ │ +
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ +
18 * this list of conditions and the following disclaimer. *
│ │ │ +
19 * *
│ │ │ +
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ +
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ +
22 * documentation and/or other materials provided with the distribution. *
│ │ │ +
23 * *
│ │ │ +
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ +
25 * contributors may be used to endorse or promote products derived from *
│ │ │ +
26 * this software without specific prior written permission. *
│ │ │ +
27 * *
│ │ │ +
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ +
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ +
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ +
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ +
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ +
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ +
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ +
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ +
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ +
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ +
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ +
39 * *
│ │ │ +
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42template <int DIM>
│ │ │ -
43Vec<DIM> operator-(Vec<DIM> const &lhs, Vec<DIM> const &rhs) {
│ │ │ -
44 Vec<DIM> result;
│ │ │ -
45 for (int i = 0; i < DIM; i++)
│ │ │ -
46 result[i] = lhs[i] - rhs[i];
│ │ │ -
47 return result;
│ │ │ -
48}
│ │ │ -
49
│ │ │ -
50template <int DIM> Vec<DIM> operator*(Vec<DIM> const &lhs, float rhs) {
│ │ │ -
51 Vec<DIM> result;
│ │ │ -
52 for (int i = 0; i < DIM; i++)
│ │ │ -
53 result[i] = lhs[i] * rhs;
│ │ │ -
54 return result;
│ │ │ -
55}
│ │ │ -
56
│ │ │ -
57template <int DIM> Vec<DIM> operator*(float lhs, Vec<DIM> const &rhs) {
│ │ │ -
58 return rhs * lhs;
│ │ │ -
59}
│ │ │ -
60
│ │ │ -
61template <int DIM> Vec<DIM> operator/(Vec<DIM> const &lhs, float rhs) {
│ │ │ -
62 Vec<DIM> result;
│ │ │ -
63 for (int i = 0; i < DIM; i++)
│ │ │ -
64 result[i] = lhs[i] / rhs;
│ │ │ -
65 return result;
│ │ │ -
66}
│ │ │ -
67
│ │ │ -
68template <int DIM> Vec<DIM> &operator+=(Vec<DIM> &lhs, Vec<DIM> const &rhs) {
│ │ │ -
69 return lhs = lhs + rhs;
│ │ │ -
70}
│ │ │ -
71template <int DIM> Vec<DIM> &operator-=(Vec<DIM> &lhs, Vec<DIM> const &rhs) {
│ │ │ -
72 return lhs = lhs - rhs;
│ │ │ -
73}
│ │ │ -
74template <int DIM> Vec<DIM> &operator*=(Vec<DIM> &lhs, float rhs) {
│ │ │ -
75 return lhs = lhs * rhs;
│ │ │ -
76}
│ │ │ -
77template <int DIM> Vec<DIM> &operator/=(Vec<DIM> &lhs, float rhs) {
│ │ │ -
78 return lhs = lhs / rhs;
│ │ │ -
79}
│ │ │ +
42#pragma once
│ │ │ +
43
│ │ │ +
44#include <vector>
│ │ │ +
45#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
46
│ │ │ +
47//=============================================================================
│ │ │ +
48
│ │ │ +
49namespace OpenMesh {
│ │ │ +
50namespace HoleFiller {
│ │ │ +
51
│ │ │ +
52template< class MeshT >
│ │ │ +
│ │ │ + │ │ │ +
54{
│ │ │ +
55 typedef typename MeshT::Point Point;
│ │ │ +
56 typedef typename MeshT::Scalar Scalar;
│ │ │ +
57
│ │ │ +
58public:
│ │ │ +
59
│ │ │ +
60 // Ctors
│ │ │ +
61 explicit HoleFillerT( MeshT & _mesh );
│ │ │ + │ │ │ +
63
│ │ │ +
67 void fill_all_holes( int _stages = 3 );
│ │ │ +
68
│ │ │ +
69
│ │ │ +
76 void fill_hole( typename MeshT::EdgeHandle _eh, int _stages = 3 );
│ │ │ +
77
│ │ │ +
78private:
│ │ │ +
79
│ │ │
80
│ │ │ -
81template <int DIM> float norm(Vec<DIM> const &v) {
│ │ │ -
82 float sum = 0.0f;
│ │ │ -
83 for (int i = 0; i < DIM; i++)
│ │ │ -
84 sum += v[i] * v[i];
│ │ │ -
85 return std::sqrt(sum);
│ │ │ -
86}
│ │ │ -
87
│ │ │ -
88template <int DIM> Vec<DIM> &normalize(Vec<DIM> &v) { return v /= norm(v); }
│ │ │ -
89template <int DIM> Vec<DIM> &vectorize(Vec<DIM> &v, float val) {
│ │ │ -
90 for (int i = 0; i < DIM; i++)
│ │ │ -
91 v[i] = val;
│ │ │ -
92 return v;
│ │ │ -
93}
│ │ │ -
94
│ │ │ -
95template <int DIM> Vec<DIM> &minimize(Vec<DIM> &v1, Vec<DIM> const &v2) {
│ │ │ -
96 for (int i = 0; i < DIM; i++)
│ │ │ -
97 v1[i] = std::min(v1[i], v2[i]);
│ │ │ -
98 return v1;
│ │ │ -
99}
│ │ │ -
100
│ │ │ -
101template <int DIM> Vec<DIM> &maximize(Vec<DIM> &v1, Vec<DIM> const &v2) {
│ │ │ -
102 for (int i = 0; i < DIM; i++)
│ │ │ -
103 v1[i] = std::max(v1[i], v2[i]);
│ │ │ -
104 return v1;
│ │ │ -
105}
│ │ │ -
106
│ │ │ -
107template <int DIM> float dot(Vec<DIM> const &v1, Vec<DIM> const &v2) {
│ │ │ -
108 float sum = 0.f;
│ │ │ -
109 for (int i = 0; i < DIM; i++)
│ │ │ -
110 sum += v1[i] * v2[i];
│ │ │ -
111 return sum;
│ │ │ -
112}
│ │ │ +
81 void fairing( std::vector< OpenMesh::SmartFaceHandle >& _faceHandles );
│ │ │ +
82
│ │ │ +
83 // Remove degenerated faces from the filling
│ │ │ +
84 void removeDegeneratedFaces( std::vector< typename MeshT::FaceHandle >& _faceHandles );
│ │ │ +
85
│ │ │ +
86 // A weight is a tuple of area and maximum dihedral angle
│ │ │ +
87 //
│ │ │ +
88
│ │ │ +
89 class Weight {
│ │ │ +
90 public:
│ │ │ +
91
│ │ │ +
92 Weight() : angle_( 180 ), area_( FLT_MAX ) {}
│ │ │ +
93 Weight( Scalar _angle, Scalar _area ) : angle_( _angle ), area_( _area ) {}
│ │ │ +
94 ~Weight() {}
│ │ │ +
95
│ │ │ +
96 Scalar angle() const { return angle_; }
│ │ │ +
97 Scalar area() const { return area_; }
│ │ │ +
98
│ │ │ +
99 Weight operator+( const Weight & _other ) const {
│ │ │ +
100 return Weight( std::max( angle(), _other.angle() ),
│ │ │ +
101 area() + _other.area() );
│ │ │ +
102 }
│ │ │ +
103
│ │ │ +
104 bool operator<( const Weight & _rhs ) const {
│ │ │ +
105 return ( angle() < _rhs.angle() ||
│ │ │ +
106 ( angle() == _rhs.angle() && area() < _rhs.area() ) );
│ │ │ +
107 }
│ │ │ +
108
│ │ │ +
109 private:
│ │ │ +
110 Scalar angle_;
│ │ │ +
111 Scalar area_;
│ │ │ +
112 };
│ │ │
113
│ │ │ -
114inline Vec<3> cross(Vec<3> const &v1, Vec<3> const &v2) {
│ │ │ -
115 return {v1[1] * v2[2] - v1[2] * v2[1], //
│ │ │ -
116 v1[2] * v2[0] - v1[0] * v2[2], //
│ │ │ -
117 v1[0] * v2[1] - v1[1] * v2[0]};
│ │ │ -
118}
│ │ │ -
119}
│ │ │ -
120
│ │ │ -
121namespace OpenMesh {
│ │ │ -
122template <int DIM> struct vector_traits<Custom::Vec<DIM>> {
│ │ │ - │ │ │ -
124 using value_type = float;
│ │ │ -
125 static const size_t size_ = DIM;
│ │ │ -
126 static size_t size() { return size_; }
│ │ │ -
127};
│ │ │ -
128}
│ │ │ -
129
│ │ │ - │ │ │ -
131 typedef Custom::Vec<3> Point;
│ │ │ -
132 typedef Custom::Vec<3> Normal;
│ │ │ -
133
│ │ │ -
134 typedef Custom::Vec<2> TexCoord2D;
│ │ │ -
135 typedef Custom::Vec<3> TexCoord3D;
│ │ │ -
136};
│ │ │ +
114 // Refine a face
│ │ │ +
115 bool refine( typename MeshT::FaceHandle _fh );
│ │ │ +
116
│ │ │ +
117 // Relax an edge
│ │ │ +
118 bool relax_edge( OpenMesh::SmartEdgeHandle _eh );
│ │ │ +
119
│ │ │ +
120 // Test whether a point _x lies in the circumsphere of _a,_b,_c.
│ │ │ +
121 bool in_circumsphere( const Point & _x,
│ │ │ +
122 const Point & _a,
│ │ │ +
123 const Point & _b,
│ │ │ +
124 const Point & _c ) const;
│ │ │ +
125
│ │ │ +
126 // Create the triangulation for polygon (_i,...,_j).
│ │ │ +
127 bool fill( int _i, int _j );
│ │ │ +
128
│ │ │ +
129 // Compute the weight of the triangle (_i,_j,_k).
│ │ │ +
130 Weight weight( int _i, int _j, int _k );
│ │ │ +
131
│ │ │ +
132 // Does edge (_u,_v) already exist?
│ │ │ +
133 bool exists_edge( OpenMesh::SmartVertexHandle _u, typename MeshT::VertexHandle _w );
│ │ │ +
134
│ │ │ +
135 // Compute the area of the triangle (_a,_b,_c).
│ │ │ +
136 Scalar area( typename MeshT::VertexHandle _a, typename MeshT::VertexHandle _b, typename MeshT::VertexHandle _c );
│ │ │
137
│ │ │ -
138#endif // UNITTESTS_COMMON_DUMMYTRAITS
│ │ │ +
138 // Compute the dihedral angle (in degrees) between triangle
│ │ │ +
139 // (_u,_v,_a) and triangle (_v,_u,_b).
│ │ │ +
140 Scalar dihedral_angle( typename MeshT::VertexHandle _u, typename MeshT::VertexHandle _v, typename MeshT::VertexHandle _a, typename MeshT::VertexHandle _b );
│ │ │ +
141
│ │ │ +
142
│ │ │ +
143 // The mesh, with each vertex we associate a scale factor that is
│ │ │ +
144 // needed for remeshing
│ │ │ +
145
│ │ │ +
146 MeshT & mesh_;
│ │ │ + │ │ │ +
148
│ │ │ +
149 /*
│ │ │ +
150 HOLE
│ │ │ +
151
│ │ │ +
152 boundary_vertex_
│ │ │ +
153 |
│ │ │ +
154 V
│ │ │ +
155 ==*=======*=======*== BOUNDARY
│ │ │ +
156 / \ / \ / \
│ │ │ +
157 / \ / \ / \
│ │ │ +
158 \ / \ /
│ │ │ +
159 * * <- opposite_vertex_
│ │ │ +
160 */
│ │ │ +
161
│ │ │ +
162
│ │ │ +
163 typedef std::vector< typename MeshT::VertexHandle > VHVec;
│ │ │ +
164 typedef typename std::vector< typename MeshT::VertexHandle >::iterator VHVecIter;
│ │ │ +
165 typedef typename std::vector< typename MeshT::VertexHandle >::const_iterator CVHVecIter;
│ │ │ +
166
│ │ │ +
167 typedef std::vector< typename MeshT::FaceHandle > FHVec;
│ │ │ +
168 typedef typename std::vector< typename MeshT::FaceHandle >::iterator FHVecIter;
│ │ │ +
169 typedef typename std::vector< typename MeshT::FaceHandle >::const_iterator CFHVecIter;
│ │ │ +
170
│ │ │ +
171
│ │ │ +
172 // This vector contains all vertices of the hole (in order)
│ │ │ +
173 std::vector< OpenMesh::SmartVertexHandle > boundary_vertex_;
│ │ │ +
174
│ │ │ +
175 // This vector contains all vertices that are opposite to an edge of the hole
│ │ │ +
176 VHVec opposite_vertex_;
│ │ │ +
177
│ │ │ +
178 // This vector contains all edges of the hole (in order)
│ │ │ +
179 std::vector< OpenMesh::SmartEdgeHandle > hole_edge_;
│ │ │ +
180
│ │ │ +
181 // This vector stores handles to all triangles of the current hole
│ │ │ +
182 std::vector< OpenMesh::SmartFaceHandle > hole_triangle_;
│ │ │ +
183
│ │ │ +
184 // These are the two central arrays that are needed for the dynamic
│ │ │ +
185 // programming approach to hole filling.
│ │ │ +
186 // w_[i][j] : stores the minimal weight that can be achieved
│ │ │ +
187 // for a triangulation of the polygon
│ │ │ +
188 // boundary_vertex_[i],...,boundary_vertex_[j]
│ │ │ +
189 // l_[i][j] : stores the third index of the triangle
│ │ │ +
190 // <boundary_vertex_[i],boundary_vertex_[l_[i][j]],
│ │ │ +
191 // boundary_vertex_[j]>
│ │ │ +
192 // that is needed for reconstructing the minimal triangulation
│ │ │ +
193
│ │ │ +
194 std::vector< std::vector< Weight > > w_;
│ │ │ +
195 std::vector< std::vector< int > > l_;
│ │ │ +
196};
│ │ │ +
│ │ │ +
197
│ │ │ +
198} // namespace HoleFiller
│ │ │ +
199} // namespace OpenMesh
│ │ │ +
200
│ │ │ +
201//=============================================================================
│ │ │ +
202#ifndef HOLEFILLER_CC
│ │ │ +
203 #include "HoleFillerT_impl.hh"
│ │ │ +
204#endif
│ │ │ +
205//=============================================================================
│ │ │ +
206
│ │ │ +
207
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition Vector11T.hh:693
│ │ │ -
Base class for all traits.
Definition Traits.hh:122
│ │ │ -
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │ -
T::vector_type vector_type
Type of the vector class.
Definition vector_traits.hh:91
│ │ │ -
static const size_t size_
size/dimension of the vector
Definition vector_traits.hh:97
│ │ │ -
static size_t size()
size/dimension of the vector
Definition vector_traits.hh:100
│ │ │ -
Definition unittests_common.hh:17
│ │ │ -
A Vector class with the absolute minimum of built-in methods to test the interface expected from Vect...
Definition unittests_common_customtraits.hh:11
│ │ │ +
T angle(T _cos_angle, T _sin_angle)
returns the angle determined by its cos and the sign of its sin result is positive if the angle is in...
Definition MathDefs.hh:140
│ │ │ +
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ +
Definition SmartHandles.hh:197
│ │ │ + │ │ │ +
Definition HoleFillerT.hh:54
│ │ │ +
void fill_hole(typename MeshT::EdgeHandle _eh, int _stages=3)
Fill a hole which is identified by one of its boundary edges.
Definition HoleFillerT_impl.hh:137
│ │ │ +
void fill_all_holes(int _stages=3)
Identify and fill all holes of the mesh.
Definition HoleFillerT_impl.hh:91
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,179 +1,250 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -unittests_common_customtraits.hh │ │ │ │ -1#ifndef UNITTESTS_COMMON_DUMMYTRAITS │ │ │ │ -2#define UNITTESTS_COMMON_DUMMYTRAITS │ │ │ │ -3#include │ │ │ │ -4#include │ │ │ │ -5#include │ │ │ │ -6 │ │ │ │ -7namespace Custom { │ │ │ │ -8 │ │ │ │ -_1_1template class _V_e_c { │ │ │ │ -12 public: │ │ │ │ -13 // Constructor with DIM components │ │ │ │ -14 _V_e_c(float x) : data({ x }) {} │ │ │ │ -15 _V_e_c(float x, float y) : data({ x, y }) {} │ │ │ │ -16 _V_e_c(float x, float y, float z) : data({{ x, y, z }}) {} │ │ │ │ -17 _V_e_c(float x, float y, float z, float w) : data({ x, y, z, w }) {} │ │ │ │ -18 │ │ │ │ -19 _V_e_c() = default; │ │ │ │ -20 │ │ │ │ -21 float &operator[](int i) { return data[i]; } │ │ │ │ -22 float operator[](int i) const { return data[i]; } │ │ │ │ -23 │ │ │ │ -24 private: │ │ │ │ -25 std::array data; │ │ │ │ -26}; │ │ │ │ -27 │ │ │ │ -28template bool operator==(_V_e_c_<_D_I_M_> const &lhs, _V_e_c_<_D_I_M_> const &rhs) │ │ │ │ -{ │ │ │ │ -29 for (int i = 0; i < DIM; i++) │ │ │ │ -30 if (lhs[i] != rhs[i]) return false; │ │ │ │ -31 return true; │ │ │ │ -32} │ │ │ │ -33 │ │ │ │ -34template │ │ │ │ -35Vec operator+(Vec const &lhs, Vec const &rhs) { │ │ │ │ -36 Vec result; │ │ │ │ -37 for (int i = 0; i < DIM; i++) │ │ │ │ -38 result[i] = lhs[i] + rhs[i]; │ │ │ │ -39 return result; │ │ │ │ -40} │ │ │ │ +HoleFillerT.hh │ │ │ │ +1/* ========================================================================= * │ │ │ │ +2 * * │ │ │ │ +3 * OpenMesh * │ │ │ │ +4 * Copyright (c) 2001-2023, RWTH-Aachen University * │ │ │ │ +5 * Department of Computer Graphics and Multimedia * │ │ │ │ +6 * All rights reserved. * │ │ │ │ +7 * www.openmesh.org * │ │ │ │ +8 * * │ │ │ │ +9 *---------------------------------------------------------------------------* │ │ │ │ +10 * This file is part of OpenMesh. * │ │ │ │ +11 *--------------------------------------------------------------------------- │ │ │ │ +* │ │ │ │ +12 * * │ │ │ │ +13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ +14 * modification, are permitted provided that the following conditions * │ │ │ │ +15 * are met: * │ │ │ │ +16 * * │ │ │ │ +17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ +* │ │ │ │ +18 * this list of conditions and the following disclaimer. * │ │ │ │ +19 * * │ │ │ │ +20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ +21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ +22 * documentation and/or other materials provided with the distribution. * │ │ │ │ +23 * * │ │ │ │ +24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ +25 * contributors may be used to endorse or promote products derived from * │ │ │ │ +26 * this software without specific prior written permission. * │ │ │ │ +27 * * │ │ │ │ +28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ +29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ +* │ │ │ │ +30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ +31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ +* │ │ │ │ +32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ +33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ +34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ +35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ +36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ +37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ +38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ +39 * * │ │ │ │ +40 * ========================================================================= │ │ │ │ +*/ │ │ │ │ 41 │ │ │ │ -42template │ │ │ │ -43Vec operator-(Vec const &lhs, Vec const &rhs) { │ │ │ │ -44 Vec result; │ │ │ │ -45 for (int i = 0; i < DIM; i++) │ │ │ │ -46 result[i] = lhs[i] - rhs[i]; │ │ │ │ -47 return result; │ │ │ │ -48} │ │ │ │ -49 │ │ │ │ -50template Vec _o_p_e_r_a_t_o_r_*(Vec const &lhs, float rhs) { │ │ │ │ -51 Vec result; │ │ │ │ -52 for (int i = 0; i < DIM; i++) │ │ │ │ -53 result[i] = lhs[i] * rhs; │ │ │ │ -54 return result; │ │ │ │ -55} │ │ │ │ -56 │ │ │ │ -57template Vec _o_p_e_r_a_t_o_r_*(float lhs, Vec const &rhs) { │ │ │ │ -58 return rhs * lhs; │ │ │ │ -59} │ │ │ │ -60 │ │ │ │ -61template Vec operator/(Vec const &lhs, float rhs) { │ │ │ │ -62 Vec result; │ │ │ │ -63 for (int i = 0; i < DIM; i++) │ │ │ │ -64 result[i] = lhs[i] / rhs; │ │ │ │ -65 return result; │ │ │ │ -66} │ │ │ │ -67 │ │ │ │ -68template Vec &operator+=(Vec &lhs, Vec const &rhs) { │ │ │ │ -69 return lhs = lhs + rhs; │ │ │ │ -70} │ │ │ │ -71template Vec &operator-=(Vec &lhs, Vec const &rhs) { │ │ │ │ -72 return lhs = lhs - rhs; │ │ │ │ -73} │ │ │ │ -74template Vec &operator*=(Vec &lhs, float rhs) { │ │ │ │ -75 return lhs = lhs * rhs; │ │ │ │ -76} │ │ │ │ -77template Vec &operator/=(Vec &lhs, float rhs) { │ │ │ │ -78 return lhs = lhs / rhs; │ │ │ │ -79} │ │ │ │ +42#pragma once │ │ │ │ +43 │ │ │ │ +44#include │ │ │ │ +45#include │ │ │ │ +46 │ │ │ │ +47// │ │ │ │ +============================================================================= │ │ │ │ +48 │ │ │ │ +49namespace _O_p_e_n_M_e_s_h { │ │ │ │ +50namespace HoleFiller { │ │ │ │ +51 │ │ │ │ +52template< class MeshT > │ │ │ │ +_5_3class _H_o_l_e_F_i_l_l_e_r_T │ │ │ │ +54{ │ │ │ │ +55 typedef typename MeshT::Point Point; │ │ │ │ +56 typedef typename MeshT::Scalar Scalar; │ │ │ │ +57 │ │ │ │ +58public: │ │ │ │ +59 │ │ │ │ +60 // Ctors │ │ │ │ +61 explicit _H_o_l_e_F_i_l_l_e_r_T( MeshT & _mesh ); │ │ │ │ +62 _~_H_o_l_e_F_i_l_l_e_r_T(); │ │ │ │ +63 │ │ │ │ +67 void _f_i_l_l___a_l_l___h_o_l_e_s( int _stages = 3 ); │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +76 void _f_i_l_l___h_o_l_e( typename MeshT::EdgeHandle _eh, int _stages = 3 ); │ │ │ │ +77 │ │ │ │ +78private: │ │ │ │ +79 │ │ │ │ 80 │ │ │ │ -81template float norm(Vec const &v) { │ │ │ │ -82 float sum = 0.0f; │ │ │ │ -83 for (int i = 0; i < DIM; i++) │ │ │ │ -84 sum += v[i] * v[i]; │ │ │ │ -85 return std::sqrt(sum); │ │ │ │ -86} │ │ │ │ -87 │ │ │ │ -88template Vec &normalize(Vec &v) { return v /= norm(v); } │ │ │ │ -89template Vec &vectorize(Vec &v, float val) { │ │ │ │ -90 for (int i = 0; i < DIM; i++) │ │ │ │ -91 v[i] = val; │ │ │ │ -92 return v; │ │ │ │ -93} │ │ │ │ -94 │ │ │ │ -95template Vec &minimize(Vec &v1, Vec const &v2) { │ │ │ │ -96 for (int i = 0; i < DIM; i++) │ │ │ │ -97 v1[i] = std::min(v1[i], v2[i]); │ │ │ │ -98 return v1; │ │ │ │ -99} │ │ │ │ -100 │ │ │ │ -101template Vec &maximize(Vec &v1, Vec const &v2) { │ │ │ │ -102 for (int i = 0; i < DIM; i++) │ │ │ │ -103 v1[i] = std::max(v1[i], v2[i]); │ │ │ │ -104 return v1; │ │ │ │ -105} │ │ │ │ -106 │ │ │ │ -107template float dot(Vec const &v1, Vec const &v2) { │ │ │ │ -108 float sum = 0.f; │ │ │ │ -109 for (int i = 0; i < DIM; i++) │ │ │ │ -110 sum += v1[i] * v2[i]; │ │ │ │ -111 return sum; │ │ │ │ -112} │ │ │ │ +81 void fairing( std::vector< OpenMesh::SmartFaceHandle >& _faceHandles ); │ │ │ │ +82 │ │ │ │ +83 // Remove degenerated faces from the filling │ │ │ │ +84 void removeDegeneratedFaces( std::vector< typename MeshT::FaceHandle >& │ │ │ │ +_faceHandles ); │ │ │ │ +85 │ │ │ │ +86 // A weight is a tuple of area and maximum dihedral angle │ │ │ │ +87 // │ │ │ │ +88 │ │ │ │ +89 class Weight { │ │ │ │ +90 public: │ │ │ │ +91 │ │ │ │ +92 Weight() : angle_( 180 ), area_( FLT_MAX ) {} │ │ │ │ +93 Weight( Scalar _angle, Scalar _area ) : angle_( _angle ), area_( _area ) {} │ │ │ │ +94 ~Weight() {} │ │ │ │ +95 │ │ │ │ +96 Scalar _a_n_g_l_e() const { return angle_; } │ │ │ │ +97 Scalar area() const { return area_; } │ │ │ │ +98 │ │ │ │ +99 Weight operator+( const Weight & _other ) const { │ │ │ │ +100 return Weight( std::max( _a_n_g_l_e(), _other.angle() ), │ │ │ │ +101 area() + _other.area() ); │ │ │ │ +102 } │ │ │ │ +103 │ │ │ │ +104 bool operator<( const Weight & _rhs ) const { │ │ │ │ +105 return ( _a_n_g_l_e() < _rhs.angle() || │ │ │ │ +106 ( _a_n_g_l_e() == _rhs.angle() && area() < _rhs.area() ) ); │ │ │ │ +107 } │ │ │ │ +108 │ │ │ │ +109 private: │ │ │ │ +110 Scalar angle_; │ │ │ │ +111 Scalar area_; │ │ │ │ +112 }; │ │ │ │ 113 │ │ │ │ -114inline Vec<3> cross(Vec<3> const &v1, Vec<3> const &v2) { │ │ │ │ -115 return {v1[1] * v2[2] - v1[2] * v2[1], // │ │ │ │ -116 v1[2] * v2[0] - v1[0] * v2[2], // │ │ │ │ -117 v1[0] * v2[1] - v1[1] * v2[0]}; │ │ │ │ -118} │ │ │ │ -119} │ │ │ │ -120 │ │ │ │ -121namespace _O_p_e_n_M_e_s_h { │ │ │ │ -122template struct vector_traits> { │ │ │ │ -123 using _v_e_c_t_o_r___t_y_p_e = _C_u_s_t_o_m_:_:_V_e_c_<_D_I_M_>; │ │ │ │ -124 using _v_a_l_u_e___t_y_p_e = float; │ │ │ │ -125 static const size_t _s_i_z_e__ = DIM; │ │ │ │ -126 static size_t _s_i_z_e() { return _s_i_z_e__; } │ │ │ │ -127}; │ │ │ │ -128} │ │ │ │ -129 │ │ │ │ -130struct _C_u_s_t_o_m_T_r_a_i_t_s : public _O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s { │ │ │ │ -131 typedef _C_u_s_t_o_m_:_:_V_e_c_<_3_> Point; │ │ │ │ -132 typedef _C_u_s_t_o_m_:_:_V_e_c_<_3_> Normal; │ │ │ │ -133 │ │ │ │ -134 typedef _C_u_s_t_o_m_:_:_V_e_c_<_2_> TexCoord2D; │ │ │ │ -135 typedef _C_u_s_t_o_m_:_:_V_e_c_<_3_> TexCoord3D; │ │ │ │ -136}; │ │ │ │ +114 // Refine a face │ │ │ │ +115 bool refine( typename MeshT::FaceHandle _fh ); │ │ │ │ +116 │ │ │ │ +117 // Relax an edge │ │ │ │ +118 bool relax_edge( _O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _eh ); │ │ │ │ +119 │ │ │ │ +120 // Test whether a point _x lies in the circumsphere of _a,_b,_c. │ │ │ │ +121 bool in_circumsphere( const Point & _x, │ │ │ │ +122 const Point & _a, │ │ │ │ +123 const Point & _b, │ │ │ │ +124 const Point & _c ) const; │ │ │ │ +125 │ │ │ │ +126 // Create the triangulation for polygon (_i,...,_j). │ │ │ │ +127 bool fill( int _i, int _j ); │ │ │ │ +128 │ │ │ │ +129 // Compute the weight of the triangle (_i,_j,_k). │ │ │ │ +130 Weight weight( int _i, int _j, int _k ); │ │ │ │ +131 │ │ │ │ +132 // Does edge (_u,_v) already exist? │ │ │ │ +133 bool exists_edge( _O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _u, typename MeshT:: │ │ │ │ +VertexHandle _w ); │ │ │ │ +134 │ │ │ │ +135 // Compute the area of the triangle (_a,_b,_c). │ │ │ │ +136 Scalar area( typename MeshT::VertexHandle _a, typename MeshT::VertexHandle │ │ │ │ +_b, typename MeshT::VertexHandle _c ); │ │ │ │ 137 │ │ │ │ -138#endif // UNITTESTS_COMMON_DUMMYTRAITS │ │ │ │ +138 // Compute the dihedral angle (in degrees) between triangle │ │ │ │ +139 // (_u,_v,_a) and triangle (_v,_u,_b). │ │ │ │ +140 Scalar dihedral_angle( typename MeshT::VertexHandle _u, typename MeshT:: │ │ │ │ +VertexHandle _v, typename MeshT::VertexHandle _a, typename MeshT::VertexHandle │ │ │ │ +_b ); │ │ │ │ +141 │ │ │ │ +142 │ │ │ │ +143 // The mesh, with each vertex we associate a scale factor that is │ │ │ │ +144 // needed for remeshing │ │ │ │ +145 │ │ │ │ +146 MeshT & mesh_; │ │ │ │ +147 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _S_c_a_l_a_r_ _> scale_; │ │ │ │ +148 │ │ │ │ +149 /* │ │ │ │ +150 HOLE │ │ │ │ +151 │ │ │ │ +152 boundary_vertex_ │ │ │ │ +153 | │ │ │ │ +154 V │ │ │ │ +155 ==*=======*=======*== BOUNDARY │ │ │ │ +156 / \ / \ / \ │ │ │ │ +157 / \ / \ / \ │ │ │ │ +158 \ / \ / │ │ │ │ +159 * * <- opposite_vertex_ │ │ │ │ +160 */ │ │ │ │ +161 │ │ │ │ +162 │ │ │ │ +163 typedef std::vector< typename MeshT::VertexHandle > VHVec; │ │ │ │ +164 typedef typename std::vector< typename MeshT::VertexHandle >::iterator │ │ │ │ +VHVecIter; │ │ │ │ +165 typedef typename std::vector< typename MeshT::VertexHandle >:: │ │ │ │ +const_iterator CVHVecIter; │ │ │ │ +166 │ │ │ │ +167 typedef std::vector< typename MeshT::FaceHandle > FHVec; │ │ │ │ +168 typedef typename std::vector< typename MeshT::FaceHandle >::iterator │ │ │ │ +FHVecIter; │ │ │ │ +169 typedef typename std::vector< typename MeshT::FaceHandle >::const_iterator │ │ │ │ +CFHVecIter; │ │ │ │ +170 │ │ │ │ +171 │ │ │ │ +172 // This vector contains all vertices of the hole (in order) │ │ │ │ +173 std::vector< OpenMesh::SmartVertexHandle > boundary_vertex_; │ │ │ │ +174 │ │ │ │ +175 // This vector contains all vertices that are opposite to an edge of the │ │ │ │ +hole │ │ │ │ +176 VHVec opposite_vertex_; │ │ │ │ +177 │ │ │ │ +178 // This vector contains all edges of the hole (in order) │ │ │ │ +179 std::vector< OpenMesh::SmartEdgeHandle > hole_edge_; │ │ │ │ +180 │ │ │ │ +181 // This vector stores handles to all triangles of the current hole │ │ │ │ +182 std::vector< OpenMesh::SmartFaceHandle > hole_triangle_; │ │ │ │ +183 │ │ │ │ +184 // These are the two central arrays that are needed for the dynamic │ │ │ │ +185 // programming approach to hole filling. │ │ │ │ +186 // w_[i][j] : stores the minimal weight that can be achieved │ │ │ │ +187 // for a triangulation of the polygon │ │ │ │ +188 // boundary_vertex_[i],...,boundary_vertex_[j] │ │ │ │ +189 // l_[i][j] : stores the third index of the triangle │ │ │ │ +190 // │ │ │ │ +192 // that is needed for reconstructing the minimal triangulation │ │ │ │ +193 │ │ │ │ +194 std::vector< std::vector< Weight > > w_; │ │ │ │ +195 std::vector< std::vector< int > > l_; │ │ │ │ +196}; │ │ │ │ +197 │ │ │ │ +198} // namespace HoleFiller │ │ │ │ +199} // namespace OpenMesh │ │ │ │ +200 │ │ │ │ +201// │ │ │ │ +============================================================================= │ │ │ │ +202#ifndef HOLEFILLER_CC │ │ │ │ +203 #include "HoleFillerT_impl.hh" │ │ │ │ +204#endif │ │ │ │ +205// │ │ │ │ +============================================================================= │ │ │ │ +206 │ │ │ │ +207 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) - │ │ │ │ -> decltype(rhs.operator*(_s)) │ │ │ │ -Component wise multiplication from the left. │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:693 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s │ │ │ │ -Base class for all traits. │ │ │ │ -DDeeffiinniittiioonn Traits.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -T::value_type value_type │ │ │ │ -Type of the scalar value. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_e_c_t_o_r___t_y_p_e │ │ │ │ -T::vector_type vector_type │ │ │ │ -Type of the vector class. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e__ │ │ │ │ -static const size_t size_ │ │ │ │ -size/dimension of the vector │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e │ │ │ │ -static size_t size() │ │ │ │ -size/dimension of the vector │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:100 │ │ │ │ -_C_u_s_t_o_m_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn unittests_common.hh:17 │ │ │ │ -_C_u_s_t_o_m_:_:_V_e_c │ │ │ │ -A Vector class with the absolute minimum of built-in methods to test the │ │ │ │ -interface expected from Vect... │ │ │ │ -DDeeffiinniittiioonn unittests_common_customtraits.hh:11 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_a_n_g_l_e │ │ │ │ +T angle(T _cos_angle, T _sin_angle) │ │ │ │ +returns the angle determined by its cos and the sign of its sin result is │ │ │ │ +positive if the angle is in... │ │ │ │ +DDeeffiinniittiioonn MathDefs.hh:140 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ +allows easier access t... │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:197 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _S_c_a_l_a_r_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_o_l_e_F_i_l_l_e_r_:_:_H_o_l_e_F_i_l_l_e_r_T │ │ │ │ +DDeeffiinniittiioonn HoleFillerT.hh:54 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_o_l_e_F_i_l_l_e_r_:_:_H_o_l_e_F_i_l_l_e_r_T_:_:_f_i_l_l___h_o_l_e │ │ │ │ +void fill_hole(typename MeshT::EdgeHandle _eh, int _stages=3) │ │ │ │ +Fill a hole which is identified by one of its boundary edges. │ │ │ │ +DDeeffiinniittiioonn HoleFillerT_impl.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_o_l_e_F_i_l_l_e_r_:_:_H_o_l_e_F_i_l_l_e_r_T_:_:_f_i_l_l___a_l_l___h_o_l_e_s │ │ │ │ +void fill_all_holes(int _stages=3) │ │ │ │ +Identify and fill all holes of the mesh. │ │ │ │ +DDeeffiinniittiioonn HoleFillerT_impl.hh:91 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00443_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Apps/Subdivider/SubdivideWidget.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/VDPM/VFront.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SubdivideWidget.hh
│ │ │ +
VFront.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -140,114 +140,82 @@ │ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44//=============================================================================
│ │ │
45//
│ │ │ -
46// CLASS SubdivideWidget
│ │ │ +
46// CLASS VFront
│ │ │
47//
│ │ │
48//=============================================================================
│ │ │
49
│ │ │ -
50#ifndef SUBDIVIDEWIDGET_HH
│ │ │ -
51#define SUBDIVIDEWIDGET_HH
│ │ │ +
50#ifndef OPENMESH_VDPROGMESH_VFRONT_HH
│ │ │ +
51#define OPENMESH_VDPROGMESH_VFRONT_HH
│ │ │
52
│ │ │
53
│ │ │
54//== INCLUDES =================================================================
│ │ │
55
│ │ │ -
56#include <QTimer>
│ │ │ -
57#include <QMainWindow>
│ │ │ -
58#include <QStatusBar>
│ │ │ -
59#include <OpenMesh/Apps/Subdivider/MeshViewerWidget.hh>
│ │ │ - │ │ │ -
61
│ │ │ +
56#include <OpenMesh/Core/System/config.h>
│ │ │ +
57#include <OpenMesh/Tools/VDPM/VHierarchyNode.hh>
│ │ │ +
58#include <vector>
│ │ │ +
59
│ │ │ +
60
│ │ │ +
61//== FORWARDDECLARATIONS ======================================================
│ │ │
62
│ │ │
63
│ │ │ -
64
│ │ │ -
65//== CLASS DEFINITION =========================================================
│ │ │ -
66
│ │ │ -
│ │ │ -
67class SubdivideWidget : public QWidget
│ │ │ -
68{
│ │ │ -
69 Q_OBJECT
│ │ │ -
70
│ │ │ -
71public:
│ │ │ -
72
│ │ │ - │ │ │ -
74
│ │ │ -
75 enum SOPType {
│ │ │ -
76 SOP_UniformCompositeLoop,
│ │ │ -
77 SOP_UniformCompositeSqrt3,
│ │ │ -
78 SOP_UniformLoop,
│ │ │ -
79 SOP_UniformSqrt3,
│ │ │ -
80 SOP_UniformInterpolatingSqrt3,
│ │ │ -
81 SOP_ModifiedButterfly,
│ │ │ -
82 SOP_CatmullClark,
│ │ │ -
83 SOP_Undefined
│ │ │ -
84 };
│ │ │ +
64//== NAMESPACES ===============================================================
│ │ │ +
65
│ │ │ +
66namespace OpenMesh {
│ │ │ +
67namespace VDPM {
│ │ │ +
68
│ │ │ +
69//== CLASS DEFINITION =========================================================
│ │ │ +
70
│ │ │ +
71
│ │ │ +
│ │ │ +
75class OPENMESHDLLEXPORT VFront
│ │ │ +
76{
│ │ │ +
77private:
│ │ │ +
78
│ │ │ +
79 typedef VHierarchyNodeHandleList::iterator VHierarchyNodeHandleListIter;
│ │ │ +
80 enum VHierarchyNodeStatus { kSplit, kActive, kCollapse };
│ │ │ +
81
│ │ │ + │ │ │ +
83 VHierarchyNodeHandleListIter front_it_;
│ │ │ +
84 std::vector<VHierarchyNodeHandleListIter> front_location_;
│ │ │
85
│ │ │ -
86 typedef std::map< SOPType, Subdivider* > SubdividerPool;
│ │ │ +
86public:
│ │ │
87
│ │ │ -
88public:
│ │ │ -
89
│ │ │ -
91 explicit SubdivideWidget(QWidget* _parent=0, const char* _name=0);
│ │ │ -
92
│ │ │ - │ │ │ -
95
│ │ │ +
88 VFront();
│ │ │ +
89
│ │ │ +
90 void clear() { front_.clear(); front_location_.clear(); }
│ │ │ +
91 void begin() { front_it_ = front_.begin(); }
│ │ │ +
92 bool end() { return (front_it_ == front_.end()) ? true : false; }
│ │ │ +
93 void next() { ++front_it_; }
│ │ │ +
94 int size() { return (int) front_.size(); }
│ │ │ +
95 VHierarchyNodeHandle node_handle() { return *front_it_; }
│ │ │
96
│ │ │ -
98 bool open_mesh(const char* _filename);
│ │ │ -
99
│ │ │ -
100 void keyPressEvent( QKeyEvent *k );
│ │ │ -
101
│ │ │ -
103 QStatusBar *status_bar;
│ │ │ -
104 void update();
│ │ │ -
105
│ │ │ -
106
│ │ │ -
107private slots:
│ │ │ -
108
│ │ │ -
109 void animate_slot(void);
│ │ │ -
110 void slot_select_sop(int i);
│ │ │ -
111 void subdiv_slot();
│ │ │ -
112 void reset_slot();
│ │ │ -
113 void save_slot();
│ │ │ -
114 void load_slot();
│ │ │ -
115
│ │ │ -
116private:
│ │ │ -
117
│ │ │ -
118 // widgets
│ │ │ -
119 MeshViewerWidgetSubdivider* viewer_widget_;
│ │ │ -
120
│ │ │ -
121 QTimer *timer_;
│ │ │ -
122
│ │ │ -
123 int animate_step_;
│ │ │ -
124 int max_animate_steps_;
│ │ │ -
125 int msecs_;
│ │ │ -
126
│ │ │ -
127 // Selected and current subdivision operator
│ │ │ -
128 SOPType sel_topo_type; // selected operator
│ │ │ -
129 SOPType cur_topo_type; // active operator
│ │ │ -
130
│ │ │ -
131 //
│ │ │ -
132 SubdividerPool subdivider_;
│ │ │ -
133
│ │ │ -
134};
│ │ │ -
│ │ │ -
135
│ │ │ -
136
│ │ │ -
137//=============================================================================
│ │ │ -
138#endif // SUBDIVIDEWIDGET_HH defined
│ │ │ -
139//=============================================================================
│ │ │ -
140
│ │ │ - │ │ │ -
Definition MeshViewerWidget.hh:70
│ │ │ -
Definition SubdivideWidget.hh:68
│ │ │ -
QStatusBar * status_bar
Updates Status Bar Information.
Definition SubdivideWidget.hh:103
│ │ │ -
bool open_mesh(const char *_filename)
open mesh from _filename
Definition SubdivideWidget.cc:345
│ │ │ -
~SubdivideWidget()
destructor
Definition SubdivideWidget.hh:94
│ │ │ -
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │ +
97 void add(VHierarchyNodeHandle _node_handle);
│ │ │ +
98 void remove(VHierarchyNodeHandle _node_handle);
│ │ │ +
99 bool is_active(VHierarchyNodeHandle _node_handle);
│ │ │ +
100 void init(VHierarchyNodeHandleContainer &_roots, unsigned int _n_details);
│ │ │ +
101};
│ │ │ +
│ │ │ +
102
│ │ │ +
103
│ │ │ +
104//=============================================================================
│ │ │ +
105} // namespace VDPM
│ │ │ +
106} // namespace OpenMesh
│ │ │ +
107//=============================================================================
│ │ │ +
108#endif // OPENMESH_VDPROGMESH_VFRONT_HH defined
│ │ │ +
109//=============================================================================
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
std::vector< VHierarchyNodeHandle > VHierarchyNodeHandleContainer
Container for vertex hierarchy node handles.
Definition VHierarchyNode.hh:183
│ │ │ +
std::list< VHierarchyNodeHandle > VHierarchyNodeHandleList
Container for vertex hierarchy node handles.
Definition VHierarchyNode.hh:186
│ │ │ +
Active nodes in vertex hierarchy.
Definition VFront.hh:76
│ │ │ +
Handle for vertex hierarchy nodes
Definition VHierarchyNode.hh:78
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SubdivideWidget.hh │ │ │ │ +VFront.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -50,126 +50,97 @@ │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44// │ │ │ │ ============================================================================= │ │ │ │ 45// │ │ │ │ -46// CLASS SubdivideWidget │ │ │ │ +46// CLASS VFront │ │ │ │ 47// │ │ │ │ 48// │ │ │ │ ============================================================================= │ │ │ │ 49 │ │ │ │ -50#ifndef SUBDIVIDEWIDGET_HH │ │ │ │ -51#define SUBDIVIDEWIDGET_HH │ │ │ │ +50#ifndef OPENMESH_VDPROGMESH_VFRONT_HH │ │ │ │ +51#define OPENMESH_VDPROGMESH_VFRONT_HH │ │ │ │ 52 │ │ │ │ 53 │ │ │ │ 54//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ 55 │ │ │ │ -56#include │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ -61 │ │ │ │ +56#include │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +61//== FORWARDDECLARATIONS │ │ │ │ +====================================================== │ │ │ │ 62 │ │ │ │ 63 │ │ │ │ -64 │ │ │ │ -65//== CLASS DEFINITION │ │ │ │ +64//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +65 │ │ │ │ +66namespace _O_p_e_n_M_e_s_h { │ │ │ │ +67namespace VDPM { │ │ │ │ +68 │ │ │ │ +69//== CLASS DEFINITION │ │ │ │ ========================================================= │ │ │ │ -66 │ │ │ │ -_6_7class _S_u_b_d_i_v_i_d_e_W_i_d_g_e_t : public QWidget │ │ │ │ -68{ │ │ │ │ -69 Q_OBJECT │ │ │ │ 70 │ │ │ │ -71public: │ │ │ │ -72 │ │ │ │ -73 typedef _O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_<_ _M_e_s_h_ _> Subdivider; │ │ │ │ -74 │ │ │ │ -75 enum SOPType { │ │ │ │ -76 SOP_UniformCompositeLoop, │ │ │ │ -77 SOP_UniformCompositeSqrt3, │ │ │ │ -78 SOP_UniformLoop, │ │ │ │ -79 SOP_UniformSqrt3, │ │ │ │ -80 SOP_UniformInterpolatingSqrt3, │ │ │ │ -81 SOP_ModifiedButterfly, │ │ │ │ -82 SOP_CatmullClark, │ │ │ │ -83 SOP_Undefined │ │ │ │ -84 }; │ │ │ │ +71 │ │ │ │ +_7_5class OPENMESHDLLEXPORT _V_F_r_o_n_t │ │ │ │ +76{ │ │ │ │ +77private: │ │ │ │ +78 │ │ │ │ +79 typedef VHierarchyNodeHandleList::iterator VHierarchyNodeHandleListIter; │ │ │ │ +80 enum VHierarchyNodeStatus { kSplit, kActive, kCollapse }; │ │ │ │ +81 │ │ │ │ +82 _V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_L_i_s_t front_; │ │ │ │ +83 VHierarchyNodeHandleListIter front_it_; │ │ │ │ +84 std::vector front_location_; │ │ │ │ 85 │ │ │ │ -86 typedef std::map< SOPType, Subdivider* > SubdividerPool; │ │ │ │ +86public: │ │ │ │ 87 │ │ │ │ -88public: │ │ │ │ +88 _V_F_r_o_n_t(); │ │ │ │ 89 │ │ │ │ -91 explicit _S_u_b_d_i_v_i_d_e_W_i_d_g_e_t(QWidget* _parent=0, const char* _name=0); │ │ │ │ -92 │ │ │ │ -_9_4 _~_S_u_b_d_i_v_i_d_e_W_i_d_g_e_t() {}; │ │ │ │ -95 │ │ │ │ +90 void clear() { front_.clear(); front_location_.clear(); } │ │ │ │ +91 void begin() { front_it_ = front_.begin(); } │ │ │ │ +92 bool end() { return (front_it_ == front_.end()) ? true : false; } │ │ │ │ +93 void next() { ++front_it_; } │ │ │ │ +94 int size() { return (int) front_.size(); } │ │ │ │ +95 _V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e node_handle() { return *front_it_; } │ │ │ │ 96 │ │ │ │ -98 bool _o_p_e_n___m_e_s_h(const char* _filename); │ │ │ │ -99 │ │ │ │ -100 void keyPressEvent( QKeyEvent *k ); │ │ │ │ -101 │ │ │ │ -_1_0_3 QStatusBar *_s_t_a_t_u_s___b_a_r; │ │ │ │ -104 void update(); │ │ │ │ -105 │ │ │ │ -106 │ │ │ │ -107private slots: │ │ │ │ -108 │ │ │ │ -109 void animate_slot(void); │ │ │ │ -110 void slot_select_sop(int i); │ │ │ │ -111 void subdiv_slot(); │ │ │ │ -112 void reset_slot(); │ │ │ │ -113 void save_slot(); │ │ │ │ -114 void load_slot(); │ │ │ │ -115 │ │ │ │ -116private: │ │ │ │ -117 │ │ │ │ -118 // widgets │ │ │ │ -119 _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_S_u_b_d_i_v_i_d_e_r* viewer_widget_; │ │ │ │ -120 │ │ │ │ -121 QTimer *timer_; │ │ │ │ -122 │ │ │ │ -123 int animate_step_; │ │ │ │ -124 int max_animate_steps_; │ │ │ │ -125 int msecs_; │ │ │ │ -126 │ │ │ │ -127 // Selected and current subdivision operator │ │ │ │ -128 SOPType sel_topo_type; // selected operator │ │ │ │ -129 SOPType cur_topo_type; // active operator │ │ │ │ -130 │ │ │ │ -131 // │ │ │ │ -132 SubdividerPool subdivider_; │ │ │ │ -133 │ │ │ │ -134}; │ │ │ │ -135 │ │ │ │ -136 │ │ │ │ -137// │ │ │ │ +97 void add(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle); │ │ │ │ +98 void remove(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle); │ │ │ │ +99 bool is_active(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle); │ │ │ │ +100 void init(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_C_o_n_t_a_i_n_e_r &_roots, unsigned int _n_details); │ │ │ │ +101}; │ │ │ │ +102 │ │ │ │ +103 │ │ │ │ +104// │ │ │ │ ============================================================================= │ │ │ │ -138#endif // SUBDIVIDEWIDGET_HH defined │ │ │ │ -139// │ │ │ │ +105} // namespace VDPM │ │ │ │ +106} // namespace OpenMesh │ │ │ │ +107// │ │ │ │ ============================================================================= │ │ │ │ -140 │ │ │ │ -_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_S_u_b_d_i_v_i_d_e_r │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidget.hh:70 │ │ │ │ -_S_u_b_d_i_v_i_d_e_W_i_d_g_e_t │ │ │ │ -DDeeffiinniittiioonn SubdivideWidget.hh:68 │ │ │ │ -_S_u_b_d_i_v_i_d_e_W_i_d_g_e_t_:_:_s_t_a_t_u_s___b_a_r │ │ │ │ -QStatusBar * status_bar │ │ │ │ -Updates Status Bar Information. │ │ │ │ -DDeeffiinniittiioonn SubdivideWidget.hh:103 │ │ │ │ -_S_u_b_d_i_v_i_d_e_W_i_d_g_e_t_:_:_o_p_e_n___m_e_s_h │ │ │ │ -bool open_mesh(const char *_filename) │ │ │ │ -open mesh from _filename │ │ │ │ -DDeeffiinniittiioonn SubdivideWidget.cc:345 │ │ │ │ -_S_u_b_d_i_v_i_d_e_W_i_d_g_e_t_:_:_~_S_u_b_d_i_v_i_d_e_W_i_d_g_e_t │ │ │ │ -~SubdivideWidget() │ │ │ │ -destructor │ │ │ │ -DDeeffiinniittiioonn SubdivideWidget.hh:94 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ -Abstract base class for uniform subdivision algorithms. │ │ │ │ -DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ +108#endif // OPENMESH_VDPROGMESH_VFRONT_HH defined │ │ │ │ +109// │ │ │ │ +============================================================================= │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ +std::vector< VHierarchyNodeHandle > VHierarchyNodeHandleContainer │ │ │ │ +Container for vertex hierarchy node handles. │ │ │ │ +DDeeffiinniittiioonn VHierarchyNode.hh:183 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_L_i_s_t │ │ │ │ +std::list< VHierarchyNodeHandle > VHierarchyNodeHandleList │ │ │ │ +Container for vertex hierarchy node handles. │ │ │ │ +DDeeffiinniittiioonn VHierarchyNode.hh:186 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_F_r_o_n_t │ │ │ │ +Active nodes in vertex hierarchy. │ │ │ │ +DDeeffiinniittiioonn VFront.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e │ │ │ │ +Handle for vertex hierarchy nodes │ │ │ │ +DDeeffiinniittiioonn VHierarchyNode.hh:78 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00452_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Apps/ProgViewer/ProgViewerWidget.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/VDPM/VHierarchyWindow.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
ProgViewerWidget.hh
│ │ │ +
VHierarchyWindow.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,147 +138,196 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45#ifndef OPENMESHAPPS_PROGVIEWERWIDGET_HH
│ │ │ -
46#define OPENMESHAPPS_PROGVIEWERWIDGET_HH
│ │ │ -
47
│ │ │ -
48
│ │ │ -
49//== INCLUDES =================================================================
│ │ │ -
50
│ │ │ -
51#include <QTimer>
│ │ │ -
52#include <OpenMesh/Apps/QtViewer/MeshViewerWidgetT.hh>
│ │ │ -
53#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ - │ │ │ -
55#include <string>
│ │ │ -
56
│ │ │ -
57
│ │ │ +
44//=============================================================================
│ │ │ +
45//
│ │ │ +
46// CLASS newClass
│ │ │ +
47//
│ │ │ +
48//=============================================================================
│ │ │ +
49
│ │ │ +
50#ifndef OPENMESH_VDPROGMESH_VHIERARCHYWINDOWS_HH
│ │ │ +
51#define OPENMESH_VDPROGMESH_VHIERARCHYWINDOWS_HH
│ │ │ +
52
│ │ │ +
53
│ │ │ +
54//== INCLUDES =================================================================
│ │ │ +
55
│ │ │ +
56#include <OpenMesh/Tools/VDPM/VHierarchy.hh>
│ │ │ +
57#include <algorithm>
│ │ │
58
│ │ │ -
59//== CLASS DEFINITION =========================================================
│ │ │ +
59//== FORWARDDECLARATIONS ======================================================
│ │ │
60
│ │ │
61
│ │ │ -
62using namespace OpenMesh;
│ │ │ -
63using namespace OpenMesh::Attributes;
│ │ │ -
64
│ │ │ -
65
│ │ │ -
│ │ │ - │ │ │ -
67{
│ │ │ -
68 VertexAttributes ( OpenMesh::Attributes::Normal |
│ │ │ - │ │ │ -
70 EdgeAttributes ( OpenMesh::Attributes::Status );
│ │ │ -
71 HalfedgeAttributes( OpenMesh::Attributes::PrevHalfedge );
│ │ │ -
72 FaceAttributes ( OpenMesh::Attributes::Normal |
│ │ │ - │ │ │ -
74};
│ │ │ -
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │ +
63
│ │ │ +
64namespace OpenMesh {
│ │ │ +
65namespace VDPM {
│ │ │ +
66
│ │ │ +
67//== CLASS DEFINITION =========================================================
│ │ │ +
68
│ │ │ +
69
│ │ │ +
│ │ │ + │ │ │ +
73{
│ │ │ +
74private:
│ │ │
75
│ │ │ -
76
│ │ │ - │ │ │ - │ │ │ -
79
│ │ │ -
80
│ │ │ -
81//== CLASS DEFINITION =========================================================
│ │ │ -
82
│ │ │ -
83
│ │ │ +
76 // reference of vertex hierarchy
│ │ │ +
77 VHierarchy *vhierarchy_;
│ │ │ +
78
│ │ │ +
79 // bits buffer (byte units)
│ │ │ +
80 unsigned char *buffer_;
│ │ │ +
81 int buffer_min_;
│ │ │ +
82 size_t buffer_max_;
│ │ │ +
83 int current_pos_;
│ │ │
84
│ │ │ -
│ │ │ - │ │ │ -
86{
│ │ │ -
87 Q_OBJECT
│ │ │ -
88
│ │ │ -
89public:
│ │ │ -
90
│ │ │ - │ │ │ -
92 typedef ProgViewerWidget This;
│ │ │ -
93
│ │ │ -
94
│ │ │ -
95public:
│ │ │ -
│ │ │ -
97 explicit ProgViewerWidget(QWidget* _parent=0)
│ │ │ -
98 : MeshViewerWidgetProgBase(_parent),
│ │ │ -
99 animateRefinement_(true),
│ │ │ -
100 n_base_vertices_(0),
│ │ │ -
101 n_base_faces_(0),
│ │ │ -
102 n_detail_vertices_(0),
│ │ │ -
103 n_max_vertices_(0)
│ │ │ -
104 {
│ │ │ -
105 timer_ = new QTimer(this);
│ │ │ -
106
│ │ │ -
107 connect( timer_, SIGNAL(timeout()), SLOT(animate()) );
│ │ │ -
108 }
│ │ │ -
│ │ │ -
109
│ │ │ -
│ │ │ - │ │ │ -
112 {
│ │ │ -
113 delete timer_;
│ │ │ -
114 }
│ │ │ -
│ │ │ -
115
│ │ │ -
117 void open_prog_mesh(const char* _filename);
│ │ │ -
118
│ │ │ -
119protected slots:
│ │ │ +
85 // window (byte units)
│ │ │ +
86 int window_min_;
│ │ │ +
87 int window_max_;
│ │ │ +
88
│ │ │ +
89
│ │ │ +
90 // # of right shift (bit units)
│ │ │ +
91 unsigned char n_shift_; // [0, 7]
│ │ │ +
92
│ │ │ +
93 unsigned char flag8(unsigned char n_shift) const
│ │ │ +
94 { return 0x80 >> n_shift; }
│ │ │ +
95
│ │ │ +
96 unsigned char flag8(VHierarchyNodeHandle _node_handle) const
│ │ │ +
97 {
│ │ │ +
98 assert(_node_handle.idx() >= 0);
│ │ │ +
99 return 0x80 >> (unsigned int) (_node_handle.idx() % 8);
│ │ │ +
100 }
│ │ │ +
101 int byte_idx(VHierarchyNodeHandle _node_handle) const
│ │ │ +
102 {
│ │ │ +
103 assert(_node_handle.idx() >= 0);
│ │ │ +
104 return _node_handle.idx() / 8;
│ │ │ +
105 }
│ │ │ +
106 int buffer_idx(VHierarchyNodeHandle _node_handle) const
│ │ │ +
107 { return byte_idx(_node_handle) - buffer_min_; }
│ │ │ +
108
│ │ │ +
109 bool before_window(VHierarchyNodeHandle _node_handle) const
│ │ │ +
110 { return (_node_handle.idx()/8 < window_min_) ? true : false; }
│ │ │ +
111
│ │ │ +
112 bool after_window(VHierarchyNodeHandle _node_handle) const
│ │ │ +
113 { return (_node_handle.idx()/8 < window_max_) ? false : true; }
│ │ │ +
114
│ │ │ +
115 bool underflow(VHierarchyNodeHandle _node_handle) const
│ │ │ +
116 { return (_node_handle.idx()/8 < buffer_min_) ? true : false; }
│ │ │ +
117
│ │ │ +
118 bool overflow(VHierarchyNodeHandle _node_handle) const
│ │ │ +
119 { return (_node_handle.idx()/8 < int(buffer_max_) ) ? false : true; }
│ │ │
120
│ │ │ -
121void animate( void );
│ │ │ -
122
│ │ │ -
123private:
│ │ │ -
124
│ │ │ -
125 QTimer *timer_;
│ │ │ -
126
│ │ │ -
127 struct PMInfo
│ │ │ -
128 {
│ │ │ -
129 MyMesh::Point p0;
│ │ │ -
130 MyMesh::VertexHandle v0, v1, vl, vr;
│ │ │ -
131 };
│ │ │ -
132 typedef std::vector<PMInfo> PMInfoContainer;
│ │ │ -
133 typedef PMInfoContainer::iterator PMInfoIter;
│ │ │ -
134
│ │ │ -
136 void refine(unsigned int _n);
│ │ │ -
137
│ │ │ -
139 void coarsen(unsigned int _n);
│ │ │ -
140
│ │ │ -
141 virtual void keyPressEvent(QKeyEvent* _event) override;
│ │ │ -
142
│ │ │ -
143 // mesh data
│ │ │ -
144 bool animateRefinement_;
│ │ │ -
145 PMInfoContainer pminfos_;
│ │ │ -
146 PMInfoIter pmiter_;
│ │ │ -
147 size_t n_base_vertices_, n_base_faces_, n_detail_vertices_;
│ │ │ -
148 size_t n_max_vertices_;
│ │ │ -
149};
│ │ │ -
│ │ │ -
150
│ │ │ -
151
│ │ │ -
152//=============================================================================
│ │ │ -
153#endif // OPENMESHAPPS_PROGVIEWERWIDGET_HH defined
│ │ │ -
154//=============================================================================
│ │ │ -
155
│ │ │ -
This file provides some macros containing attribute usage.
│ │ │ +
121 bool update_buffer(VHierarchyNodeHandle _node_handle);
│ │ │ +
122
│ │ │ +
123public:
│ │ │ + │ │ │ +
125 explicit VHierarchyWindow(VHierarchy &_vhierarchy);
│ │ │ +
126 ~VHierarchyWindow(void);
│ │ │ +
127
│ │ │ +
128 void set_vertex_hierarchy(VHierarchy &_vhierarchy)
│ │ │ +
129 { vhierarchy_ = &_vhierarchy; }
│ │ │ +
130
│ │ │ +
131 void begin()
│ │ │ +
132 {
│ │ │ +
133 int new_window_min = window_min_;
│ │ │ +
134 for (current_pos_=window_min_-buffer_min_;
│ │ │ +
135 current_pos_ < window_size(); ++current_pos_)
│ │ │ +
136 {
│ │ │ +
137 if (buffer_[current_pos_] == 0)
│ │ │ +
138 ++new_window_min;
│ │ │ +
139 else
│ │ │ +
140 {
│ │ │ +
141 n_shift_ = 0;
│ │ │ +
142 while ((buffer_[current_pos_] & flag8(n_shift_)) == 0)
│ │ │ +
143 ++n_shift_;
│ │ │ +
144 break;
│ │ │ +
145 }
│ │ │ +
146 }
│ │ │ +
147 window_min_ = new_window_min;
│ │ │ +
148 }
│ │ │ +
149
│ │ │ +
150 void next()
│ │ │ +
151 {
│ │ │ +
152 ++n_shift_;
│ │ │ +
153 if (n_shift_ == 8)
│ │ │ +
154 {
│ │ │ +
155 n_shift_ = 0;
│ │ │ +
156 ++current_pos_;
│ │ │ +
157 }
│ │ │ +
158
│ │ │ +
159 while (current_pos_ < window_max_-buffer_min_)
│ │ │ +
160 {
│ │ │ +
161 if (buffer_[current_pos_] != 0) // if the current byte has non-zero bits
│ │ │ +
162 {
│ │ │ +
163 while (n_shift_ != 8)
│ │ │ +
164 {
│ │ │ +
165 if ((buffer_[current_pos_] & flag8(n_shift_)) != 0)
│ │ │ +
166 return; // find 1 bit in the current byte
│ │ │ +
167 ++n_shift_;
│ │ │ +
168 }
│ │ │ +
169 }
│ │ │ +
170 n_shift_ = 0;
│ │ │ +
171 ++current_pos_;
│ │ │ +
172 }
│ │ │ +
173 }
│ │ │ +
174 bool end() { return !(current_pos_ < window_max_-buffer_min_); }
│ │ │ +
175
│ │ │ +
176 int window_size() const { return window_max_ - window_min_; }
│ │ │ +
177 size_t buffer_size() const { return buffer_max_ - buffer_min_; }
│ │ │ +
178
│ │ │ +
179 VHierarchyNodeHandle node_handle()
│ │ │ +
180 {
│ │ │ +
181 return VHierarchyNodeHandle(8*(buffer_min_+current_pos_) + (int)n_shift_);
│ │ │ +
182 }
│ │ │ +
183
│ │ │ +
184 void activate(VHierarchyNodeHandle _node_handle)
│ │ │ +
185 {
│ │ │ +
186 update_buffer(_node_handle);
│ │ │ +
187 buffer_[buffer_idx(_node_handle)] |= flag8(_node_handle);
│ │ │ +
188 window_min_ = std::min(window_min_, byte_idx(_node_handle));
│ │ │ +
189 window_max_ = std::max(window_max_, 1+byte_idx(_node_handle));
│ │ │ +
190 }
│ │ │ +
191
│ │ │ +
192
│ │ │ +
193 void inactivate(VHierarchyNodeHandle _node_handle)
│ │ │ +
194 {
│ │ │ +
195 if (is_active(_node_handle) != true) return;
│ │ │ +
196 buffer_[buffer_idx(_node_handle)] ^= flag8(_node_handle);
│ │ │ +
197 }
│ │ │ +
198
│ │ │ +
199
│ │ │ +
200 bool is_active(VHierarchyNodeHandle _node_handle) const
│ │ │ +
201 {
│ │ │ +
202 if (before_window(_node_handle) == true ||
│ │ │ +
203 after_window(_node_handle) == true)
│ │ │ +
204 return false;
│ │ │ +
205 return ((buffer_[buffer_idx(_node_handle)] & flag8(_node_handle)) > 0);
│ │ │ +
206 }
│ │ │ +
207
│ │ │ +
208 void init(VHierarchyNodeHandleContainer &_roots);
│ │ │ +
209 void update_with_vsplit(VHierarchyNodeHandle _parent_handle);
│ │ │ +
210 void update_with_ecol(VHierarchyNodeHandle _parent_handle);
│ │ │ +
211};
│ │ │ +
│ │ │ +
212
│ │ │ +
213//=============================================================================
│ │ │ +
214} // namespace VDPM
│ │ │ +
215} // namespace OpenMesh
│ │ │ +
216//=============================================================================
│ │ │ +
217#endif // OPENMESH_VDPROGMESH_VHIERARCHYWINDOWS_HH
│ │ │ +
218//=============================================================================
│ │ │ +
219
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
This namespace holds per item attributes like normal/color.
│ │ │ -
@ Normal
Add normals to mesh item (vertices/faces)
Definition Attributes.hh:82
│ │ │ -
@ Status
Add status to mesh item (all items)
Definition Attributes.hh:85
│ │ │ -
@ PrevHalfedge
Add storage for previous halfedge (halfedges). The bit is set by default in the DefaultTraits.
Definition Attributes.hh:84
│ │ │ -
Definition ProgViewerWidget.hh:67
│ │ │ -
Definition ProgViewerWidget.hh:86
│ │ │ -
void open_prog_mesh(const char *_filename)
open progressive mesh
Definition ProgViewerWidget.cc:76
│ │ │ -
~ProgViewerWidget()
destructor
Definition ProgViewerWidget.hh:111
│ │ │ -
ProgViewerWidget(QWidget *_parent=0)
default constructor
Definition ProgViewerWidget.hh:97
│ │ │ -
Definition MeshViewerWidgetT.hh:74
│ │ │ -
Definition vdpmanalyzer.cc:143
│ │ │ -
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ -
Base class for all traits.
Definition Traits.hh:122
│ │ │ +
std::vector< VHierarchyNodeHandle > VHierarchyNodeHandleContainer
Container for vertex hierarchy node handles.
Definition VHierarchyNode.hh:183
│ │ │ +
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ +
Keeps the vertex hierarchy build during analyzing a progressive mesh.
Definition VHierarchy.hh:74
│ │ │ +
Handle for vertex hierarchy nodes
Definition VHierarchyNode.hh:78
│ │ │ +
Definition VHierarchyWindow.hh:73
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -ProgViewerWidget.hh │ │ │ │ +VHierarchyWindow.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,180 +47,213 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45#ifndef OPENMESHAPPS_PROGVIEWERWIDGET_HH │ │ │ │ -46#define OPENMESHAPPS_PROGVIEWERWIDGET_HH │ │ │ │ -47 │ │ │ │ -48 │ │ │ │ -49//== INCLUDES │ │ │ │ +44// │ │ │ │ +============================================================================= │ │ │ │ +45// │ │ │ │ +46// CLASS newClass │ │ │ │ +47// │ │ │ │ +48// │ │ │ │ +============================================================================= │ │ │ │ +49 │ │ │ │ +50#ifndef OPENMESH_VDPROGMESH_VHIERARCHYWINDOWS_HH │ │ │ │ +51#define OPENMESH_VDPROGMESH_VHIERARCHYWINDOWS_HH │ │ │ │ +52 │ │ │ │ +53 │ │ │ │ +54//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ -50 │ │ │ │ -51#include │ │ │ │ -52#include │ │ │ │ -53#include │ │ │ │ -54#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_A_t_t_r_i_b_u_t_e_s_._h_h> │ │ │ │ -55#include │ │ │ │ -56 │ │ │ │ -57 │ │ │ │ +55 │ │ │ │ +56#include │ │ │ │ +57#include │ │ │ │ 58 │ │ │ │ -59//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ +59//== FORWARDDECLARATIONS │ │ │ │ +====================================================== │ │ │ │ 60 │ │ │ │ 61 │ │ │ │ -62using namespace _O_p_e_n_M_e_s_h; │ │ │ │ -63using namespace _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s; │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -_6_6struct _P_r_o_g_T_r_a_i_t_s : public _O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s │ │ │ │ -67{ │ │ │ │ -68 VertexAttributes ( _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_r_m_a_l | │ │ │ │ -69 _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s ); │ │ │ │ -70 EdgeAttributes ( _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s ); │ │ │ │ -71 HalfedgeAttributes( _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_P_r_e_v_H_a_l_f_e_d_g_e ); │ │ │ │ -72 FaceAttributes ( _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_r_m_a_l | │ │ │ │ -73 _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s ); │ │ │ │ -74}; │ │ │ │ -75 │ │ │ │ -76 │ │ │ │ -77typedef _O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T_<_P_r_o_g_T_r_a_i_t_s_> _M_y_M_e_s_h; │ │ │ │ -78typedef _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_<_M_y_M_e_s_h_> _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_P_r_o_g_B_a_s_e; │ │ │ │ -79 │ │ │ │ -80 │ │ │ │ -81//== CLASS DEFINITION │ │ │ │ +62//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +63 │ │ │ │ +64namespace _O_p_e_n_M_e_s_h { │ │ │ │ +65namespace VDPM { │ │ │ │ +66 │ │ │ │ +67//== CLASS DEFINITION │ │ │ │ ========================================================= │ │ │ │ -82 │ │ │ │ -83 │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +_7_2class _V_H_i_e_r_a_r_c_h_y_W_i_n_d_o_w │ │ │ │ +73{ │ │ │ │ +74private: │ │ │ │ +75 │ │ │ │ +76 // reference of vertex hierarchy │ │ │ │ +77 _V_H_i_e_r_a_r_c_h_y *vhierarchy_; │ │ │ │ +78 │ │ │ │ +79 // bits buffer (byte units) │ │ │ │ +80 unsigned char *buffer_; │ │ │ │ +81 int buffer_min_; │ │ │ │ +82 size_t buffer_max_; │ │ │ │ +83 int current_pos_; │ │ │ │ 84 │ │ │ │ -_8_5class _P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t : public _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_P_r_o_g_B_a_s_e │ │ │ │ -86{ │ │ │ │ -87 Q_OBJECT │ │ │ │ +85 // window (byte units) │ │ │ │ +86 int window_min_; │ │ │ │ +87 int window_max_; │ │ │ │ 88 │ │ │ │ -89public: │ │ │ │ -90 │ │ │ │ -91 typedef _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_P_r_o_g_B_a_s_e _B_a_s_e; │ │ │ │ -92 typedef _P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t _T_h_i_s; │ │ │ │ -93 │ │ │ │ -94 │ │ │ │ -95public: │ │ │ │ -_9_7 explicit _P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t(QWidget* _parent=0) │ │ │ │ -98 : _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_P_r_o_g_B_a_s_e(_parent), │ │ │ │ -99 animateRefinement_(true), │ │ │ │ -100 n_base_vertices_(0), │ │ │ │ -101 n_base_faces_(0), │ │ │ │ -102 n_detail_vertices_(0), │ │ │ │ -103 n_max_vertices_(0) │ │ │ │ -104 { │ │ │ │ -105 timer_ = new QTimer(this); │ │ │ │ -106 │ │ │ │ -107 connect( timer_, SIGNAL(timeout()), SLOT(animate()) ); │ │ │ │ -108 } │ │ │ │ -109 │ │ │ │ -_1_1_1 _~_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t() │ │ │ │ -112 { │ │ │ │ -113 delete timer_; │ │ │ │ -114 } │ │ │ │ -115 │ │ │ │ -117 void _o_p_e_n___p_r_o_g___m_e_s_h(const char* _filename); │ │ │ │ -118 │ │ │ │ -119protected slots: │ │ │ │ +89 │ │ │ │ +90 // # of right shift (bit units) │ │ │ │ +91 unsigned char n_shift_; // [0, 7] │ │ │ │ +92 │ │ │ │ +93 unsigned char flag8(unsigned char n_shift) const │ │ │ │ +94 { return 0x80 >> n_shift; } │ │ │ │ +95 │ │ │ │ +96 unsigned char flag8(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +97 { │ │ │ │ +98 assert(_node_handle._i_d_x() >= 0); │ │ │ │ +99 return 0x80 >> (unsigned int) (_node_handle._i_d_x() % 8); │ │ │ │ +100 } │ │ │ │ +101 int byte_idx(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +102 { │ │ │ │ +103 assert(_node_handle._i_d_x() >= 0); │ │ │ │ +104 return _node_handle._i_d_x() / 8; │ │ │ │ +105 } │ │ │ │ +106 int buffer_idx(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +107 { return byte_idx(_node_handle) - buffer_min_; } │ │ │ │ +108 │ │ │ │ +109 bool before_window(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +110 { return (_node_handle._i_d_x()/8 < window_min_) ? true : false; } │ │ │ │ +111 │ │ │ │ +112 bool after_window(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +113 { return (_node_handle._i_d_x()/8 < window_max_) ? false : true; } │ │ │ │ +114 │ │ │ │ +115 bool underflow(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +116 { return (_node_handle._i_d_x()/8 < buffer_min_) ? true : false; } │ │ │ │ +117 │ │ │ │ +118 bool overflow(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +119 { return (_node_handle._i_d_x()/8 < int(buffer_max_) ) ? false : true; } │ │ │ │ 120 │ │ │ │ -121void animate( void ); │ │ │ │ +121 bool update_buffer(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle); │ │ │ │ 122 │ │ │ │ -123private: │ │ │ │ -124 │ │ │ │ -125 QTimer *timer_; │ │ │ │ -126 │ │ │ │ -127 struct _P_M_I_n_f_o │ │ │ │ -128 { │ │ │ │ -129 _M_y_M_e_s_h_:_:_P_o_i_n_t p0; │ │ │ │ -130 _M_y_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e v0, v1, vl, vr; │ │ │ │ -131 }; │ │ │ │ -132 typedef std::vector PMInfoContainer; │ │ │ │ -133 typedef PMInfoContainer::iterator PMInfoIter; │ │ │ │ -134 │ │ │ │ -136 void refine(unsigned int _n); │ │ │ │ -137 │ │ │ │ -139 void coarsen(unsigned int _n); │ │ │ │ -140 │ │ │ │ -141 virtual void keyPressEvent(QKeyEvent* _event) override; │ │ │ │ -142 │ │ │ │ -143 // mesh data │ │ │ │ -144 bool animateRefinement_; │ │ │ │ -145 PMInfoContainer pminfos_; │ │ │ │ -146 PMInfoIter pmiter_; │ │ │ │ -147 size_t n_base_vertices_, n_base_faces_, n_detail_vertices_; │ │ │ │ -148 size_t n_max_vertices_; │ │ │ │ -149}; │ │ │ │ -150 │ │ │ │ -151 │ │ │ │ -152// │ │ │ │ +123public: │ │ │ │ +124 _V_H_i_e_r_a_r_c_h_y_W_i_n_d_o_w(); │ │ │ │ +125 explicit _V_H_i_e_r_a_r_c_h_y_W_i_n_d_o_w(_V_H_i_e_r_a_r_c_h_y &_vhierarchy); │ │ │ │ +126 _~_V_H_i_e_r_a_r_c_h_y_W_i_n_d_o_w(void); │ │ │ │ +127 │ │ │ │ +128 void set_vertex_hierarchy(_V_H_i_e_r_a_r_c_h_y &_vhierarchy) │ │ │ │ +129 { vhierarchy_ = &_vhierarchy; } │ │ │ │ +130 │ │ │ │ +131 void begin() │ │ │ │ +132 { │ │ │ │ +133 int new_window_min = window_min_; │ │ │ │ +134 for (current_pos_=window_min_-buffer_min_; │ │ │ │ +135 current_pos_ < window_size(); ++current_pos_) │ │ │ │ +136 { │ │ │ │ +137 if (buffer_[current_pos_] == 0) │ │ │ │ +138 ++new_window_min; │ │ │ │ +139 else │ │ │ │ +140 { │ │ │ │ +141 n_shift_ = 0; │ │ │ │ +142 while ((buffer_[current_pos_] & flag8(n_shift_)) == 0) │ │ │ │ +143 ++n_shift_; │ │ │ │ +144 break; │ │ │ │ +145 } │ │ │ │ +146 } │ │ │ │ +147 window_min_ = new_window_min; │ │ │ │ +148 } │ │ │ │ +149 │ │ │ │ +150 void next() │ │ │ │ +151 { │ │ │ │ +152 ++n_shift_; │ │ │ │ +153 if (n_shift_ == 8) │ │ │ │ +154 { │ │ │ │ +155 n_shift_ = 0; │ │ │ │ +156 ++current_pos_; │ │ │ │ +157 } │ │ │ │ +158 │ │ │ │ +159 while (current_pos_ < window_max_-buffer_min_) │ │ │ │ +160 { │ │ │ │ +161 if (buffer_[current_pos_] != 0) // if the current byte has non-zero bits │ │ │ │ +162 { │ │ │ │ +163 while (n_shift_ != 8) │ │ │ │ +164 { │ │ │ │ +165 if ((buffer_[current_pos_] & flag8(n_shift_)) != 0) │ │ │ │ +166 return; // find 1 bit in the current byte │ │ │ │ +167 ++n_shift_; │ │ │ │ +168 } │ │ │ │ +169 } │ │ │ │ +170 n_shift_ = 0; │ │ │ │ +171 ++current_pos_; │ │ │ │ +172 } │ │ │ │ +173 } │ │ │ │ +174 bool end() { return !(current_pos_ < window_max_-buffer_min_); } │ │ │ │ +175 │ │ │ │ +176 int window_size() const { return window_max_ - window_min_; } │ │ │ │ +177 size_t buffer_size() const { return buffer_max_ - buffer_min_; } │ │ │ │ +178 │ │ │ │ +179 _V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e node_handle() │ │ │ │ +180 { │ │ │ │ +181 return _V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e(8*(buffer_min_+current_pos_) + (int)n_shift_); │ │ │ │ +182 } │ │ │ │ +183 │ │ │ │ +184 void activate(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) │ │ │ │ +185 { │ │ │ │ +186 update_buffer(_node_handle); │ │ │ │ +187 buffer_[buffer_idx(_node_handle)] |= flag8(_node_handle); │ │ │ │ +188 window_min_ = std::min(window_min_, byte_idx(_node_handle)); │ │ │ │ +189 window_max_ = std::max(window_max_, 1+byte_idx(_node_handle)); │ │ │ │ +190 } │ │ │ │ +191 │ │ │ │ +192 │ │ │ │ +193 void inactivate(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) │ │ │ │ +194 { │ │ │ │ +195 if (is_active(_node_handle) != true) return; │ │ │ │ +196 buffer_[buffer_idx(_node_handle)] ^= flag8(_node_handle); │ │ │ │ +197 } │ │ │ │ +198 │ │ │ │ +199 │ │ │ │ +200 bool is_active(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle) const │ │ │ │ +201 { │ │ │ │ +202 if (before_window(_node_handle) == true || │ │ │ │ +203 after_window(_node_handle) == true) │ │ │ │ +204 return false; │ │ │ │ +205 return ((buffer_[buffer_idx(_node_handle)] & flag8(_node_handle)) > 0); │ │ │ │ +206 } │ │ │ │ +207 │ │ │ │ +208 void init(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_C_o_n_t_a_i_n_e_r &_roots); │ │ │ │ +209 void update_with_vsplit(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _parent_handle); │ │ │ │ +210 void update_with_ecol(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _parent_handle); │ │ │ │ +211}; │ │ │ │ +212 │ │ │ │ +213// │ │ │ │ +============================================================================= │ │ │ │ +214} // namespace VDPM │ │ │ │ +215} // namespace OpenMesh │ │ │ │ +216// │ │ │ │ ============================================================================= │ │ │ │ -153#endif // OPENMESHAPPS_PROGVIEWERWIDGET_HH defined │ │ │ │ -154// │ │ │ │ +217#endif // OPENMESH_VDPROGMESH_VHIERARCHYWINDOWS_HH │ │ │ │ +218// │ │ │ │ ============================================================================= │ │ │ │ -155 │ │ │ │ -_A_t_t_r_i_b_u_t_e_s_._h_h │ │ │ │ -This file provides some macros containing attribute usage. │ │ │ │ +219 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s │ │ │ │ -This namespace holds per item attributes like normal/color. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_r_m_a_l │ │ │ │ -@ Normal │ │ │ │ -Add normals to mesh item (vertices/faces) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:82 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s │ │ │ │ -@ Status │ │ │ │ -Add status to mesh item (all items) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_P_r_e_v_H_a_l_f_e_d_g_e │ │ │ │ -@ PrevHalfedge │ │ │ │ -Add storage for previous halfedge (halfedges). The bit is set by default in the │ │ │ │ -DefaultTraits. │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:84 │ │ │ │ -_P_r_o_g_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn ProgViewerWidget.hh:67 │ │ │ │ -_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -DDeeffiinniittiioonn ProgViewerWidget.hh:86 │ │ │ │ -_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t_:_:_o_p_e_n___p_r_o_g___m_e_s_h │ │ │ │ -void open_prog_mesh(const char *_filename) │ │ │ │ -open progressive mesh │ │ │ │ -DDeeffiinniittiioonn ProgViewerWidget.cc:76 │ │ │ │ -_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t_:_:_~_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -~ProgViewerWidget() │ │ │ │ -destructor │ │ │ │ -DDeeffiinniittiioonn ProgViewerWidget.hh:111 │ │ │ │ -_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t_:_:_P_r_o_g_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -ProgViewerWidget(QWidget *_parent=0) │ │ │ │ -default constructor │ │ │ │ -DDeeffiinniittiioonn ProgViewerWidget.hh:97 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT.hh:74 │ │ │ │ -_P_M_I_n_f_o │ │ │ │ -DDeeffiinniittiioonn vdpmanalyzer.cc:143 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Triangle mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Kernel::VertexHandle VertexHandle │ │ │ │ -Handle for referencing the corresponding item. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ -Kernel::Point Point │ │ │ │ -Coordinate type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_D_e_f_a_u_l_t_T_r_a_i_t_s │ │ │ │ -Base class for all traits. │ │ │ │ -DDeeffiinniittiioonn Traits.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ +std::vector< VHierarchyNodeHandle > VHierarchyNodeHandleContainer │ │ │ │ +Container for vertex hierarchy node handles. │ │ │ │ +DDeeffiinniittiioonn VHierarchyNode.hh:183 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ +int idx() const │ │ │ │ +Get the underlying index of this handle. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y │ │ │ │ +Keeps the vertex hierarchy build during analyzing a progressive mesh. │ │ │ │ +DDeeffiinniittiioonn VHierarchy.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e │ │ │ │ +Handle for vertex hierarchy nodes │ │ │ │ +DDeeffiinniittiioonn VHierarchyNode.hh:78 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_W_i_n_d_o_w │ │ │ │ +DDeeffiinniittiioonn VHierarchyWindow.hh:73 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00473_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Apps/VDProgMesh/Synthesizer/VDPMSynthesizerViewerWidget.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Smoother/SmootherT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
VDPMSynthesizerViewerWidget.hh
│ │ │ +
SmootherT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -138,168 +138,190 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44//=============================================================================
│ │ │ -
45//
│ │ │ -
46// CLASS newClass
│ │ │ -
47//
│ │ │
48//=============================================================================
│ │ │ -
49
│ │ │ -
50
│ │ │ -
51#ifndef OPENMESH_VDPROGMESH_VDPMSYNTHESIZERVIEWERWIDGET_HH
│ │ │ -
52#define OPENMESH_VDPROGMESH_VDPMSYNTHESIZERVIEWERWIDGET_HH
│ │ │ +
49//
│ │ │ +
50// CLASS SmootherT
│ │ │ +
51//
│ │ │ +
52//=============================================================================
│ │ │
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
54#ifndef OPENMESH_SMOOTHER_SMOOTHERT_HH
│ │ │ +
55#define OPENMESH_SMOOTHER_SMOOTHERT_HH
│ │ │
56
│ │ │ -
57#include <string>
│ │ │ -
58#include <QTimer>
│ │ │ +
57
│ │ │ +
58//== INCLUDES =================================================================
│ │ │
59
│ │ │ -
60#include <OpenMesh/Core/IO/MeshIO.hh>
│ │ │ -
61#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ -
62#include <OpenMesh/Apps/QtViewer/MeshViewerWidgetT.hh>
│ │ │ +
60#include <OpenMesh/Core/System/config.hh>
│ │ │ +
61#include <OpenMesh/Core/Utils/Property.hh>
│ │ │ +
62#include <OpenMesh/Core/Utils/Noncopyable.hh>
│ │ │
63
│ │ │ -
64#include <OpenMesh/Tools/VDPM/MeshTraits.hh>
│ │ │ -
65#include <OpenMesh/Tools/VDPM/StreamingDef.hh>
│ │ │ -
66#include <OpenMesh/Tools/VDPM/ViewingParameters.hh>
│ │ │ -
67#include <OpenMesh/Tools/VDPM/VHierarchy.hh>
│ │ │ -
68#include <OpenMesh/Tools/VDPM/VFront.hh>
│ │ │ -
69
│ │ │ +
64//== FORWARDDECLARATIONS ======================================================
│ │ │ +
65
│ │ │ +
66//== NAMESPACES ===============================================================
│ │ │ +
67
│ │ │ +
68namespace OpenMesh {
│ │ │ +
69namespace Smoother {
│ │ │
70
│ │ │ -
71//== FORWARDDECLARATIONS ======================================================
│ │ │ +
71//== CLASS DEFINITION =========================================================
│ │ │
72
│ │ │ -
73
│ │ │ -
74//== NAMESPACES ===============================================================
│ │ │ -
75
│ │ │ -
76namespace OpenMesh {
│ │ │ -
77
│ │ │ -
78
│ │ │ -
79//== CLASS DEFINITION =========================================================
│ │ │ -
80
│ │ │ -
81
│ │ │ -
82typedef TriMesh_ArrayKernelT<VDPM::MeshTraits> VDPMMesh;
│ │ │ - │ │ │ -
84
│ │ │ +
75template <class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
77{
│ │ │ +
78public:
│ │ │ +
79
│ │ │ +
80 typedef typename Mesh::Scalar Scalar;
│ │ │ +
81 typedef typename Mesh::Point Point;
│ │ │ +
82 typedef typename Mesh::Normal NormalType;
│ │ │ +
83 typedef typename Mesh::VertexHandle VertexHandle;
│ │ │ +
84 typedef typename Mesh::EdgeHandle EdgeHandle;
│ │ │
85
│ │ │ -
86 // using view dependent progressive mesh
│ │ │ -
87
│ │ │ -
88 using VDPM::Plane3d;
│ │ │ -
89 using VDPM::VFront;
│ │ │ -
90 using VDPM::VHierarchy;
│ │ │ -
91 using VDPM::VHierarchyNode;
│ │ │ -
92 using VDPM::VHierarchyNodeIndex;
│ │ │ -
93 using VDPM::VHierarchyNodeHandle;
│ │ │ - │ │ │ -
95 using VDPM::ViewingParameters;
│ │ │ -
96
│ │ │ -
97
│ │ │ -
98//== CLASS DEFINITION =========================================================
│ │ │ -
99
│ │ │ +
86 // initialize smoother
│ │ │ +
│ │ │ +
87 enum Component {
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
91 };
│ │ │ +
│ │ │ +
92
│ │ │ +
93 enum Continuity {
│ │ │ +
94 C0,
│ │ │ +
95 C1,
│ │ │ +
96 C2
│ │ │ +
97 };
│ │ │ +
98
│ │ │ +
99public:
│ │ │
100
│ │ │ -
│ │ │ - │ │ │ -
102{
│ │ │ -
103public:
│ │ │ -
104
│ │ │ -
105 typedef MeshViewerWidget Base;
│ │ │ -
106
│ │ │ -
107public:
│ │ │ +
105 SmootherT( Mesh& _mesh );
│ │ │ +
106 virtual ~SmootherT();
│ │ │ +
107
│ │ │
108
│ │ │ -
109 explicit VDPMSynthesizerViewerWidget(QWidget* _parent=0, const char* _name=0);
│ │ │ +
109public:
│ │ │
110
│ │ │ - │ │ │ -
112
│ │ │ -
114 void open_vd_prog_mesh(const char* _filename);
│ │ │ +
111 //===========================================================================
│ │ │ +
114 //===========================================================================
│ │ │
115
│ │ │ -
116
│ │ │ -
117private:
│ │ │ -
118
│ │ │ -
119 QString qFilename_;
│ │ │ -
120 VHierarchy vhierarchy_;
│ │ │ -
121 VFront vfront_;
│ │ │ -
122 ViewingParameters viewing_parameters_;
│ │ │ -
123 float kappa_square_;
│ │ │ -
124 bool adaptive_mode_;
│ │ │ -
125
│ │ │ -
126 unsigned int n_base_vertices_;
│ │ │ -
127 unsigned int n_base_edges_;
│ │ │ -
128 unsigned int n_base_faces_;
│ │ │ -
129 unsigned int n_details_;
│ │ │ -
130
│ │ │ -
131
│ │ │ -
132private:
│ │ │ -
133
│ │ │ -
134 bool outside_view_frustum(const OpenMesh::Vec3f &pos, float radius);
│ │ │ -
135
│ │ │ -
136 bool oriented_away(float sin_square,
│ │ │ -
137 float distance_square,
│ │ │ -
138 float product_value);
│ │ │ -
139
│ │ │ -
140 bool screen_space_error(float mue_square,
│ │ │ -
141 float sigma_square,
│ │ │ -
142 float distance_square,
│ │ │ -
143 float product_value);
│ │ │ -
144
│ │ │ -
145 void update_viewing_parameters();
│ │ │ -
146
│ │ │ -
147 virtual void keyPressEvent(QKeyEvent* _event) override;
│ │ │ -
148
│ │ │ -
149protected:
│ │ │ +
120 void initialize(Component _comp, Continuity _cont);
│ │ │ +
121
│ │ │ +
123 virtual void smooth(unsigned int _n);
│ │ │ +
124
│ │ │ +
127 //===========================================================================
│ │ │ +
130 //===========================================================================
│ │ │ +
131
│ │ │ +
141 void set_relative_local_error(Scalar _err);
│ │ │ +
142
│ │ │ +
149 void set_absolute_local_error(Scalar _err);
│ │ │
150
│ │ │ -
152 virtual void draw_scene(const std::string& _draw_mode) override;
│ │ │ -
153
│ │ │ -
154public:
│ │ │ -
155
│ │ │ -
156 void adaptive_refinement();
│ │ │ -
157
│ │ │ -
158 bool qrefine(VHierarchyNodeHandle _node_handle);
│ │ │ -
159
│ │ │ -
160 void force_vsplit(VHierarchyNodeHandle _node_handle);
│ │ │ -
161
│ │ │ -
162 bool ecol_legal(VHierarchyNodeHandle _parent_handle,
│ │ │ - │ │ │ -
164
│ │ │ -
165 void get_active_cuts(VHierarchyNodeHandle _node_handle,
│ │ │ - │ │ │ -
167
│ │ │ -
168 void vsplit(VHierarchyNodeHandle _node_handle,
│ │ │ - │ │ │ -
170
│ │ │ -
171 void ecol(VHierarchyNodeHandle _parent_handle,
│ │ │ -
172 const VDPMMesh::HalfedgeHandle& v0v1);
│ │ │ + │ │ │ +
156
│ │ │ +
167 void skip_features( bool _state ){ skip_features_ = _state; };
│ │ │ +
168
│ │ │ +
169
│ │ │ +
172private:
│ │ │
173
│ │ │ -
174 void init_vfront();
│ │ │ -
175
│ │ │ -
176};
│ │ │ +
184 void set_active_vertices();
│ │ │ +
185
│ │ │ +
186 // single steps of smoothing
│ │ │ +
187 void compute_new_positions();
│ │ │ +
188 void project_to_tangent_plane();
│ │ │ +
189 void local_error_check();
│ │ │ +
190 void move_points();
│ │ │ +
191
│ │ │ +
192
│ │ │ +
193
│ │ │ +
194protected:
│ │ │ +
195
│ │ │ +
196 // override these
│ │ │ +
197 virtual void compute_new_positions_C0() = 0;
│ │ │ +
198 virtual void compute_new_positions_C1() = 0;
│ │ │ +
199
│ │ │ +
200
│ │ │ +
201
│ │ │ +
202protected:
│ │ │ +
203
│ │ │ +
204 // misc helpers
│ │ │ +
205
│ │ │ +
206 const Point& orig_position(VertexHandle _vh) const
│ │ │ +
207 { return mesh_.property(original_positions_, _vh); }
│ │ │ +
208
│ │ │ +
209 const NormalType& orig_normal(VertexHandle _vh) const
│ │ │ +
210 { return mesh_.property(original_normals_, _vh); }
│ │ │ +
211
│ │ │ +
212 const Point& new_position(VertexHandle _vh) const
│ │ │ +
213 { return mesh_.property(new_positions_, _vh); }
│ │ │ +
214
│ │ │ +
215 void set_new_position(VertexHandle _vh, const Point& _p)
│ │ │ +
216 { mesh_.property(new_positions_, _vh) = _p; }
│ │ │ +
217
│ │ │ +
218 bool is_active(VertexHandle _vh) const
│ │ │ +
219 { return mesh_.property(is_active_, _vh); }
│ │ │ +
220
│ │ │ +
221 Component component() const { return component_; }
│ │ │ +
222 Continuity continuity() const { return continuity_; }
│ │ │ +
223
│ │ │ +
224protected:
│ │ │ +
225
│ │ │ +
226 Mesh& mesh_;
│ │ │ +
227 bool skip_features_;
│ │ │ +
228
│ │ │ +
229
│ │ │ +
230private:
│ │ │ +
231
│ │ │ +
232 Scalar tolerance_;
│ │ │ +
233 Scalar normal_deviation_;
│ │ │ +
234 Component component_;
│ │ │ +
235 Continuity continuity_;
│ │ │ +
236
│ │ │ +
237 OpenMesh::VPropHandleT<Point> original_positions_;
│ │ │ +
238 OpenMesh::VPropHandleT<NormalType> original_normals_;
│ │ │ +
239 OpenMesh::VPropHandleT<Point> new_positions_;
│ │ │ + │ │ │ +
241};
│ │ │
│ │ │ -
177
│ │ │ -
178
│ │ │ -
179//=============================================================================
│ │ │ -
180} // namespace OpenMesh
│ │ │ -
181//=============================================================================
│ │ │ -
182#endif // OPENMESHAPPS_VDPMSYNTHESIZERVIEWERWIDGET_HH defined
│ │ │ -
183//=============================================================================
│ │ │ +
242
│ │ │ +
243
│ │ │ +
244//=============================================================================
│ │ │ +
245} // namespace Smoother
│ │ │ +
246} // namespace OpenMesh
│ │ │ +
247//=============================================================================
│ │ │ +
248#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SMOOTHERT_C)
│ │ │ +
249#define OPENMESH_SMOOTHERT_TEMPLATES
│ │ │ +
250#include "SmootherT_impl.hh"
│ │ │ +
251#endif
│ │ │ +
252//=============================================================================
│ │ │ +
253#endif // OPENMESH_SMOOTHER_SMOOTHERT_HH defined
│ │ │ +
254//=============================================================================
│ │ │ +
255
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
std::vector< VHierarchyNodeHandle > VHierarchyNodeHandleContainer
Container for vertex hierarchy node handles.
Definition VHierarchyNode.hh:183
│ │ │ -
Definition MeshViewerWidget.hh:76
│ │ │ -
Definition MeshViewerWidgetT.hh:74
│ │ │ -
Definition VDPMSynthesizerViewerWidget.hh:102
│ │ │ -
void open_vd_prog_mesh(const char *_filename)
open view-dependent progressive mesh
Definition VDPMSynthesizerViewerWidget.cc:383
│ │ │ -
virtual void draw_scene(const std::string &_draw_mode) override
inherited drawing method
Definition VDPMSynthesizerViewerWidget.cc:100
│ │ │ - │ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ -
Active nodes in vertex hierarchy.
Definition VFront.hh:76
│ │ │ -
Keeps the vertex hierarchy build during analyzing a progressive mesh.
Definition VHierarchy.hh:74
│ │ │ -
Handle for vertex hierarchy nodes
Definition VHierarchyNode.hh:78
│ │ │ -
Definition ViewingParameters.hh:75
│ │ │ +
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
This class demonstrates the non copyable idiom.
Definition Noncopyable.hh:72
│ │ │ +
Handle representing a vertex property.
Definition Property.hh:417
│ │ │ +
Base class for smoothing algorithms.
Definition SmootherT.hh:77
│ │ │ +
virtual void smooth(unsigned int _n)
Do _n smoothing iterations.
Definition SmootherT_impl.hh:302
│ │ │ +
Component
Definition SmootherT.hh:87
│ │ │ +
@ Tangential_and_Normal
Smooth tangential and normal direction.
Definition SmootherT.hh:90
│ │ │ +
@ Tangential
Smooth tangential direction.
Definition SmootherT.hh:88
│ │ │ +
@ Normal
Smooth normal direction.
Definition SmootherT.hh:89
│ │ │ +
void initialize(Component _comp, Continuity _cont)
Initialize smoother.
Definition SmootherT_impl.hh:122
│ │ │ +
void set_absolute_local_error(Scalar _err)
Set local error as an absolute value.
Definition SmootherT_impl.hh:278
│ │ │ +
void disable_local_error_check()
Disable error control of the smoother.
Definition SmootherT_impl.hh:290
│ │ │ +
void set_relative_local_error(Scalar _err)
Set local error relative to bounding box.
Definition SmootherT_impl.hh:248
│ │ │ +
void skip_features(bool _state)
enable or disable feature handling
Definition SmootherT.hh:167
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -VDPMSynthesizerViewerWidget.hh │ │ │ │ +SmootherT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,201 +48,253 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44// │ │ │ │ -============================================================================= │ │ │ │ -45// │ │ │ │ -46// CLASS newClass │ │ │ │ -47// │ │ │ │ 48// │ │ │ │ ============================================================================= │ │ │ │ -49 │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_VDPROGMESH_VDPMSYNTHESIZERVIEWERWIDGET_HH │ │ │ │ -52#define OPENMESH_VDPROGMESH_VDPMSYNTHESIZERVIEWERWIDGET_HH │ │ │ │ +49// │ │ │ │ +50// CLASS SmootherT │ │ │ │ +51// │ │ │ │ +52// │ │ │ │ +============================================================================= │ │ │ │ 53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +54#ifndef OPENMESH_SMOOTHER_SMOOTHERT_HH │ │ │ │ +55#define OPENMESH_SMOOTHER_SMOOTHERT_HH │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ +57 │ │ │ │ +58//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 59 │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include │ │ │ │ 63 │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66#include │ │ │ │ -67#include │ │ │ │ -68#include │ │ │ │ -69 │ │ │ │ -70 │ │ │ │ -71//== FORWARDDECLARATIONS │ │ │ │ +64//== FORWARDDECLARATIONS │ │ │ │ ====================================================== │ │ │ │ -72 │ │ │ │ -73 │ │ │ │ -74//== NAMESPACES │ │ │ │ +65 │ │ │ │ +66//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -75 │ │ │ │ -76namespace _O_p_e_n_M_e_s_h { │ │ │ │ -77 │ │ │ │ -78 │ │ │ │ -79//== CLASS DEFINITION │ │ │ │ +67 │ │ │ │ +68namespace _O_p_e_n_M_e_s_h { │ │ │ │ +69namespace Smoother { │ │ │ │ +70 │ │ │ │ +71//== CLASS DEFINITION │ │ │ │ ========================================================= │ │ │ │ -80 │ │ │ │ -81 │ │ │ │ -82typedef TriMesh_ArrayKernelT VDPMMesh; │ │ │ │ -83typedef _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_<_V_D_P_M_M_e_s_h_> _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t; │ │ │ │ -84 │ │ │ │ +72 │ │ │ │ +75template │ │ │ │ +_7_6class _S_m_o_o_t_h_e_r_T : private _U_t_i_l_s_:_:_N_o_n_c_o_p_y_a_b_l_e │ │ │ │ +77{ │ │ │ │ +78public: │ │ │ │ +79 │ │ │ │ +80 typedef typename _M_e_s_h_:_:_S_c_a_l_a_r Scalar; │ │ │ │ +81 typedef typename _M_e_s_h_:_:_P_o_i_n_t Point; │ │ │ │ +82 typedef typename _M_e_s_h_:_:_N_o_r_m_a_l NormalType; │ │ │ │ +83 typedef typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e VertexHandle; │ │ │ │ +84 typedef typename _M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e EdgeHandle; │ │ │ │ 85 │ │ │ │ -86 // using view dependent progressive mesh │ │ │ │ -87 │ │ │ │ -88 using VDPM::Plane3d; │ │ │ │ -89 using VDPM::VFront; │ │ │ │ -90 using VDPM::VHierarchy; │ │ │ │ -91 using VDPM::VHierarchyNode; │ │ │ │ -92 using VDPM::VHierarchyNodeIndex; │ │ │ │ -93 using VDPM::VHierarchyNodeHandle; │ │ │ │ -94 using _V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_C_o_n_t_a_i_n_e_r; │ │ │ │ -95 using VDPM::ViewingParameters; │ │ │ │ -96 │ │ │ │ -97 │ │ │ │ -98//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -99 │ │ │ │ +86 // initialize smoother │ │ │ │ +_8_7 enum _C_o_m_p_o_n_e_n_t { │ │ │ │ +_8_8 _T_a_n_g_e_n_t_i_a_l, │ │ │ │ +_8_9 _N_o_r_m_a_l, │ │ │ │ +90 _T_a_n_g_e_n_t_i_a_l___a_n_d___N_o_r_m_a_l │ │ │ │ +_9_1 }; │ │ │ │ +92 │ │ │ │ +93 enum Continuity { │ │ │ │ +94 C0, │ │ │ │ +95 C1, │ │ │ │ +96 C2 │ │ │ │ +97 }; │ │ │ │ +98 │ │ │ │ +99public: │ │ │ │ 100 │ │ │ │ -_1_0_1class _V_D_P_M_S_y_n_t_h_e_s_i_z_e_r_V_i_e_w_e_r_W_i_d_g_e_t : public _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -102{ │ │ │ │ -103public: │ │ │ │ -104 │ │ │ │ -105 typedef _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t _B_a_s_e; │ │ │ │ -106 │ │ │ │ -107public: │ │ │ │ +105 SmootherT( _M_e_s_h& _mesh ); │ │ │ │ +106 virtual ~SmootherT(); │ │ │ │ +107 │ │ │ │ 108 │ │ │ │ -109 explicit _V_D_P_M_S_y_n_t_h_e_s_i_z_e_r_V_i_e_w_e_r_W_i_d_g_e_t(QWidget* _parent=0, const char* │ │ │ │ -_name=0); │ │ │ │ +109public: │ │ │ │ 110 │ │ │ │ -111 _~_V_D_P_M_S_y_n_t_h_e_s_i_z_e_r_V_i_e_w_e_r_W_i_d_g_e_t(); │ │ │ │ -112 │ │ │ │ -114 void _o_p_e_n___v_d___p_r_o_g___m_e_s_h(const char* _filename); │ │ │ │ +111 // │ │ │ │ +=========================================================================== │ │ │ │ +114 // │ │ │ │ +=========================================================================== │ │ │ │ 115 │ │ │ │ -116 │ │ │ │ -117private: │ │ │ │ -118 │ │ │ │ -119 QString qFilename_; │ │ │ │ -120 _V_H_i_e_r_a_r_c_h_y vhierarchy_; │ │ │ │ -121 _V_F_r_o_n_t vfront_; │ │ │ │ -122 _V_i_e_w_i_n_g_P_a_r_a_m_e_t_e_r_s viewing_parameters_; │ │ │ │ -123 float kappa_square_; │ │ │ │ -124 bool adaptive_mode_; │ │ │ │ -125 │ │ │ │ -126 unsigned int n_base_vertices_; │ │ │ │ -127 unsigned int n_base_edges_; │ │ │ │ -128 unsigned int n_base_faces_; │ │ │ │ -129 unsigned int n_details_; │ │ │ │ -130 │ │ │ │ +120 void _i_n_i_t_i_a_l_i_z_e(_C_o_m_p_o_n_e_n_t _comp, Continuity _cont); │ │ │ │ +121 │ │ │ │ +123 virtual void _s_m_o_o_t_h(unsigned int _n); │ │ │ │ +124 │ │ │ │ +127 // │ │ │ │ +=========================================================================== │ │ │ │ +130 // │ │ │ │ +=========================================================================== │ │ │ │ 131 │ │ │ │ -132private: │ │ │ │ -133 │ │ │ │ -134 bool outside_view_frustum(const _O_p_e_n_M_e_s_h_:_:_V_e_c_3_f &pos, float radius); │ │ │ │ -135 │ │ │ │ -136 bool oriented_away(float sin_square, │ │ │ │ -137 float distance_square, │ │ │ │ -138 float product_value); │ │ │ │ -139 │ │ │ │ -140 bool screen_space_error(float mue_square, │ │ │ │ -141 float sigma_square, │ │ │ │ -142 float distance_square, │ │ │ │ -143 float product_value); │ │ │ │ -144 │ │ │ │ -145 void update_viewing_parameters(); │ │ │ │ -146 │ │ │ │ -147 virtual void keyPressEvent(QKeyEvent* _event) override; │ │ │ │ -148 │ │ │ │ -149protected: │ │ │ │ +141 void _s_e_t___r_e_l_a_t_i_v_e___l_o_c_a_l___e_r_r_o_r(Scalar _err); │ │ │ │ +142 │ │ │ │ +149 void _s_e_t___a_b_s_o_l_u_t_e___l_o_c_a_l___e_r_r_o_r(Scalar _err); │ │ │ │ 150 │ │ │ │ -152 virtual void _d_r_a_w___s_c_e_n_e(const std::string& _draw_mode) override; │ │ │ │ -153 │ │ │ │ -154public: │ │ │ │ -155 │ │ │ │ -156 void adaptive_refinement(); │ │ │ │ -157 │ │ │ │ -158 bool qrefine(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle); │ │ │ │ -159 │ │ │ │ -160 void force_vsplit(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle); │ │ │ │ -161 │ │ │ │ -162 bool ecol_legal(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _parent_handle, │ │ │ │ -163 _V_D_P_M_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& v0v1); │ │ │ │ -164 │ │ │ │ -165 void get_active_cuts(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle, │ │ │ │ -166 _V_D_P_M_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e &vl, _V_D_P_M_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e &vr); │ │ │ │ -167 │ │ │ │ -168 void vsplit(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _node_handle, │ │ │ │ -169 _V_D_P_M_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e vl, _V_D_P_M_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e vr); │ │ │ │ -170 │ │ │ │ -171 void ecol(_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e _parent_handle, │ │ │ │ -172 const _V_D_P_M_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& v0v1); │ │ │ │ +155 void _d_i_s_a_b_l_e___l_o_c_a_l___e_r_r_o_r___c_h_e_c_k(); │ │ │ │ +156 │ │ │ │ +_1_6_7 void _s_k_i_p___f_e_a_t_u_r_e_s( bool _state ){ skip_features_ = _state; }; │ │ │ │ +168 │ │ │ │ +169 │ │ │ │ +172private: │ │ │ │ 173 │ │ │ │ -174 void init_vfront(); │ │ │ │ -175 │ │ │ │ -176}; │ │ │ │ -177 │ │ │ │ -178 │ │ │ │ -179// │ │ │ │ +184 void set_active_vertices(); │ │ │ │ +185 │ │ │ │ +186 // single steps of smoothing │ │ │ │ +187 void compute_new_positions(); │ │ │ │ +188 void project_to_tangent_plane(); │ │ │ │ +189 void local_error_check(); │ │ │ │ +190 void move_points(); │ │ │ │ +191 │ │ │ │ +192 │ │ │ │ +193 │ │ │ │ +194protected: │ │ │ │ +195 │ │ │ │ +196 // override these │ │ │ │ +197 virtual void compute_new_positions_C0() = 0; │ │ │ │ +198 virtual void compute_new_positions_C1() = 0; │ │ │ │ +199 │ │ │ │ +200 │ │ │ │ +201 │ │ │ │ +202protected: │ │ │ │ +203 │ │ │ │ +204 // misc helpers │ │ │ │ +205 │ │ │ │ +206 const Point& orig_position(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +207 { return mesh_.property(original_positions_, _vh); } │ │ │ │ +208 │ │ │ │ +209 const NormalType& orig_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +210 { return mesh_.property(original_normals_, _vh); } │ │ │ │ +211 │ │ │ │ +212 const Point& new_position(VertexHandle _vh) const │ │ │ │ +213 { return mesh_.property(new_positions_, _vh); } │ │ │ │ +214 │ │ │ │ +215 void set_new_position(VertexHandle _vh, const Point& _p) │ │ │ │ +216 { mesh_.property(new_positions_, _vh) = _p; } │ │ │ │ +217 │ │ │ │ +218 bool is_active(VertexHandle _vh) const │ │ │ │ +219 { return mesh_.property(is_active_, _vh); } │ │ │ │ +220 │ │ │ │ +221 _C_o_m_p_o_n_e_n_t component() const { return component_; } │ │ │ │ +222 Continuity continuity() const { return continuity_; } │ │ │ │ +223 │ │ │ │ +224protected: │ │ │ │ +225 │ │ │ │ +226 Mesh& mesh_; │ │ │ │ +227 bool skip_features_; │ │ │ │ +228 │ │ │ │ +229 │ │ │ │ +230private: │ │ │ │ +231 │ │ │ │ +232 Scalar tolerance_; │ │ │ │ +233 Scalar normal_deviation_; │ │ │ │ +234 _C_o_m_p_o_n_e_n_t component_; │ │ │ │ +235 Continuity continuity_; │ │ │ │ +236 │ │ │ │ +237 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_P_o_i_n_t_> original_positions_; │ │ │ │ +238 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_N_o_r_m_a_l_T_y_p_e_> original_normals_; │ │ │ │ +239 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_P_o_i_n_t_> new_positions_; │ │ │ │ +240 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_b_o_o_l_> is_active_; │ │ │ │ +241}; │ │ │ │ +242 │ │ │ │ +243 │ │ │ │ +244// │ │ │ │ ============================================================================= │ │ │ │ -180} // namespace OpenMesh │ │ │ │ -181// │ │ │ │ +245} // namespace Smoother │ │ │ │ +246} // namespace OpenMesh │ │ │ │ +247// │ │ │ │ ============================================================================= │ │ │ │ -182#endif // OPENMESHAPPS_VDPMSYNTHESIZERVIEWERWIDGET_HH defined │ │ │ │ -183// │ │ │ │ +248#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SMOOTHERT_C) │ │ │ │ +249#define OPENMESH_SMOOTHERT_TEMPLATES │ │ │ │ +250#include "_S_m_o_o_t_h_e_r_T___i_m_p_l_._h_h" │ │ │ │ +251#endif │ │ │ │ +252// │ │ │ │ ============================================================================= │ │ │ │ +253#endif // OPENMESH_SMOOTHER_SMOOTHERT_HH defined │ │ │ │ +254// │ │ │ │ +============================================================================= │ │ │ │ +255 │ │ │ │ +_S_m_o_o_t_h_e_r_T___i_m_p_l_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e_C_o_n_t_a_i_n_e_r │ │ │ │ -std::vector< VHierarchyNodeHandle > VHierarchyNodeHandleContainer │ │ │ │ -Container for vertex hierarchy node handles. │ │ │ │ -DDeeffiinniittiioonn VHierarchyNode.hh:183 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidget.hh:76 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_S_y_n_t_h_e_s_i_z_e_r_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -DDeeffiinniittiioonn VDPMSynthesizerViewerWidget.hh:102 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_S_y_n_t_h_e_s_i_z_e_r_V_i_e_w_e_r_W_i_d_g_e_t_:_:_o_p_e_n___v_d___p_r_o_g___m_e_s_h │ │ │ │ -void open_vd_prog_mesh(const char *_filename) │ │ │ │ -open view-dependent progressive mesh │ │ │ │ -DDeeffiinniittiioonn VDPMSynthesizerViewerWidget.cc:383 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_S_y_n_t_h_e_s_i_z_e_r_V_i_e_w_e_r_W_i_d_g_e_t_:_:_d_r_a_w___s_c_e_n_e │ │ │ │ -virtual void draw_scene(const std::string &_draw_mode) override │ │ │ │ -inherited drawing method │ │ │ │ -DDeeffiinniittiioonn VDPMSynthesizerViewerWidget.cc:100 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Kernel::VertexHandle VertexHandle │ │ │ │ Handle for referencing the corresponding item. │ │ │ │ DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ +Kernel::Scalar Scalar │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_F_r_o_n_t │ │ │ │ -Active nodes in vertex hierarchy. │ │ │ │ -DDeeffiinniittiioonn VFront.hh:76 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y │ │ │ │ -Keeps the vertex hierarchy build during analyzing a progressive mesh. │ │ │ │ -DDeeffiinniittiioonn VHierarchy.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_H_i_e_r_a_r_c_h_y_N_o_d_e_H_a_n_d_l_e │ │ │ │ -Handle for vertex hierarchy nodes │ │ │ │ -DDeeffiinniittiioonn VHierarchyNode.hh:78 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_V_i_e_w_i_n_g_P_a_r_a_m_e_t_e_r_s │ │ │ │ -DDeeffiinniittiioonn ViewingParameters.hh:75 │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ +Kernel::Normal Normal │ │ │ │ +Normal type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_N_o_n_c_o_p_y_a_b_l_e │ │ │ │ +This class demonstrates the non copyable idiom. │ │ │ │ +DDeeffiinniittiioonn Noncopyable.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a vertex property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:417 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T │ │ │ │ +Base class for smoothing algorithms. │ │ │ │ +DDeeffiinniittiioonn SmootherT.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_s_m_o_o_t_h │ │ │ │ +virtual void smooth(unsigned int _n) │ │ │ │ +Do _n smoothing iterations. │ │ │ │ +DDeeffiinniittiioonn SmootherT_impl.hh:302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_C_o_m_p_o_n_e_n_t │ │ │ │ +Component │ │ │ │ +DDeeffiinniittiioonn SmootherT.hh:87 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_T_a_n_g_e_n_t_i_a_l___a_n_d___N_o_r_m_a_l │ │ │ │ +@ Tangential_and_Normal │ │ │ │ +Smooth tangential and normal direction. │ │ │ │ +DDeeffiinniittiioonn SmootherT.hh:90 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_T_a_n_g_e_n_t_i_a_l │ │ │ │ +@ Tangential │ │ │ │ +Smooth tangential direction. │ │ │ │ +DDeeffiinniittiioonn SmootherT.hh:88 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_N_o_r_m_a_l │ │ │ │ +@ Normal │ │ │ │ +Smooth normal direction. │ │ │ │ +DDeeffiinniittiioonn SmootherT.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_i_n_i_t_i_a_l_i_z_e │ │ │ │ +void initialize(Component _comp, Continuity _cont) │ │ │ │ +Initialize smoother. │ │ │ │ +DDeeffiinniittiioonn SmootherT_impl.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_s_e_t___a_b_s_o_l_u_t_e___l_o_c_a_l___e_r_r_o_r │ │ │ │ +void set_absolute_local_error(Scalar _err) │ │ │ │ +Set local error as an absolute value. │ │ │ │ +DDeeffiinniittiioonn SmootherT_impl.hh:278 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_d_i_s_a_b_l_e___l_o_c_a_l___e_r_r_o_r___c_h_e_c_k │ │ │ │ +void disable_local_error_check() │ │ │ │ +Disable error control of the smoother. │ │ │ │ +DDeeffiinniittiioonn SmootherT_impl.hh:290 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_s_e_t___r_e_l_a_t_i_v_e___l_o_c_a_l___e_r_r_o_r │ │ │ │ +void set_relative_local_error(Scalar _err) │ │ │ │ +Set local error relative to bounding box. │ │ │ │ +DDeeffiinniittiioonn SmootherT_impl.hh:248 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_o_o_t_h_e_r_:_:_S_m_o_o_t_h_e_r_T_:_:_s_k_i_p___f_e_a_t_u_r_e_s │ │ │ │ +void skip_features(bool _state) │ │ │ │ +enable or disable feature handling │ │ │ │ +DDeeffiinniittiioonn SmootherT.hh:167 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00500_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Apps/QtViewer/MeshViewerWidgetT.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Adaptive/Composite/RulesT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
MeshViewerWidgetT.hh
│ │ │ +
RulesT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -138,192 +138,496 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45#pragma once
│ │ │ -
46
│ │ │ -
47
│ │ │ -
48//== INCLUDES =================================================================
│ │ │ -
49
│ │ │ -
50#include <string>
│ │ │ -
51#include <OpenMesh/Core/IO/MeshIO.hh>
│ │ │ -
52#include <OpenMesh/Core/IO/Options.hh>
│ │ │ -
53#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
54#include <OpenMesh/Core/Utils/color_cast.hh>
│ │ │ - │ │ │ -
56#include <OpenMesh/Tools/Utils/StripifierT.hh>
│ │ │ - │ │ │ -
58#include <OpenMesh/Apps/QtViewer/QGLViewerWidget.hh>
│ │ │ -
59
│ │ │ -
60#ifndef __APPLE__
│ │ │ -
61 #include <GL/gl.h>
│ │ │ -
62#endif
│ │ │ -
63
│ │ │ -
64//== FORWARDS =================================================================
│ │ │ +
49//=============================================================================
│ │ │ +
50//
│ │ │ +
51// Composite Subdivision and Averaging Rules
│ │ │ +
52//
│ │ │ +
53//=============================================================================
│ │ │ +
54
│ │ │ +
55#ifndef OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH
│ │ │ +
56#define OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH
│ │ │ +
57
│ │ │ +
58
│ │ │ +
59//== INCLUDES =================================================================
│ │ │ +
60
│ │ │ +
61#include <OpenMesh/Core/System/config.hh>
│ │ │ +
62#include <OpenMesh/Tools/Subdivider/Adaptive/Composite/RuleInterfaceT.hh>
│ │ │ +
63// -------------------- STL
│ │ │ +
64#include <vector>
│ │ │
65
│ │ │ -
66class QImage;
│ │ │ -
67
│ │ │ +
66
│ │ │ +
67//== NAMESPACE ================================================================
│ │ │
68
│ │ │ -
69//== CLASS DEFINITION =========================================================
│ │ │ -
70
│ │ │ -
71
│ │ │ -
72template <typename M>
│ │ │ -
│ │ │ - │ │ │ -
74{
│ │ │ +
69namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
70namespace Subdivider { // BEGIN_NS_SUBDIVIDER
│ │ │ +
71namespace Adaptive { // BEGIN_NS_ADAPTIVE
│ │ │ +
72
│ │ │ +
73
│ │ │ +
74//== CLASS DEFINITION =========================================================
│ │ │
75
│ │ │ -
76public:
│ │ │ -
77
│ │ │ -
78 typedef M Mesh;
│ │ │ - │ │ │ -
80public:
│ │ │ -
81
│ │ │ -
│ │ │ -
83 explicit MeshViewerWidgetT(QWidget* _parent=0)
│ │ │ -
84 : QGLViewerWidget(_parent),
│ │ │ -
85 f_strips_(false),
│ │ │ -
86 tex_id_(0),
│ │ │ -
87 tex_mode_(GL_MODULATE),
│ │ │ -
88 strips_(mesh_),
│ │ │ -
89 use_color_(true),
│ │ │ -
90 show_vnormals_(false),
│ │ │ -
91 show_fnormals_(false),
│ │ │ -
92 normal_scale_(1.0)
│ │ │ -
93 {
│ │ │ -
94 add_draw_mode("Points");
│ │ │ -
95 add_draw_mode("Hidden-Line");
│ │ │ -
96#if defined(OM_USE_OSG) && OM_USE_OSG
│ │ │ -
97 add_draw_mode("OpenSG Indices");
│ │ │ -
98#endif
│ │ │ -
99 }
│ │ │ -
│ │ │ -
100
│ │ │ - │ │ │ -
103
│ │ │ -
104public:
│ │ │ -
105
│ │ │ -
107 virtual bool open_mesh(const char* _filename, OpenMesh::IO::Options _opt);
│ │ │ -
108
│ │ │ -
110 virtual bool open_texture( const char *_filename );
│ │ │ -
111 bool set_texture( QImage& _texsrc );
│ │ │ -
112
│ │ │ -
113 void enable_strips();
│ │ │ -
114 void disable_strips();
│ │ │ -
115
│ │ │ -
116
│ │ │ -
117 Mesh& mesh() { return mesh_; }
│ │ │ -
118 const Mesh& mesh() const { return mesh_; }
│ │ │ -
119
│ │ │ -
120protected:
│ │ │ -
121
│ │ │ -
123 virtual void draw_scene(const std::string& _draw_mode) override;
│ │ │ -
124
│ │ │ -
125protected:
│ │ │ -
126
│ │ │ -
128 virtual void draw_openmesh(const std::string& _drawmode);
│ │ │ -
129
│ │ │ +
80//=============================================================================
│ │ │ +
81
│ │ │ +
│ │ │ +
84template <class M> class Tvv3 : public RuleInterfaceT<M>
│ │ │ +
85{
│ │ │ +
86 COMPOSITE_RULE( Tvv3, M );
│ │ │ +
87private:
│ │ │ +
88 typedef RuleInterfaceT<M> Base;
│ │ │ +
89
│ │ │ +
90public:
│ │ │ +
91
│ │ │ + │ │ │ +
93
│ │ │ +
94 explicit Tvv3(M& _mesh) : Inherited(_mesh) { Base::set_subdiv_type(3); };
│ │ │ +
95
│ │ │ +
96 void raise(typename M::FaceHandle& _fh, state_t _target_state) override;
│ │ │ +
97 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
98};
│ │ │ +
│ │ │ +
99
│ │ │ +
100
│ │ │ +
101//=============================================================================
│ │ │ +
102
│ │ │ +
103
│ │ │ +
│ │ │ +
106template <class M> class Tvv4 : public RuleInterfaceT<M>
│ │ │ +
107{
│ │ │ +
108 COMPOSITE_RULE( Tvv4, M );
│ │ │ +
109
│ │ │ +
110private:
│ │ │ +
111 typedef RuleInterfaceT<M> Base;
│ │ │ +
112public:
│ │ │ +
113 typedef typename M::HalfedgeHandle HEH;
│ │ │ +
114 typedef typename M::VertexHandle VH;
│ │ │ +
115
│ │ │ + │ │ │ +
117
│ │ │ +
118 explicit Tvv4(M& _mesh) : Inherited(_mesh) { Base::set_subdiv_type(4); };
│ │ │ +
119
│ │ │ +
120 void raise(typename M::FaceHandle& _fh, state_t _target_state) override;
│ │ │ +
121 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
122 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
123
│ │ │ +
124private:
│ │ │ +
125
│ │ │ +
126 void split_edge(HEH& _hh, VH& _vh, state_t _target_state);
│ │ │ +
127 void check_edge(const typename M::HalfedgeHandle& _hh,
│ │ │ +
128 state_t _target_state);
│ │ │ +
129};
│ │ │ +
│ │ │
130
│ │ │ -
131 void glVertex( const typename Mesh::VertexHandle _vh )
│ │ │ -
132 { glVertex3fv( &mesh_.point( _vh )[0] ); }
│ │ │ +
131
│ │ │ +
132//=============================================================================
│ │ │
133
│ │ │ -
134 void glVertex( const typename Mesh::Point& _p )
│ │ │ -
135 { glVertex3fv( &_p[0] ); }
│ │ │ -
136
│ │ │ -
137 void glNormal( const typename Mesh::VertexHandle _vh )
│ │ │ -
138 { glNormal3fv( &mesh_.normal( _vh )[0] ); }
│ │ │ -
139
│ │ │ -
140 void glTexCoord( const typename Mesh::VertexHandle _vh )
│ │ │ -
141 { glTexCoord2fv( &mesh_.texcoord(_vh)[0] ); }
│ │ │ -
142
│ │ │ -
143 void glColor( const typename Mesh::VertexHandle _vh )
│ │ │ -
144 { glColor3ubv( &mesh_.color(_vh)[0] ); }
│ │ │ -
145
│ │ │ -
146 // face properties
│ │ │ +
134
│ │ │ +
│ │ │ +
137template <class M> class VF : public RuleInterfaceT<M>
│ │ │ +
138{
│ │ │ +
139 COMPOSITE_RULE( VF, M );
│ │ │ +
140private:
│ │ │ +
141 typedef RuleInterfaceT<M> Base;
│ │ │ +
142
│ │ │ +
143public:
│ │ │ + │ │ │ +
145
│ │ │ +
146 explicit VF(M& _mesh) : Inherited(_mesh) {}
│ │ │
147
│ │ │ -
148 void glNormal( const typename Mesh::FaceHandle _fh )
│ │ │ -
149 { glNormal3fv( &mesh_.normal( _fh )[0] ); }
│ │ │ +
148 void raise(typename M::FaceHandle& _fh, state_t _target_state) override;
│ │ │ +
149};
│ │ │ +
│ │ │
150
│ │ │ -
151 void glColor( const typename Mesh::FaceHandle _fh )
│ │ │ -
152 { glColor3ubv( &mesh_.color(_fh)[0] ); }
│ │ │ +
151
│ │ │ +
152//=============================================================================
│ │ │
153
│ │ │ -
154 void glMaterial( const typename Mesh::FaceHandle _fh,
│ │ │ -
155 int _f=GL_FRONT_AND_BACK, int _m=GL_DIFFUSE )
│ │ │ -
156 {
│ │ │ -
157 OpenMesh::Vec3f c=OpenMesh::color_cast<OpenMesh::Vec3f>(mesh_.color(_fh));
│ │ │ -
158 OpenMesh::Vec4f m( c[0], c[1], c[2], 1.0f );
│ │ │ -
159
│ │ │ -
160 glMaterialfv(_f, _m, &m[0]);
│ │ │ -
161 }
│ │ │ +
154
│ │ │ +
│ │ │ +
157template <class M> class FF : public RuleInterfaceT<M>
│ │ │ +
158{
│ │ │ +
159 COMPOSITE_RULE( FF, M );
│ │ │ +
160private:
│ │ │ +
161 typedef RuleInterfaceT<M> Base;
│ │ │
162
│ │ │ -
163
│ │ │ -
164protected: // Strip support
│ │ │ -
165
│ │ │ -
166 void compute_strips(void)
│ │ │ -
167 {
│ │ │ -
168 if (f_strips_)
│ │ │ -
169 {
│ │ │ -
170 strips_.clear();
│ │ │ -
171 strips_.stripify();
│ │ │ -
172 }
│ │ │ -
173 }
│ │ │ +
163public:
│ │ │ + │ │ │ +
165
│ │ │ +
166 explicit FF(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
167
│ │ │ +
168 void raise(typename M::FaceHandle& _fh, state_t _target_state) override;
│ │ │ +
169};
│ │ │ +
│ │ │ +
170
│ │ │ +
171
│ │ │ +
172//=============================================================================
│ │ │ +
173
│ │ │
174
│ │ │ -
175protected: // inherited
│ │ │ -
176
│ │ │ -
177 virtual void keyPressEvent( QKeyEvent* _event) override;
│ │ │ -
178
│ │ │ -
179protected:
│ │ │ -
180
│ │ │ -
181 bool f_strips_; // enable/disable strip usage
│ │ │ -
182 GLuint tex_id_;
│ │ │ -
183 GLint tex_mode_;
│ │ │ -
184 OpenMesh::IO::Options opt_; // mesh file contained texcoords?
│ │ │ -
185
│ │ │ -
186 Mesh mesh_;
│ │ │ -
187 MyStripifier strips_;
│ │ │ -
188 bool use_color_;
│ │ │ -
189 bool show_vnormals_;
│ │ │ -
190 bool show_fnormals_;
│ │ │ -
191 float normal_scale_;
│ │ │ - │ │ │ -
193};
│ │ │ +
│ │ │ +
177template <class M> class FFc : public RuleInterfaceT<M>
│ │ │ +
178{
│ │ │ +
179 COMPOSITE_RULE( FFc, M );
│ │ │ +
180private:
│ │ │ +
181 typedef RuleInterfaceT<M> Base;
│ │ │ +
182
│ │ │ +
183public:
│ │ │ + │ │ │ +
185
│ │ │ +
186 explicit FFc(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
187
│ │ │ +
188 void raise(typename M::FaceHandle& _fh, state_t _target_state) override;
│ │ │ +
189};
│ │ │
│ │ │ +
190
│ │ │ +
191
│ │ │ +
192//=============================================================================
│ │ │ +
193
│ │ │
194
│ │ │ -
195
│ │ │ -
196//=============================================================================
│ │ │ -
197#if defined(OM_INCLUDE_TEMPLATES)
│ │ │ -
198# define OPENMESH_MESHVIEWERWIDGET_TEMPLATES
│ │ │ -
199# include "MeshViewerWidgetT_impl.hh"
│ │ │ -
200#endif
│ │ │ -
201//=============================================================================
│ │ │ +
│ │ │ +
197template <class M> class FV : public RuleInterfaceT<M>
│ │ │ +
198{
│ │ │ +
199 COMPOSITE_RULE( FV, M );
│ │ │ +
200private:
│ │ │ +
201 typedef RuleInterfaceT<M> Base;
│ │ │
202
│ │ │ -
This file provides some macros containing attribute usage.
│ │ │ -
A timer class.
│ │ │ -
Definition MeshViewerWidgetT.hh:74
│ │ │ -
MeshViewerWidgetT(QWidget *_parent=0)
default constructor
Definition MeshViewerWidgetT.hh:83
│ │ │ -
virtual bool open_texture(const char *_filename)
load texture
Definition MeshViewerWidgetT_impl.hh:206
│ │ │ -
virtual bool open_mesh(const char *_filename, OpenMesh::IO::Options _opt)
open mesh
Definition MeshViewerWidgetT_impl.hh:75
│ │ │ -
virtual void draw_scene(const std::string &_draw_mode) override
inherited drawing method
Definition MeshViewerWidgetT_impl.hh:572
│ │ │ -
virtual void draw_openmesh(const std::string &_drawmode)
draw the mesh
Definition MeshViewerWidgetT_impl.hh:284
│ │ │ -
~MeshViewerWidgetT()
destructor
Definition MeshViewerWidgetT.hh:102
│ │ │ -
Definition QGLViewerWidget.hh:77
│ │ │ -
QAction * add_draw_mode(const std::string &_s)
add draw mode to popup menu, and return the QAction created
Definition QGLViewerWidget.cc:650
│ │ │ - │ │ │ - │ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ -
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ - │ │ │ -
This class decomposes a triangle mesh into several triangle strips.
Definition StripifierT.hh:80
│ │ │ -
void clear()
delete all strips
Definition StripifierT.hh:100
│ │ │ -
size_t stripify()
Compute triangle strips, returns number of strips.
Definition StripifierT_impl.hh:82
│ │ │ +
203public:
│ │ │ + │ │ │ +
205
│ │ │ +
206 explicit FV(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
207
│ │ │ +
208 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
209};
│ │ │ +
│ │ │ +
210
│ │ │ +
211
│ │ │ +
212//=============================================================================
│ │ │ +
213
│ │ │ +
214
│ │ │ +
│ │ │ +
217template <class M> class FVc : public RuleInterfaceT<M>
│ │ │ +
218{
│ │ │ +
219 COMPOSITE_RULE( FVc, M );
│ │ │ +
220private:
│ │ │ +
221 typedef RuleInterfaceT<M> Base;
│ │ │ +
222
│ │ │ +
223public:
│ │ │ + │ │ │ +
225
│ │ │ +
226 explicit FVc(M& _mesh) : Inherited(_mesh) { init_coeffs(50); }
│ │ │ +
227
│ │ │ +
228 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
229
│ │ │ +
230 static void init_coeffs(size_t _max_valence);
│ │ │ +
231 static const std::vector<double>& coeffs() { return coeffs_; }
│ │ │ +
232
│ │ │ +
233 double coeff( size_t _valence )
│ │ │ +
234 {
│ │ │ +
235 assert(_valence < coeffs_.size());
│ │ │ +
236 return coeffs_[_valence];
│ │ │ +
237 }
│ │ │ +
238
│ │ │ +
239private:
│ │ │ +
240
│ │ │ +
241 static std::vector<double> coeffs_;
│ │ │ +
242
│ │ │ +
243};
│ │ │ +
│ │ │ +
244
│ │ │ +
245
│ │ │ +
246//=============================================================================
│ │ │ +
247
│ │ │ +
248
│ │ │ +
│ │ │ +
251template <class M> class VV : public RuleInterfaceT<M>
│ │ │ +
252{
│ │ │ +
253 COMPOSITE_RULE( VV, M );
│ │ │ +
254private:
│ │ │ +
255 typedef RuleInterfaceT<M> Base;
│ │ │ +
256
│ │ │ +
257public:
│ │ │ +
258
│ │ │ + │ │ │ +
260
│ │ │ +
261 explicit VV(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
262
│ │ │ +
263 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
264};
│ │ │ +
│ │ │ +
265
│ │ │ +
266
│ │ │ +
267//=============================================================================
│ │ │ +
268
│ │ │ +
269
│ │ │ +
│ │ │ +
272template <class M> class VVc : public RuleInterfaceT<M>
│ │ │ +
273{
│ │ │ +
274 COMPOSITE_RULE( VVc, M );
│ │ │ +
275private:
│ │ │ +
276 typedef RuleInterfaceT<M> Base;
│ │ │ +
277
│ │ │ +
278public:
│ │ │ + │ │ │ +
280
│ │ │ +
281 explicit VVc(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
282
│ │ │ +
283 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
284};
│ │ │ +
│ │ │ +
285
│ │ │ +
286
│ │ │ +
287//=============================================================================
│ │ │ +
288
│ │ │ +
289
│ │ │ +
│ │ │ +
292template <class M> class VE : public RuleInterfaceT<M>
│ │ │ +
293{
│ │ │ +
294 COMPOSITE_RULE( VE, M );
│ │ │ +
295private:
│ │ │ +
296 typedef RuleInterfaceT<M> Base;
│ │ │ +
297
│ │ │ +
298public:
│ │ │ + │ │ │ +
300
│ │ │ +
301 explicit VE(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
302
│ │ │ +
303 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
304};
│ │ │ +
│ │ │ +
305
│ │ │ +
306
│ │ │ +
307//=============================================================================
│ │ │ +
308
│ │ │ +
309
│ │ │ +
│ │ │ +
312template <class M> class VdE : public RuleInterfaceT<M>
│ │ │ +
313{
│ │ │ +
314 COMPOSITE_RULE( VdE, M );
│ │ │ +
315private:
│ │ │ +
316 typedef RuleInterfaceT<M> Base;
│ │ │ +
317
│ │ │ +
318public:
│ │ │ + │ │ │ +
320
│ │ │ +
321 explicit VdE(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
322
│ │ │ +
323 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
324};
│ │ │ +
│ │ │ +
325
│ │ │ +
326
│ │ │ +
327//=============================================================================
│ │ │ +
328
│ │ │ +
329
│ │ │ +
│ │ │ +
332template <class M> class VdEc : public RuleInterfaceT<M>
│ │ │ +
333{
│ │ │ +
334 COMPOSITE_RULE( VdEc, M );
│ │ │ +
335private:
│ │ │ +
336 typedef RuleInterfaceT<M> Base;
│ │ │ +
337
│ │ │ +
338public:
│ │ │ + │ │ │ +
340
│ │ │ +
341 explicit VdEc(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
342
│ │ │ +
343 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
344};
│ │ │ +
│ │ │ +
345
│ │ │ +
346
│ │ │ +
347//=============================================================================
│ │ │ +
348
│ │ │ +
349
│ │ │ +
│ │ │ +
352template <class M> class EV : public RuleInterfaceT<M>
│ │ │ +
353{
│ │ │ +
354 COMPOSITE_RULE( EV, M );
│ │ │ +
355private:
│ │ │ +
356 typedef RuleInterfaceT<M> Base;
│ │ │ +
357
│ │ │ +
358public:
│ │ │ + │ │ │ +
360
│ │ │ +
361 explicit EV(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
362
│ │ │ +
363 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
364};
│ │ │ +
│ │ │ +
365
│ │ │ +
366
│ │ │ +
367//=============================================================================
│ │ │ +
368
│ │ │ +
369
│ │ │ +
│ │ │ +
372template <class M> class EVc : public RuleInterfaceT<M>
│ │ │ +
373{
│ │ │ +
374 COMPOSITE_RULE( EVc, M );
│ │ │ +
375private:
│ │ │ +
376 typedef RuleInterfaceT<M> Base;
│ │ │ +
377
│ │ │ +
378public:
│ │ │ +
379
│ │ │ + │ │ │ +
381
│ │ │ +
382 explicit EVc(M& _mesh) : Inherited(_mesh) { init_coeffs(50); }
│ │ │ +
383
│ │ │ +
384 void raise(typename M::VertexHandle& _vh, state_t _target_state) override;
│ │ │ +
385
│ │ │ +
386 static void init_coeffs(size_t _max_valence);
│ │ │ +
387 static const std::vector<double>& coeffs() { return coeffs_; }
│ │ │ +
388
│ │ │ +
389 double coeff( size_t _valence )
│ │ │ +
390 {
│ │ │ +
391 assert(_valence < coeffs_.size());
│ │ │ +
392 return coeffs_[_valence];
│ │ │ +
393 }
│ │ │ +
394
│ │ │ +
395private:
│ │ │ +
396
│ │ │ +
397 static std::vector<double> coeffs_;
│ │ │ +
398
│ │ │ +
399};
│ │ │ +
│ │ │ +
400
│ │ │ +
401
│ │ │ +
402//=============================================================================
│ │ │ +
403
│ │ │ +
404
│ │ │ +
│ │ │ +
407template <class M> class EF : public RuleInterfaceT<M>
│ │ │ +
408{
│ │ │ +
409 COMPOSITE_RULE( EF, M );
│ │ │ +
410private:
│ │ │ +
411 typedef RuleInterfaceT<M> Base;
│ │ │ +
412
│ │ │ +
413public:
│ │ │ + │ │ │ +
415
│ │ │ +
416 explicit EF(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
417
│ │ │ +
418 void raise(typename M::FaceHandle& _fh, state_t _target_state) override;
│ │ │ +
419};
│ │ │ +
│ │ │ +
420
│ │ │ +
421
│ │ │ +
422//=============================================================================
│ │ │ +
423
│ │ │ +
424
│ │ │ +
│ │ │ +
427template <class M> class FE : public RuleInterfaceT<M>
│ │ │ +
428{
│ │ │ +
429 COMPOSITE_RULE( FE, M );
│ │ │ +
430private:
│ │ │ +
431 typedef RuleInterfaceT<M> Base;
│ │ │ +
432
│ │ │ +
433public:
│ │ │ + │ │ │ +
435
│ │ │ +
436 explicit FE(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
437
│ │ │ +
438 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
439};
│ │ │ +
│ │ │ +
440
│ │ │ +
441
│ │ │ +
442//=============================================================================
│ │ │ +
443
│ │ │ +
444
│ │ │ +
│ │ │ +
447template <class M> class EdE : public RuleInterfaceT<M>
│ │ │ +
448{
│ │ │ +
449 COMPOSITE_RULE( EdE, M );
│ │ │ +
450private:
│ │ │ +
451 typedef RuleInterfaceT<M> Base;
│ │ │ +
452
│ │ │ +
453public:
│ │ │ + │ │ │ +
455
│ │ │ +
456 explicit EdE(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
457
│ │ │ +
458 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
459};
│ │ │ +
│ │ │ +
460
│ │ │ +
461
│ │ │ +
462//=============================================================================
│ │ │ +
463
│ │ │ +
464
│ │ │ +
│ │ │ +
467template <class M> class EdEc : public RuleInterfaceT<M>
│ │ │ +
468{
│ │ │ +
469 COMPOSITE_RULE( EdEc, M );
│ │ │ +
470private:
│ │ │ +
471 typedef RuleInterfaceT<M> Base;
│ │ │ +
472
│ │ │ +
473public:
│ │ │ + │ │ │ +
475
│ │ │ +
476 explicit EdEc(M& _mesh) : Inherited(_mesh) {}
│ │ │ +
477
│ │ │ +
478 void raise(typename M::EdgeHandle& _eh, state_t _target_state) override;
│ │ │ +
479};
│ │ │ +
│ │ │ +
480
│ │ │ +
481// ----------------------------------------------------------------------------
│ │ │ +
482
│ │ │ +
483
│ │ │ +
484//=============================================================================
│ │ │ +
485} // END_NS_ADAPTIVE
│ │ │ +
486} // END_NS_SUBDIVIDER
│ │ │ +
487} // END_NS_OPENMESH
│ │ │ +
488//=============================================================================
│ │ │ +
489#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_CC)
│ │ │ +
490# define OPENMESH_SUBDIVIDER_TEMPLATES
│ │ │ +
491# include "RulesT_impl.hh"
│ │ │ +
492#endif
│ │ │ +
493//=============================================================================
│ │ │ +
494#endif // OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH defined
│ │ │ +
495//=============================================================================
│ │ │ +
496
│ │ │ + │ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
CompositeTraits::state_t state_t
Adaptive Composite Subdivision framework.
Definition CompositeTraits.hh:250
│ │ │ +
Base class for adaptive composite subdivision rules.
Definition RuleInterfaceT.hh:109
│ │ │ +
Adaptive Composite Subdivision framework.
Definition RulesT.hh:85
│ │ │ +
Topological composite rule Tvv,4 doing a 1-4 split of a face.
Definition RulesT.hh:107
│ │ │ +
Composite rule VF.
Definition RulesT.hh:138
│ │ │ +
void raise(typename M::FaceHandle &_fh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule FF.
Definition RulesT.hh:158
│ │ │ +
void raise(typename M::FaceHandle &_fh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule FFc.
Definition RulesT.hh:178
│ │ │ +
void raise(typename M::FaceHandle &_fh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule FV.
Definition RulesT.hh:198
│ │ │ +
void raise(typename M::VertexHandle &_vh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule FVc.
Definition RulesT.hh:218
│ │ │ +
void raise(typename M::VertexHandle &_vh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule VV.
Definition RulesT.hh:252
│ │ │ +
void raise(typename M::VertexHandle &_vh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule VVc.
Definition RulesT.hh:273
│ │ │ +
void raise(typename M::VertexHandle &_vh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule VE.
Definition RulesT.hh:293
│ │ │ +
void raise(typename M::EdgeHandle &_eh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule VdE.
Definition RulesT.hh:313
│ │ │ +
void raise(typename M::EdgeHandle &_eh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule VdEc.
Definition RulesT.hh:333
│ │ │ +
void raise(typename M::EdgeHandle &_eh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule EV.
Definition RulesT.hh:353
│ │ │ +
void raise(typename M::VertexHandle &_vh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule EVc.
Definition RulesT.hh:373
│ │ │ +
void raise(typename M::VertexHandle &_vh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule EF.
Definition RulesT.hh:408
│ │ │ +
void raise(typename M::FaceHandle &_fh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule FE.
Definition RulesT.hh:428
│ │ │ +
void raise(typename M::EdgeHandle &_eh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule EdE.
Definition RulesT.hh:448
│ │ │ +
void raise(typename M::EdgeHandle &_eh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │ +
Composite rule EdEc.
Definition RulesT.hh:468
│ │ │ +
void raise(typename M::EdgeHandle &_eh, state_t _target_state) override
Raise item to target state _target_state.
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -MeshViewerWidgetT.hh │ │ │ │ +RulesT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,233 +48,561 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45#pragma once │ │ │ │ -46 │ │ │ │ -47 │ │ │ │ -48//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -49 │ │ │ │ -50#include │ │ │ │ -51#include │ │ │ │ -52#include │ │ │ │ -53#include │ │ │ │ -54#include │ │ │ │ -55#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_A_t_t_r_i_b_u_t_e_s_._h_h> │ │ │ │ -56#include │ │ │ │ -57#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_U_t_i_l_s_/_T_i_m_e_r_._h_h> │ │ │ │ -58#include │ │ │ │ -59 │ │ │ │ -60#ifndef __APPLE__ │ │ │ │ -61 #include │ │ │ │ -62#endif │ │ │ │ -63 │ │ │ │ -64//== FORWARDS │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50// │ │ │ │ +51// Composite Subdivision and Averaging Rules │ │ │ │ +52// │ │ │ │ +53// │ │ │ │ +============================================================================= │ │ │ │ +54 │ │ │ │ +55#ifndef OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH │ │ │ │ +56#define OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH │ │ │ │ +57 │ │ │ │ +58 │ │ │ │ +59//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ +60 │ │ │ │ +61#include │ │ │ │ +62#include │ │ │ │ +63// -------------------- STL │ │ │ │ +64#include │ │ │ │ 65 │ │ │ │ -66class QImage; │ │ │ │ -67 │ │ │ │ +66 │ │ │ │ +67//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ 68 │ │ │ │ -69//== CLASS DEFINITION │ │ │ │ +69namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +70namespace Subdivider { // BEGIN_NS_SUBDIVIDER │ │ │ │ +71namespace Adaptive { // BEGIN_NS_ADAPTIVE │ │ │ │ +72 │ │ │ │ +73 │ │ │ │ +74//== CLASS DEFINITION │ │ │ │ ========================================================= │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -72template │ │ │ │ -_7_3class _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T : public _Q_G_L_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -74{ │ │ │ │ 75 │ │ │ │ -76public: │ │ │ │ -77 │ │ │ │ -78 typedef M Mesh; │ │ │ │ -79 typedef _O_p_e_n_M_e_s_h_:_:_S_t_r_i_p_i_f_i_e_r_T_<_M_e_s_h_> _M_y_S_t_r_i_p_i_f_i_e_r; │ │ │ │ -80public: │ │ │ │ +80// │ │ │ │ +============================================================================= │ │ │ │ 81 │ │ │ │ -_8_3 explicit _M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T(QWidget* _parent=0) │ │ │ │ -84 : _Q_G_L_V_i_e_w_e_r_W_i_d_g_e_t(_parent), │ │ │ │ -85 f_strips_(false), │ │ │ │ -86 tex_id_(0), │ │ │ │ -87 tex_mode_(GL_MODULATE), │ │ │ │ -88 strips_(mesh_), │ │ │ │ -89 use_color_(true), │ │ │ │ -90 show_vnormals_(false), │ │ │ │ -91 show_fnormals_(false), │ │ │ │ -92 normal_scale_(1.0) │ │ │ │ -93 { │ │ │ │ -94 _a_d_d___d_r_a_w___m_o_d_e("Points"); │ │ │ │ -95 _a_d_d___d_r_a_w___m_o_d_e("Hidden-Line"); │ │ │ │ -96#if defined(OM_USE_OSG) && OM_USE_OSG │ │ │ │ -97 _a_d_d___d_r_a_w___m_o_d_e("OpenSG Indices"); │ │ │ │ -98#endif │ │ │ │ -99 } │ │ │ │ +_8_4template class _T_v_v_3 : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +85{ │ │ │ │ +_8_6 COMPOSITE_RULE( _T_v_v_3, M ); │ │ │ │ +87private: │ │ │ │ +88 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +89 │ │ │ │ +90public: │ │ │ │ +91 │ │ │ │ +92 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +93 │ │ │ │ +94 explicit _T_v_v_3(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) { Base::set_subdiv_type(3); }; │ │ │ │ +95 │ │ │ │ +96 void raise(typename M::FaceHandle& _fh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +97 void raise(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +98}; │ │ │ │ +99 │ │ │ │ 100 │ │ │ │ -_1_0_2 _~_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T() {} │ │ │ │ +101// │ │ │ │ +============================================================================= │ │ │ │ +102 │ │ │ │ 103 │ │ │ │ -104public: │ │ │ │ -105 │ │ │ │ -107 virtual bool _o_p_e_n___m_e_s_h(const char* _filename, _O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s _opt); │ │ │ │ -108 │ │ │ │ -110 virtual bool _o_p_e_n___t_e_x_t_u_r_e( const char *_filename ); │ │ │ │ -111 bool set_texture( QImage& _texsrc ); │ │ │ │ -112 │ │ │ │ -113 void enable_strips(); │ │ │ │ -114 void disable_strips(); │ │ │ │ +_1_0_6template class _T_v_v_4 : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +107{ │ │ │ │ +_1_0_8 COMPOSITE_RULE( _T_v_v_4, M ); │ │ │ │ +109 │ │ │ │ +110private: │ │ │ │ +111 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +112public: │ │ │ │ +113 typedef typename M::HalfedgeHandle HEH; │ │ │ │ +114 typedef typename M::VertexHandle VH; │ │ │ │ 115 │ │ │ │ -116 │ │ │ │ -117 Mesh& mesh() { return mesh_; } │ │ │ │ -118 const Mesh& mesh() const { return mesh_; } │ │ │ │ +116 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +117 │ │ │ │ +118 explicit _T_v_v_4(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) { Base::set_subdiv_type(4); }; │ │ │ │ 119 │ │ │ │ -120protected: │ │ │ │ -121 │ │ │ │ -123 virtual void _d_r_a_w___s_c_e_n_e(const std::string& _draw_mode) override; │ │ │ │ -124 │ │ │ │ -125protected: │ │ │ │ -126 │ │ │ │ -128 virtual void _d_r_a_w___o_p_e_n_m_e_s_h(const std::string& _drawmode); │ │ │ │ -129 │ │ │ │ +120 void raise(typename M::FaceHandle& _fh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +121 void raise(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +122 void raise(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +123 │ │ │ │ +124private: │ │ │ │ +125 │ │ │ │ +126 void split_edge(HEH& _hh, VH& _vh, _s_t_a_t_e___t _target_state); │ │ │ │ +127 void check_edge(const typename M::HalfedgeHandle& _hh, │ │ │ │ +128 _s_t_a_t_e___t _target_state); │ │ │ │ +129}; │ │ │ │ 130 │ │ │ │ -131 void glVertex( const typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh ) │ │ │ │ -132 { glVertex3fv( &mesh_.point( _vh )[0] ); } │ │ │ │ +131 │ │ │ │ +132// │ │ │ │ +============================================================================= │ │ │ │ 133 │ │ │ │ -134 void glVertex( const typename _M_e_s_h_:_:_P_o_i_n_t& _p ) │ │ │ │ -135 { glVertex3fv( &_p[0] ); } │ │ │ │ -136 │ │ │ │ -137 void glNormal( const typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh ) │ │ │ │ -138 { glNormal3fv( &mesh_.normal( _vh )[0] ); } │ │ │ │ -139 │ │ │ │ -140 void glTexCoord( const typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh ) │ │ │ │ -141 { glTexCoord2fv( &mesh_.texcoord(_vh)[0] ); } │ │ │ │ +134 │ │ │ │ +_1_3_7template class _V_F : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +138{ │ │ │ │ +_1_3_9 COMPOSITE_RULE( _V_F, M ); │ │ │ │ +140private: │ │ │ │ +141 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ 142 │ │ │ │ -143 void glColor( const typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh ) │ │ │ │ -144 { glColor3ubv( &mesh_.color(_vh)[0] ); } │ │ │ │ +143public: │ │ │ │ +144 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ 145 │ │ │ │ -146 // face properties │ │ │ │ +146 explicit _V_F(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ 147 │ │ │ │ -148 void glNormal( const typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _fh ) │ │ │ │ -149 { glNormal3fv( &mesh_.normal( _fh )[0] ); } │ │ │ │ +_1_4_8 void _r_a_i_s_e(typename M::FaceHandle& _fh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +149}; │ │ │ │ 150 │ │ │ │ -151 void glColor( const typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _fh ) │ │ │ │ -152 { glColor3ubv( &mesh_.color(_fh)[0] ); } │ │ │ │ +151 │ │ │ │ +152// │ │ │ │ +============================================================================= │ │ │ │ 153 │ │ │ │ -154 void glMaterial( const typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _fh, │ │ │ │ -155 int _f=GL_FRONT_AND_BACK, int _m=GL_DIFFUSE ) │ │ │ │ -156 { │ │ │ │ -157 _O_p_e_n_M_e_s_h_:_:_V_e_c_3_f c=OpenMesh::color_cast(mesh_.color(_fh)); │ │ │ │ -158 _O_p_e_n_M_e_s_h_:_:_V_e_c_4_f m( c[0], c[1], c[2], 1.0f ); │ │ │ │ -159 │ │ │ │ -160 glMaterialfv(_f, _m, &m[0]); │ │ │ │ -161 } │ │ │ │ +154 │ │ │ │ +_1_5_7template class _F_F : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +158{ │ │ │ │ +_1_5_9 COMPOSITE_RULE( _F_F, M ); │ │ │ │ +160private: │ │ │ │ +161 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ 162 │ │ │ │ -163 │ │ │ │ -164protected: // Strip support │ │ │ │ +163public: │ │ │ │ +164 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ 165 │ │ │ │ -166 void compute_strips(void) │ │ │ │ -167 { │ │ │ │ -168 if (f_strips_) │ │ │ │ -169 { │ │ │ │ -170 strips_._c_l_e_a_r(); │ │ │ │ -171 strips_._s_t_r_i_p_i_f_y(); │ │ │ │ -172 } │ │ │ │ -173 } │ │ │ │ +166 explicit _F_F(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +167 │ │ │ │ +_1_6_8 void _r_a_i_s_e(typename M::FaceHandle& _fh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +169}; │ │ │ │ +170 │ │ │ │ +171 │ │ │ │ +172// │ │ │ │ +============================================================================= │ │ │ │ +173 │ │ │ │ 174 │ │ │ │ -175protected: // inherited │ │ │ │ -176 │ │ │ │ -177 virtual void keyPressEvent( QKeyEvent* _event) override; │ │ │ │ -178 │ │ │ │ -179protected: │ │ │ │ -180 │ │ │ │ -181 bool f_strips_; // enable/disable strip usage │ │ │ │ -182 GLuint tex_id_; │ │ │ │ -183 GLint tex_mode_; │ │ │ │ -184 _O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s opt_; // mesh file contained texcoords? │ │ │ │ +_1_7_7template class _F_F_c : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +178{ │ │ │ │ +_1_7_9 COMPOSITE_RULE( _F_F_c, M ); │ │ │ │ +180private: │ │ │ │ +181 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +182 │ │ │ │ +183public: │ │ │ │ +184 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ 185 │ │ │ │ -186 Mesh mesh_; │ │ │ │ -187 MyStripifier strips_; │ │ │ │ -188 bool use_color_; │ │ │ │ -189 bool show_vnormals_; │ │ │ │ -190 bool show_fnormals_; │ │ │ │ -191 float normal_scale_; │ │ │ │ -192 _O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _M_e_s_h_:_:_P_o_i_n_t_ _> fp_normal_base_; │ │ │ │ -193}; │ │ │ │ +186 explicit _F_F_c(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +187 │ │ │ │ +_1_8_8 void _r_a_i_s_e(typename M::FaceHandle& _fh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +189}; │ │ │ │ +190 │ │ │ │ +191 │ │ │ │ +192// │ │ │ │ +============================================================================= │ │ │ │ +193 │ │ │ │ 194 │ │ │ │ -195 │ │ │ │ -196// │ │ │ │ +_1_9_7template class _F_V : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +198{ │ │ │ │ +_1_9_9 COMPOSITE_RULE( _F_V, M ); │ │ │ │ +200private: │ │ │ │ +201 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +202 │ │ │ │ +203public: │ │ │ │ +204 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +205 │ │ │ │ +206 explicit _F_V(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +207 │ │ │ │ +_2_0_8 void _r_a_i_s_e(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +209}; │ │ │ │ +210 │ │ │ │ +211 │ │ │ │ +212// │ │ │ │ ============================================================================= │ │ │ │ -197#if defined(OM_INCLUDE_TEMPLATES) │ │ │ │ -198# define OPENMESH_MESHVIEWERWIDGET_TEMPLATES │ │ │ │ -199# include "MeshViewerWidgetT_impl.hh" │ │ │ │ -200#endif │ │ │ │ -201// │ │ │ │ +213 │ │ │ │ +214 │ │ │ │ +_2_1_7template class _F_V_c : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +218{ │ │ │ │ +_2_1_9 COMPOSITE_RULE( _F_V_c, M ); │ │ │ │ +220private: │ │ │ │ +221 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +222 │ │ │ │ +223public: │ │ │ │ +224 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +225 │ │ │ │ +226 explicit _F_V_c(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) { init_coeffs(50); } │ │ │ │ +227 │ │ │ │ +_2_2_8 void _r_a_i_s_e(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +229 │ │ │ │ +230 static void init_coeffs(size_t _max_valence); │ │ │ │ +231 static const std::vector& coeffs() { return coeffs_; } │ │ │ │ +232 │ │ │ │ +233 double coeff( size_t _valence ) │ │ │ │ +234 { │ │ │ │ +235 assert(_valence < coeffs_.size()); │ │ │ │ +236 return coeffs_[_valence]; │ │ │ │ +237 } │ │ │ │ +238 │ │ │ │ +239private: │ │ │ │ +240 │ │ │ │ +241 static std::vector coeffs_; │ │ │ │ +242 │ │ │ │ +243}; │ │ │ │ +244 │ │ │ │ +245 │ │ │ │ +246// │ │ │ │ ============================================================================= │ │ │ │ -202 │ │ │ │ -_A_t_t_r_i_b_u_t_e_s_._h_h │ │ │ │ -This file provides some macros containing attribute usage. │ │ │ │ -_T_i_m_e_r_._h_h │ │ │ │ -A timer class. │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT.hh:74 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_:_:_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T │ │ │ │ -MeshViewerWidgetT(QWidget *_parent=0) │ │ │ │ -default constructor │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT.hh:83 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_:_:_o_p_e_n___t_e_x_t_u_r_e │ │ │ │ -virtual bool open_texture(const char *_filename) │ │ │ │ -load texture │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT_impl.hh:206 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_:_:_o_p_e_n___m_e_s_h │ │ │ │ -virtual bool open_mesh(const char *_filename, OpenMesh::IO::Options _opt) │ │ │ │ -open mesh │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT_impl.hh:75 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_:_:_d_r_a_w___s_c_e_n_e │ │ │ │ -virtual void draw_scene(const std::string &_draw_mode) override │ │ │ │ -inherited drawing method │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT_impl.hh:572 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_:_:_d_r_a_w___o_p_e_n_m_e_s_h │ │ │ │ -virtual void draw_openmesh(const std::string &_drawmode) │ │ │ │ -draw the mesh │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT_impl.hh:284 │ │ │ │ -_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T_:_:_~_M_e_s_h_V_i_e_w_e_r_W_i_d_g_e_t_T │ │ │ │ -~MeshViewerWidgetT() │ │ │ │ -destructor │ │ │ │ -DDeeffiinniittiioonn MeshViewerWidgetT.hh:102 │ │ │ │ -_Q_G_L_V_i_e_w_e_r_W_i_d_g_e_t │ │ │ │ -DDeeffiinniittiioonn QGLViewerWidget.hh:77 │ │ │ │ -_Q_G_L_V_i_e_w_e_r_W_i_d_g_e_t_:_:_a_d_d___d_r_a_w___m_o_d_e │ │ │ │ -QAction * add_draw_mode(const std::string &_s) │ │ │ │ -add draw mode to popup menu, and return the QAction created │ │ │ │ -DDeeffiinniittiioonn QGLViewerWidget.cc:650 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ -_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _4_ _> │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Kernel::VertexHandle VertexHandle │ │ │ │ -Handle for referencing the corresponding item. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Kernel::FaceHandle FaceHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ -Kernel::Point Point │ │ │ │ -Coordinate type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _M_e_s_h_:_:_P_o_i_n_t_ _> │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_t_r_i_p_i_f_i_e_r_T │ │ │ │ -This class decomposes a triangle mesh into several triangle strips. │ │ │ │ -DDeeffiinniittiioonn StripifierT.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_t_r_i_p_i_f_i_e_r_T_:_:_c_l_e_a_r │ │ │ │ -void clear() │ │ │ │ -delete all strips │ │ │ │ -DDeeffiinniittiioonn StripifierT.hh:100 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_t_r_i_p_i_f_i_e_r_T_:_:_s_t_r_i_p_i_f_y │ │ │ │ -size_t stripify() │ │ │ │ -Compute triangle strips, returns number of strips. │ │ │ │ -DDeeffiinniittiioonn StripifierT_impl.hh:82 │ │ │ │ +247 │ │ │ │ +248 │ │ │ │ +_2_5_1template class _V_V : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +252{ │ │ │ │ +_2_5_3 COMPOSITE_RULE( _V_V, M ); │ │ │ │ +254private: │ │ │ │ +255 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +256 │ │ │ │ +257public: │ │ │ │ +258 │ │ │ │ +259 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +260 │ │ │ │ +261 explicit _V_V(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +262 │ │ │ │ +_2_6_3 void _r_a_i_s_e(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +264}; │ │ │ │ +265 │ │ │ │ +266 │ │ │ │ +267// │ │ │ │ +============================================================================= │ │ │ │ +268 │ │ │ │ +269 │ │ │ │ +_2_7_2template class _V_V_c : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +273{ │ │ │ │ +_2_7_4 COMPOSITE_RULE( _V_V_c, M ); │ │ │ │ +275private: │ │ │ │ +276 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +277 │ │ │ │ +278public: │ │ │ │ +279 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +280 │ │ │ │ +281 explicit _V_V_c(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +282 │ │ │ │ +_2_8_3 void _r_a_i_s_e(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +284}; │ │ │ │ +285 │ │ │ │ +286 │ │ │ │ +287// │ │ │ │ +============================================================================= │ │ │ │ +288 │ │ │ │ +289 │ │ │ │ +_2_9_2template class _V_E : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +293{ │ │ │ │ +_2_9_4 COMPOSITE_RULE( _V_E, M ); │ │ │ │ +295private: │ │ │ │ +296 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +297 │ │ │ │ +298public: │ │ │ │ +299 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +300 │ │ │ │ +301 explicit _V_E(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +302 │ │ │ │ +_3_0_3 void _r_a_i_s_e(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +304}; │ │ │ │ +305 │ │ │ │ +306 │ │ │ │ +307// │ │ │ │ +============================================================================= │ │ │ │ +308 │ │ │ │ +309 │ │ │ │ +_3_1_2template class _V_d_E : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +313{ │ │ │ │ +_3_1_4 COMPOSITE_RULE( _V_d_E, M ); │ │ │ │ +315private: │ │ │ │ +316 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +317 │ │ │ │ +318public: │ │ │ │ +319 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +320 │ │ │ │ +321 explicit _V_d_E(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +322 │ │ │ │ +_3_2_3 void _r_a_i_s_e(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +324}; │ │ │ │ +325 │ │ │ │ +326 │ │ │ │ +327// │ │ │ │ +============================================================================= │ │ │ │ +328 │ │ │ │ +329 │ │ │ │ +_3_3_2template class _V_d_E_c : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +333{ │ │ │ │ +_3_3_4 COMPOSITE_RULE( _V_d_E_c, M ); │ │ │ │ +335private: │ │ │ │ +336 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +337 │ │ │ │ +338public: │ │ │ │ +339 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +340 │ │ │ │ +341 explicit _V_d_E_c(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +342 │ │ │ │ +_3_4_3 void _r_a_i_s_e(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +344}; │ │ │ │ +345 │ │ │ │ +346 │ │ │ │ +347// │ │ │ │ +============================================================================= │ │ │ │ +348 │ │ │ │ +349 │ │ │ │ +_3_5_2template class _E_V : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +353{ │ │ │ │ +_3_5_4 COMPOSITE_RULE( _E_V, M ); │ │ │ │ +355private: │ │ │ │ +356 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +357 │ │ │ │ +358public: │ │ │ │ +359 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +360 │ │ │ │ +361 explicit _E_V(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +362 │ │ │ │ +_3_6_3 void _r_a_i_s_e(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +364}; │ │ │ │ +365 │ │ │ │ +366 │ │ │ │ +367// │ │ │ │ +============================================================================= │ │ │ │ +368 │ │ │ │ +369 │ │ │ │ +_3_7_2template class _E_V_c : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +373{ │ │ │ │ +_3_7_4 COMPOSITE_RULE( _E_V_c, M ); │ │ │ │ +375private: │ │ │ │ +376 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +377 │ │ │ │ +378public: │ │ │ │ +379 │ │ │ │ +380 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +381 │ │ │ │ +382 explicit _E_V_c(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) { init_coeffs(50); } │ │ │ │ +383 │ │ │ │ +_3_8_4 void _r_a_i_s_e(typename M::VertexHandle& _vh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +385 │ │ │ │ +386 static void init_coeffs(size_t _max_valence); │ │ │ │ +387 static const std::vector& coeffs() { return coeffs_; } │ │ │ │ +388 │ │ │ │ +389 double coeff( size_t _valence ) │ │ │ │ +390 { │ │ │ │ +391 assert(_valence < coeffs_.size()); │ │ │ │ +392 return coeffs_[_valence]; │ │ │ │ +393 } │ │ │ │ +394 │ │ │ │ +395private: │ │ │ │ +396 │ │ │ │ +397 static std::vector coeffs_; │ │ │ │ +398 │ │ │ │ +399}; │ │ │ │ +400 │ │ │ │ +401 │ │ │ │ +402// │ │ │ │ +============================================================================= │ │ │ │ +403 │ │ │ │ +404 │ │ │ │ +_4_0_7template class _E_F : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +408{ │ │ │ │ +_4_0_9 COMPOSITE_RULE( _E_F, M ); │ │ │ │ +410private: │ │ │ │ +411 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +412 │ │ │ │ +413public: │ │ │ │ +414 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +415 │ │ │ │ +416 explicit _E_F(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +417 │ │ │ │ +_4_1_8 void _r_a_i_s_e(typename M::FaceHandle& _fh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +419}; │ │ │ │ +420 │ │ │ │ +421 │ │ │ │ +422// │ │ │ │ +============================================================================= │ │ │ │ +423 │ │ │ │ +424 │ │ │ │ +_4_2_7template class _F_E : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +428{ │ │ │ │ +_4_2_9 COMPOSITE_RULE( _F_E, M ); │ │ │ │ +430private: │ │ │ │ +431 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +432 │ │ │ │ +433public: │ │ │ │ +434 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +435 │ │ │ │ +436 explicit _F_E(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +437 │ │ │ │ +_4_3_8 void _r_a_i_s_e(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +439}; │ │ │ │ +440 │ │ │ │ +441 │ │ │ │ +442// │ │ │ │ +============================================================================= │ │ │ │ +443 │ │ │ │ +444 │ │ │ │ +_4_4_7template class _E_d_E : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +448{ │ │ │ │ +_4_4_9 COMPOSITE_RULE( _E_d_E, M ); │ │ │ │ +450private: │ │ │ │ +451 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +452 │ │ │ │ +453public: │ │ │ │ +454 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +455 │ │ │ │ +456 explicit _E_d_E(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +457 │ │ │ │ +_4_5_8 void _r_a_i_s_e(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +459}; │ │ │ │ +460 │ │ │ │ +461 │ │ │ │ +462// │ │ │ │ +============================================================================= │ │ │ │ +463 │ │ │ │ +464 │ │ │ │ +_4_6_7template class _E_d_E_c : public _R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +468{ │ │ │ │ +_4_6_9 COMPOSITE_RULE( _E_d_E_c, M ); │ │ │ │ +470private: │ │ │ │ +471 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _B_a_s_e; │ │ │ │ +472 │ │ │ │ +473public: │ │ │ │ +474 typedef _R_u_l_e_I_n_t_e_r_f_a_c_e_T_<_M_> _I_n_h_e_r_i_t_e_d; │ │ │ │ +475 │ │ │ │ +476 explicit _E_d_E_c(M& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {} │ │ │ │ +477 │ │ │ │ +_4_7_8 void _r_a_i_s_e(typename M::EdgeHandle& _eh, _s_t_a_t_e___t _target_state) override; │ │ │ │ +479}; │ │ │ │ +480 │ │ │ │ +481// ------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +482 │ │ │ │ +483 │ │ │ │ +484// │ │ │ │ +============================================================================= │ │ │ │ +485} // END_NS_ADAPTIVE │ │ │ │ +486} // END_NS_SUBDIVIDER │ │ │ │ +487} // END_NS_OPENMESH │ │ │ │ +488// │ │ │ │ +============================================================================= │ │ │ │ +489#if defined(OM_INCLUDE_TEMPLATES) && !defined │ │ │ │ +(OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_CC) │ │ │ │ +490# define OPENMESH_SUBDIVIDER_TEMPLATES │ │ │ │ +491# include "_R_u_l_e_s_T___i_m_p_l_._h_h" │ │ │ │ +492#endif │ │ │ │ +493// │ │ │ │ +============================================================================= │ │ │ │ +494#endif // OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_HH defined │ │ │ │ +495// │ │ │ │ +============================================================================= │ │ │ │ +496 │ │ │ │ +_R_u_l_e_s_T___i_m_p_l_._h_h │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_s_t_a_t_e___t │ │ │ │ +CompositeTraits::state_t state_t │ │ │ │ +Adaptive Composite Subdivision framework. │ │ │ │ +DDeeffiinniittiioonn CompositeTraits.hh:250 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_R_u_l_e_I_n_t_e_r_f_a_c_e_T │ │ │ │ +Base class for adaptive composite subdivision rules. │ │ │ │ +DDeeffiinniittiioonn RuleInterfaceT.hh:109 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_T_v_v_3 │ │ │ │ +Adaptive Composite Subdivision framework. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:85 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_T_v_v_4 │ │ │ │ +Topological composite rule Tvv,4 doing a 1-4 split of a face. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:107 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_F │ │ │ │ +Composite rule VF. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_F_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::FaceHandle &_fh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_F │ │ │ │ +Composite rule FF. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:158 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_F_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::FaceHandle &_fh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_F_c │ │ │ │ +Composite rule FFc. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_F_c_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::FaceHandle &_fh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_V │ │ │ │ +Composite rule FV. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:198 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_V_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::VertexHandle &_vh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_V_c │ │ │ │ +Composite rule FVc. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:218 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_V_c_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::VertexHandle &_vh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_V │ │ │ │ +Composite rule VV. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:252 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_V_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::VertexHandle &_vh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_V_c │ │ │ │ +Composite rule VVc. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:273 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_V_c_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::VertexHandle &_vh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_E │ │ │ │ +Composite rule VE. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:293 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_E_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::EdgeHandle &_eh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_d_E │ │ │ │ +Composite rule VdE. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:313 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_d_E_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::EdgeHandle &_eh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_d_E_c │ │ │ │ +Composite rule VdEc. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:333 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_V_d_E_c_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::EdgeHandle &_eh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_V │ │ │ │ +Composite rule EV. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:353 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_V_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::VertexHandle &_vh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_V_c │ │ │ │ +Composite rule EVc. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:373 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_V_c_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::VertexHandle &_vh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_F │ │ │ │ +Composite rule EF. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:408 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_F_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::FaceHandle &_fh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_E │ │ │ │ +Composite rule FE. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:428 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_F_E_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::EdgeHandle &_eh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_d_E │ │ │ │ +Composite rule EdE. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:448 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_d_E_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::EdgeHandle &_eh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_d_E_c │ │ │ │ +Composite rule EdEc. │ │ │ │ +DDeeffiinniittiioonn RulesT.hh:468 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_A_d_a_p_t_i_v_e_:_:_E_d_E_c_:_:_r_a_i_s_e │ │ │ │ +void raise(typename M::EdgeHandle &_eh, state_t _target_state) override │ │ │ │ +Raise item to target state _target_state. │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00512_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Templates/blaT_impl.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/Sqrt3T.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
blaT_impl.hh
│ │ │ +
Sqrt3T.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -138,44 +138,493 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44//=============================================================================
│ │ │ -
45//
│ │ │ -
46// CLASS bla - IMPLEMENTATION
│ │ │ -
47//
│ │ │
48//=============================================================================
│ │ │ -
49
│ │ │ -
50#define OPENMESH_BLA_C
│ │ │ -
51
│ │ │ -
52//== INCLUDES =================================================================
│ │ │ +
49//
│ │ │ +
50// CLASS Sqrt3T
│ │ │ +
51//
│ │ │ +
52//=============================================================================
│ │ │
53
│ │ │ -
54#include <OpenMesh/.../bla.hh>
│ │ │ -
55
│ │ │ +
54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH
│ │ │ +
55#define OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH
│ │ │
56
│ │ │ -
57//== NAMESPACES ===============================================================
│ │ │ -
58
│ │ │ -
59namespace OpenMesh {
│ │ │ -
60
│ │ │ -
61
│ │ │ -
62//== IMPLEMENTATION ==========================================================
│ │ │ -
63
│ │ │ -
64
│ │ │ -
65
│ │ │ -
66//-----------------------------------------------------------------------------
│ │ │ -
67
│ │ │ -
68
│ │ │ -
69
│ │ │ -
70//=============================================================================
│ │ │ -
71} // namespace OpenMesh
│ │ │ -
72//=============================================================================
│ │ │ +
57
│ │ │ +
58//== INCLUDES =================================================================
│ │ │ +
59
│ │ │ +
60#include <OpenMesh/Core/Mesh/Handles.hh>
│ │ │ +
61#include <OpenMesh/Core/System/config.hh>
│ │ │ + │ │ │ +
63#if defined(_DEBUG) || defined(DEBUG)
│ │ │ +
64// Makes life lot easier, when playing/messing around with low-level topology
│ │ │ +
65// changing methods of OpenMesh
│ │ │ +
66# include <OpenMesh/Tools/Utils/MeshCheckerT.hh>
│ │ │ +
67# define ASSERT_CONSISTENCY( T, m ) \
│ │ │ +
68 assert(OpenMesh::Utils::MeshCheckerT<T>(m).check())
│ │ │ +
69#else
│ │ │ +
70# define ASSERT_CONSISTENCY( T, m )
│ │ │ +
71#endif
│ │ │ +
72// -------------------- STL
│ │ │ +
73#include <vector>
│ │ │ +
74#if defined(OM_CC_MIPS)
│ │ │ +
75# include <math.h>
│ │ │ +
76#else
│ │ │ +
77# include <cmath>
│ │ │ +
78#endif
│ │ │ +
79
│ │ │ +
80
│ │ │ +
81//== NAMESPACE ================================================================
│ │ │ +
82
│ │ │ +
83namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
84namespace Subdivider { // BEGIN_NS_DECIMATER
│ │ │ +
85namespace Uniform { // BEGIN_NS_DECIMATER
│ │ │ +
86
│ │ │ +
87
│ │ │ +
88//== CLASS DEFINITION =========================================================
│ │ │ +
89
│ │ │ +
90
│ │ │ +
97template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
98class Sqrt3T : public SubdividerT< MeshType, RealType >
│ │ │ +
99{
│ │ │ +
100public:
│ │ │ +
101
│ │ │ +
102 typedef RealType real_t;
│ │ │ +
103 typedef MeshType mesh_t;
│ │ │ + │ │ │ +
105
│ │ │ +
106 typedef std::pair< real_t, real_t > weight_t;
│ │ │ +
107 typedef std::vector< std::pair<real_t,real_t> > weights_t;
│ │ │ +
108
│ │ │ +
109public:
│ │ │ +
110
│ │ │ +
111
│ │ │ +
112 Sqrt3T(void) : parent_t(), _1over3( real_t(1.0/3.0) ), _1over27( real_t(1.0/27.0) )
│ │ │ +
113 { init_weights(); }
│ │ │ +
114
│ │ │ +
115 explicit Sqrt3T(MeshType &_m) : parent_t(_m), _1over3( real_t(1.0/3.0) ), _1over27( real_t(1.0/27.0) )
│ │ │ +
116 { init_weights(); }
│ │ │ +
117
│ │ │ +
118 virtual ~Sqrt3T() {}
│ │ │ +
119
│ │ │ +
120
│ │ │ +
121public:
│ │ │ +
122
│ │ │ +
123
│ │ │ +
124 const char *name() const override { return "Uniform Sqrt3"; }
│ │ │ +
125
│ │ │ +
126
│ │ │ +
│ │ │ +
128 void init_weights(size_t _max_valence=50)
│ │ │ +
129 {
│ │ │ +
130 weights_.resize(_max_valence);
│ │ │ +
131 std::generate(weights_.begin(), weights_.end(), compute_weight());
│ │ │ +
132 }
│ │ │ +
│ │ │ +
133
│ │ │ +
134
│ │ │ +
135protected:
│ │ │ +
136
│ │ │ +
137
│ │ │ +
│ │ │ +
138 bool prepare( MeshType& _m ) override
│ │ │ +
139 {
│ │ │ +
140 _m.request_edge_status();
│ │ │ +
141 _m.add_property( vp_pos_ );
│ │ │ +
142 _m.add_property( ep_nv_ );
│ │ │ +
143 _m.add_property( mp_gen_ );
│ │ │ +
144 _m.property( mp_gen_ ) = 0;
│ │ │ +
145
│ │ │ +
146 return _m.has_edge_status() && vp_pos_.is_valid()
│ │ │ +
147 && ep_nv_.is_valid() && mp_gen_.is_valid();
│ │ │ +
148 }
│ │ │ +
│ │ │ +
149
│ │ │ +
150
│ │ │ +
│ │ │ +
151 bool cleanup( MeshType& _m ) override
│ │ │ +
152 {
│ │ │ +
153 _m.release_edge_status();
│ │ │ +
154 _m.remove_property( vp_pos_ );
│ │ │ +
155 _m.remove_property( ep_nv_ );
│ │ │ +
156 _m.remove_property( mp_gen_ );
│ │ │ +
157 return true;
│ │ │ +
158 }
│ │ │ +
│ │ │ +
159
│ │ │ +
│ │ │ +
160 bool subdivide( MeshType& _m, size_t _n , const bool _update_points = true) override
│ │ │ +
161 {
│ │ │ +
162
│ │ │ +
164
│ │ │ +
165 typename MeshType::Point pos(0,0,0), zero(0,0,0);
│ │ │ +
166 size_t &gen = _m.property( mp_gen_ );
│ │ │ +
167
│ │ │ +
168 for (size_t l=0; l<_n; ++l)
│ │ │ +
169 {
│ │ │ +
170 // tag existing edges
│ │ │ +
171 for (auto eh : _m.edges())
│ │ │ +
172 {
│ │ │ +
173 _m.status( eh ).set_tagged( true );
│ │ │ +
174 if ( (gen%2) && _m.is_boundary(eh) )
│ │ │ +
175 compute_new_boundary_points( _m, eh ); // *) creates new vertices
│ │ │ +
176 }
│ │ │ +
177
│ │ │ +
178 // do relaxation of old vertices, but store new pos in property vp_pos_
│ │ │ +
179
│ │ │ +
180 for (auto vh : _m.vertices())
│ │ │ +
181 {
│ │ │ +
182 if ( _m.is_boundary(vh) )
│ │ │ +
183 {
│ │ │ +
184 if ( gen%2 )
│ │ │ +
185 {
│ │ │ +
186 auto heh = _m.halfedge_handle(vh);
│ │ │ +
187 if (heh.is_valid()) // skip isolated newly inserted vertices *)
│ │ │ +
188 {
│ │ │ +
189 auto prev_heh = _m.prev_halfedge_handle(heh);
│ │ │ +
190
│ │ │ +
191 assert( _m.is_boundary(heh ) );
│ │ │ +
192 assert( _m.is_boundary(prev_heh) );
│ │ │ +
193
│ │ │ +
194 pos = _m.point(_m.to_vertex_handle(heh));
│ │ │ +
195 pos += _m.point(_m.from_vertex_handle(prev_heh));
│ │ │ +
196 pos *= real_t(4.0);
│ │ │ +
197
│ │ │ +
198 pos += real_t(19.0) * _m.point( vh );
│ │ │ +
199 pos *= _1over27;
│ │ │ +
200
│ │ │ +
201 _m.property( vp_pos_, vh ) = pos;
│ │ │ +
202 }
│ │ │ +
203 }
│ │ │ +
204 else
│ │ │ +
205 _m.property( vp_pos_, vh ) = _m.point( vh );
│ │ │ +
206 }
│ │ │ +
207 else
│ │ │ +
208 {
│ │ │ +
209 size_t valence=0;
│ │ │ +
210
│ │ │ +
211 pos = zero;
│ │ │ +
212 for ( auto vvh : _m.vv_range(vh))
│ │ │ +
213 {
│ │ │ +
214 pos += _m.point( vvh );
│ │ │ +
215 ++valence;
│ │ │ +
216 }
│ │ │ +
217 pos *= weights_[ valence ].second;
│ │ │ +
218 pos += weights_[ valence ].first * _m.point(vh);
│ │ │ +
219 _m.property( vp_pos_, vh ) = pos;
│ │ │ +
220 }
│ │ │ +
221 }
│ │ │ +
222
│ │ │ +
223 // insert new vertices, but store pos in vp_pos_
│ │ │ +
224 for (auto fh : _m.faces())
│ │ │ +
225 {
│ │ │ +
226 if ( (gen%2) && _m.is_boundary(fh))
│ │ │ +
227 {
│ │ │ +
228 boundary_split( _m, fh );
│ │ │ +
229 }
│ │ │ +
230 else
│ │ │ +
231 {
│ │ │ +
232 auto fvit = _m.fv_iter( fh );
│ │ │ +
233 pos = _m.point( *fvit);
│ │ │ +
234 pos += _m.point(*(++fvit));
│ │ │ +
235 pos += _m.point(*(++fvit));
│ │ │ +
236 pos *= _1over3;
│ │ │ +
237 auto vh = _m.add_vertex( zero );
│ │ │ +
238 _m.property( vp_pos_, vh ) = pos;
│ │ │ +
239 _m.split( fh, vh );
│ │ │ +
240 }
│ │ │ +
241 }
│ │ │ +
242
│ │ │ +
243 // commit new positions (now iterating over all vertices)
│ │ │ +
244 for (auto vh : _m.vertices())
│ │ │ +
245 _m.set_point(vh, _m.property( vp_pos_, vh ) );
│ │ │ +
246
│ │ │ +
247 // flip old edges
│ │ │ +
248 for (auto eh : _m.edges())
│ │ │ +
249 if ( _m.status( eh ).tagged() && !_m.is_boundary( eh ) )
│ │ │ +
250 _m.flip(eh);
│ │ │ +
251
│ │ │ +
252 // Now we have an consistent mesh!
│ │ │ +
253 ASSERT_CONSISTENCY( MeshType, _m );
│ │ │ +
254
│ │ │ +
255 // increase generation by one
│ │ │ +
256 ++gen;
│ │ │ +
257 }
│ │ │ +
258 return true;
│ │ │ +
259 }
│ │ │ +
│ │ │ +
260
│ │ │ +
261private:
│ │ │ +
262
│ │ │ +
265 struct compute_weight
│ │ │ +
266 {
│ │ │ +
267 compute_weight() : valence(-1) { }
│ │ │ +
268 weight_t operator() (void)
│ │ │ +
269 {
│ │ │ +
270#if !defined(OM_CC_MIPS)
│ │ │ +
271 using std::cos;
│ │ │ +
272#endif
│ │ │ +
273 if (++valence)
│ │ │ +
274 {
│ │ │ +
275 real_t alpha = real_t( (4.0-2.0*cos(2.0*M_PI / real_t(valence)) )/9.0 );
│ │ │ +
276 return weight_t( real_t(1)-alpha, alpha/real_t(valence) );
│ │ │ +
277 }
│ │ │ +
278 return weight_t(real_t(0.0), real_t(0.0) );
│ │ │ +
279 }
│ │ │ +
280 int valence;
│ │ │ +
281 };
│ │ │ +
282
│ │ │ +
283private:
│ │ │ +
284
│ │ │ +
285 // Pre-compute location of new boundary points for odd generations
│ │ │ +
286 // and store them in the edge property ep_nv_;
│ │ │ +
287 void compute_new_boundary_points( MeshType& _m,
│ │ │ +
288 const typename MeshType::EdgeHandle& _eh)
│ │ │ +
289 {
│ │ │ +
290 assert( _m.is_boundary(_eh) );
│ │ │ +
291
│ │ │ +
292 typename MeshType::HalfedgeHandle heh;
│ │ │ +
293 typename MeshType::VertexHandle vh1, vh2, vh3, vh4, vhl, vhr;
│ │ │ +
294 typename MeshType::Point zero(0,0,0), P1, P2, P3, P4;
│ │ │ +
295
│ │ │ +
296 /*
│ │ │ +
297 // *---------*---------*
│ │ │ +
298 // / \ / \ / \
│ │ │ +
299 // / \ / \ / \
│ │ │ +
300 // / \ / \ / \
│ │ │ +
301 // / \ / \ / \
│ │ │ +
302 // *---------*--#---#--*---------*
│ │ │ +
303 //
│ │ │ +
304 // ^ ^ ^ ^ ^ ^
│ │ │ +
305 // P1 P2 pl pr P3 P4
│ │ │ +
306 */
│ │ │ +
307 // get halfedge pointing from P3 to P2 (outer boundary halfedge)
│ │ │ +
308
│ │ │ +
309 heh = _m.halfedge_handle(_eh,
│ │ │ +
310 _m.is_boundary(_m.halfedge_handle(_eh,1)));
│ │ │ +
311
│ │ │ +
312 assert( _m.is_boundary( _m.next_halfedge_handle( heh ) ) );
│ │ │ +
313 assert( _m.is_boundary( _m.prev_halfedge_handle( heh ) ) );
│ │ │ +
314
│ │ │ +
315 vh1 = _m.to_vertex_handle( _m.next_halfedge_handle( heh ) );
│ │ │ +
316 vh2 = _m.to_vertex_handle( heh );
│ │ │ +
317 vh3 = _m.from_vertex_handle( heh );
│ │ │ +
318 vh4 = _m.from_vertex_handle( _m.prev_halfedge_handle( heh ));
│ │ │ +
319
│ │ │ +
320 P1 = _m.point(vh1);
│ │ │ +
321 P2 = _m.point(vh2);
│ │ │ +
322 P3 = _m.point(vh3);
│ │ │ +
323 P4 = _m.point(vh4);
│ │ │ +
324
│ │ │ +
325 vhl = _m.add_vertex(zero);
│ │ │ +
326 vhr = _m.add_vertex(zero);
│ │ │ +
327
│ │ │ +
328 _m.property(vp_pos_, vhl ) = (P1 + real_t(16.0f) * P2 + real_t(10.0f) * P3) * _1over27;
│ │ │ +
329 _m.property(vp_pos_, vhr ) = ( real_t(10.0f) * P2 + real_t(16.0f) * P3 + P4) * _1over27;
│ │ │ +
330 _m.property(ep_nv_, _eh).first = vhl;
│ │ │ +
331 _m.property(ep_nv_, _eh).second = vhr;
│ │ │ +
332 }
│ │ │ +
333
│ │ │ +
334
│ │ │ +
335 void boundary_split( MeshType& _m, const typename MeshType::FaceHandle& _fh )
│ │ │ +
336 {
│ │ │ +
337 assert( _m.is_boundary(_fh) );
│ │ │ +
338
│ │ │ +
339 typename MeshType::VertexHandle vhl, vhr;
│ │ │ +
340 typename MeshType::FaceEdgeIter fe_it;
│ │ │ +
341 typename MeshType::HalfedgeHandle heh;
│ │ │ +
342
│ │ │ +
343 // find boundary edge
│ │ │ +
344 for( fe_it=_m.fe_iter( _fh ); fe_it.is_valid() && !_m.is_boundary( *fe_it ); ++fe_it ) {};
│ │ │ +
345
│ │ │ +
346 // use precomputed, already inserted but not linked vertices
│ │ │ +
347 vhl = _m.property(ep_nv_, *fe_it).first;
│ │ │ +
348 vhr = _m.property(ep_nv_, *fe_it).second;
│ │ │ +
349
│ │ │ +
350 /*
│ │ │ +
351 // *---------*---------*
│ │ │ +
352 // / \ / \ / \
│ │ │ +
353 // / \ / \ / \
│ │ │ +
354 // / \ / \ / \
│ │ │ +
355 // / \ / \ / \
│ │ │ +
356 // *---------*--#---#--*---------*
│ │ │ +
357 //
│ │ │ +
358 // ^ ^ ^ ^ ^ ^
│ │ │ +
359 // P1 P2 pl pr P3 P4
│ │ │ +
360 */
│ │ │ +
361 // get halfedge pointing from P2 to P3 (inner boundary halfedge)
│ │ │ +
362
│ │ │ +
363 heh = _m.halfedge_handle(*fe_it,
│ │ │ +
364 _m.is_boundary(_m.halfedge_handle(*fe_it,0)));
│ │ │ +
365
│ │ │ +
366 typename MeshType::HalfedgeHandle pl_P3;
│ │ │ +
367
│ │ │ +
368 // split P2->P3 (heh) in P2->pl (heh) and pl->P3
│ │ │ +
369 boundary_split( _m, heh, vhl ); // split edge
│ │ │ +
370 pl_P3 = _m.next_halfedge_handle( heh ); // store next halfedge handle
│ │ │ +
371 boundary_split( _m, heh ); // split face
│ │ │ +
372
│ │ │ +
373 // split pl->P3 in pl->pr and pr->P3
│ │ │ +
374 boundary_split( _m, pl_P3, vhr );
│ │ │ +
375 boundary_split( _m, pl_P3 );
│ │ │ +
376
│ │ │ +
377 assert( _m.is_boundary( vhl ) && _m.halfedge_handle(vhl).is_valid() );
│ │ │ +
378 assert( _m.is_boundary( vhr ) && _m.halfedge_handle(vhr).is_valid() );
│ │ │ +
379 }
│ │ │ +
380
│ │ │ +
381 void boundary_split(MeshType& _m,
│ │ │ +
382 const typename MeshType::HalfedgeHandle& _heh,
│ │ │ +
383 const typename MeshType::VertexHandle& _vh)
│ │ │ +
384 {
│ │ │ +
385 assert( _m.is_boundary( _m.edge_handle(_heh) ) );
│ │ │ +
386
│ │ │ +
387 typename MeshType::HalfedgeHandle
│ │ │ +
388 heh(_heh),
│ │ │ +
389 opp_heh( _m.opposite_halfedge_handle(_heh) ),
│ │ │ +
390 new_heh, opp_new_heh;
│ │ │ +
391 typename MeshType::VertexHandle to_vh(_m.to_vertex_handle(heh));
│ │ │ +
392 typename MeshType::HalfedgeHandle t_heh;
│ │ │ +
393
│ │ │ +
394 /*
│ │ │ +
395 * P5
│ │ │ +
396 * *
│ │ │ +
397 * /|\
│ │ │ +
398 * / \
│ │ │ +
399 * / \
│ │ │ +
400 * / \
│ │ │ +
401 * / \
│ │ │ +
402 * /_ heh new \
│ │ │ +
403 * *-----\*-----\*\-----*
│ │ │ +
404 * ^ ^ t_heh
│ │ │ +
405 * _vh to_vh
│ │ │ +
406 *
│ │ │ +
407 * P1 P2 P3 P4
│ │ │ +
408 */
│ │ │ +
409 // Re-Setting Handles
│ │ │ +
410
│ │ │ +
411 // find halfedge point from P4 to P3
│ │ │ +
412 for(t_heh = heh;
│ │ │ +
413 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
414 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh)))
│ │ │ +
415 {}
│ │ │ +
416
│ │ │ +
417 assert( _m.is_boundary( t_heh ) );
│ │ │ +
418
│ │ │ +
419 new_heh = _m.new_edge( _vh, to_vh );
│ │ │ +
420 opp_new_heh = _m.opposite_halfedge_handle(new_heh);
│ │ │ +
421
│ │ │ +
422 // update halfedge connectivity
│ │ │ +
423
│ │ │ +
424 _m.set_next_halfedge_handle(t_heh, opp_new_heh); // P4-P3 -> P3-P2
│ │ │ +
425 // P2-P3 -> P3-P5
│ │ │ +
426 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh));
│ │ │ +
427 _m.set_next_halfedge_handle(heh, new_heh); // P1-P2 -> P2-P3
│ │ │ +
428 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); // P3-P2 -> P2-P1
│ │ │ +
429
│ │ │ +
430 // both opposite halfedges point to same face
│ │ │ +
431 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh));
│ │ │ +
432
│ │ │ +
433 // let heh finally point to new inserted vertex
│ │ │ +
434 _m.set_vertex_handle(heh, _vh);
│ │ │ +
435
│ │ │ +
436 // let heh and new_heh point to same face
│ │ │ +
437 _m.set_face_handle(new_heh, _m.face_handle(heh));
│ │ │ +
438
│ │ │ +
439 // let opp_new_heh be the new outgoing halfedge for to_vh
│ │ │ +
440 // (replaces for opp_heh)
│ │ │ +
441 _m.set_halfedge_handle( to_vh, opp_new_heh );
│ │ │ +
442
│ │ │ +
443 // let opp_heh be the outgoing halfedge for _vh
│ │ │ +
444 _m.set_halfedge_handle( _vh, opp_heh );
│ │ │ +
445 }
│ │ │ +
446
│ │ │ +
447 void boundary_split( MeshType& _m,
│ │ │ +
448 const typename MeshType::HalfedgeHandle& _heh)
│ │ │ +
449 {
│ │ │ +
450 assert( _m.is_boundary( _m.opposite_halfedge_handle( _heh ) ) );
│ │ │ +
451
│ │ │ +
452 typename MeshType::HalfedgeHandle
│ │ │ +
453 heh(_heh),
│ │ │ +
454 n_heh(_m.next_halfedge_handle(heh));
│ │ │ +
455
│ │ │ +
456 typename MeshType::VertexHandle
│ │ │ +
457 to_vh(_m.to_vertex_handle(heh));
│ │ │ +
458
│ │ │ +
459 typename MeshType::HalfedgeHandle
│ │ │ +
460 heh2(_m.new_edge(to_vh,
│ │ │ +
461 _m.to_vertex_handle(_m.next_halfedge_handle(n_heh)))),
│ │ │ +
462 heh3(_m.opposite_halfedge_handle(heh2));
│ │ │ +
463
│ │ │ +
464 typename MeshType::FaceHandle
│ │ │ +
465 new_fh(_m.new_face()),
│ │ │ +
466 fh(_m.face_handle(heh));
│ │ │ +
467
│ │ │ +
468 // Relink (half)edges
│ │ │ +
469
│ │ │ +
470#define set_next_heh set_next_halfedge_handle
│ │ │ +
471#define next_heh next_halfedge_handle
│ │ │ +
472
│ │ │ +
473 _m.set_face_handle(heh, new_fh);
│ │ │ +
474 _m.set_face_handle(heh2, new_fh);
│ │ │ +
475 _m.set_next_heh(heh2, _m.next_heh(_m.next_heh(n_heh)));
│ │ │ +
476 _m.set_next_heh(heh, heh2);
│ │ │ +
477 _m.set_face_handle( _m.next_heh(heh2), new_fh);
│ │ │ +
478
│ │ │ +
479 // _m.set_face_handle( _m.next_heh(_m.next_heh(heh2)), new_fh);
│ │ │ +
480
│ │ │ +
481 _m.set_next_heh(heh3, n_heh);
│ │ │ +
482 _m.set_next_heh(_m.next_halfedge_handle(n_heh), heh3);
│ │ │ +
483 _m.set_face_handle(heh3, fh);
│ │ │ +
484 // _m.set_face_handle(n_heh, fh);
│ │ │ +
485
│ │ │ +
486 _m.set_halfedge_handle( fh, n_heh);
│ │ │ +
487 _m.set_halfedge_handle(new_fh, heh);
│ │ │ +
488
│ │ │ +
489#undef set_next_halfedge_handle
│ │ │ +
490#undef next_halfedge_handle
│ │ │ +
491
│ │ │ +
492 }
│ │ │ +
493
│ │ │ +
494private:
│ │ │ +
495
│ │ │ +
496 weights_t weights_;
│ │ │ + │ │ │ +
498 OpenMesh::EPropHandleT< std::pair< typename MeshType::VertexHandle,
│ │ │ +
499 typename MeshType::VertexHandle> > ep_nv_;
│ │ │ + │ │ │ +
501
│ │ │ +
502 const real_t _1over3;
│ │ │ +
503 const real_t _1over27;
│ │ │ +
504};
│ │ │ +
│ │ │ +
505
│ │ │ +
506
│ │ │ +
507//=============================================================================
│ │ │ +
508} // END_NS_UNIFORM
│ │ │ +
509} // END_NS_SUBDIVIDER
│ │ │ +
510} // END_NS_OPENMESH
│ │ │ +
511//=============================================================================
│ │ │ +
512#endif // OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH
│ │ │ +
513//=============================================================================
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ + │ │ │ +
Handle representing an edge property.
Definition Property.hh:447
│ │ │ + │ │ │ +
Uniform Sqrt3 subdivision algorithm
Definition Sqrt3T.hh:99
│ │ │ +
bool cleanup(MeshType &_m) override
Cleanup mesh after usage, e.g. remove added properties.
Definition Sqrt3T.hh:151
│ │ │ +
bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true) override
Subdivide mesh _m _n times.
Definition Sqrt3T.hh:160
│ │ │ +
bool prepare(MeshType &_m) override
Prepare mesh, e.g.
Definition Sqrt3T.hh:138
│ │ │ +
const char * name() const override
Return name of subdivision algorithm.
Definition Sqrt3T.hh:124
│ │ │ +
void init_weights(size_t _max_valence=50)
Pre-compute weights.
Definition Sqrt3T.hh:128
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,17 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -blaT_impl.hh │ │ │ │ +Sqrt3T.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -47,51 +48,522 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44// │ │ │ │ -============================================================================= │ │ │ │ -45// │ │ │ │ -46// CLASS bla - IMPLEMENTATION │ │ │ │ -47// │ │ │ │ 48// │ │ │ │ ============================================================================= │ │ │ │ -49 │ │ │ │ -50#define OPENMESH_BLA_C │ │ │ │ -51 │ │ │ │ -52//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +49// │ │ │ │ +50// CLASS Sqrt3T │ │ │ │ +51// │ │ │ │ +52// │ │ │ │ +============================================================================= │ │ │ │ 53 │ │ │ │ -54#include │ │ │ │ -55 │ │ │ │ +54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH │ │ │ │ +55#define OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH │ │ │ │ 56 │ │ │ │ -57//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -58 │ │ │ │ -59namespace _O_p_e_n_M_e_s_h { │ │ │ │ -60 │ │ │ │ -61 │ │ │ │ -62//== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -63 │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -69 │ │ │ │ -70// │ │ │ │ +57 │ │ │ │ +58//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +59 │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ +63#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ +64// Makes life lot easier, when playing/messing around with low-level topology │ │ │ │ +65// changing methods of OpenMesh │ │ │ │ +66# include │ │ │ │ +67# define ASSERT_CONSISTENCY( T, m ) \ │ │ │ │ +68 assert(OpenMesh::Utils::MeshCheckerT(m).check()) │ │ │ │ +69#else │ │ │ │ +70# define ASSERT_CONSISTENCY( T, m ) │ │ │ │ +71#endif │ │ │ │ +72// -------------------- STL │ │ │ │ +73#include │ │ │ │ +74#if defined(OM_CC_MIPS) │ │ │ │ +75# include │ │ │ │ +76#else │ │ │ │ +77# include │ │ │ │ +78#endif │ │ │ │ +79 │ │ │ │ +80 │ │ │ │ +81//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ +82 │ │ │ │ +83namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +84namespace Subdivider { // BEGIN_NS_DECIMATER │ │ │ │ +85namespace Uniform { // BEGIN_NS_DECIMATER │ │ │ │ +86 │ │ │ │ +87 │ │ │ │ +88//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +89 │ │ │ │ +90 │ │ │ │ +97template │ │ │ │ +_9_8class _S_q_r_t_3_T : public _S_u_b_d_i_v_i_d_e_r_T< MeshType, RealType > │ │ │ │ +99{ │ │ │ │ +100public: │ │ │ │ +101 │ │ │ │ +102 typedef RealType real_t; │ │ │ │ +103 typedef MeshType mesh_t; │ │ │ │ +104 typedef _S_u_b_d_i_v_i_d_e_r_T_<_ _m_e_s_h___t_,_ _r_e_a_l___t_ _> _p_a_r_e_n_t___t; │ │ │ │ +105 │ │ │ │ +106 typedef std::pair< real_t, real_t > weight_t; │ │ │ │ +107 typedef std::vector< std::pair > weights_t; │ │ │ │ +108 │ │ │ │ +109public: │ │ │ │ +110 │ │ │ │ +111 │ │ │ │ +112 _S_q_r_t_3_T(void) : _p_a_r_e_n_t___t(), _1over3( real_t(1.0/3.0) ), _1over27( real_t │ │ │ │ +(1.0/27.0) ) │ │ │ │ +113 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +114 │ │ │ │ +115 explicit _S_q_r_t_3_T(MeshType &_m) : _p_a_r_e_n_t___t(_m), _1over3( real_t(1.0/3.0) ), │ │ │ │ +_1over27( real_t(1.0/27.0) ) │ │ │ │ +116 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +117 │ │ │ │ +118 virtual _~_S_q_r_t_3_T() {} │ │ │ │ +119 │ │ │ │ +120 │ │ │ │ +121public: │ │ │ │ +122 │ │ │ │ +123 │ │ │ │ +_1_2_4 const char *_n_a_m_e() const override { return "Uniform Sqrt3"; } │ │ │ │ +125 │ │ │ │ +126 │ │ │ │ +_1_2_8 void _i_n_i_t___w_e_i_g_h_t_s(size_t _max_valence=50) │ │ │ │ +129 { │ │ │ │ +130 weights_.resize(_max_valence); │ │ │ │ +131 std::generate(weights_.begin(), weights_.end(), compute_weight()); │ │ │ │ +132 } │ │ │ │ +133 │ │ │ │ +134 │ │ │ │ +135protected: │ │ │ │ +136 │ │ │ │ +137 │ │ │ │ +_1_3_8 bool _p_r_e_p_a_r_e( MeshType& _m ) override │ │ │ │ +139 { │ │ │ │ +140 _m.request_edge_status(); │ │ │ │ +141 _m.add_property( vp_pos_ ); │ │ │ │ +142 _m.add_property( ep_nv_ ); │ │ │ │ +143 _m.add_property( mp_gen_ ); │ │ │ │ +144 _m.property( mp_gen_ ) = 0; │ │ │ │ +145 │ │ │ │ +146 return _m.has_edge_status() && vp_pos_._i_s___v_a_l_i_d() │ │ │ │ +147 && ep_nv_._i_s___v_a_l_i_d() && mp_gen_._i_s___v_a_l_i_d(); │ │ │ │ +148 } │ │ │ │ +149 │ │ │ │ +150 │ │ │ │ +_1_5_1 bool _c_l_e_a_n_u_p( MeshType& _m ) override │ │ │ │ +152 { │ │ │ │ +153 _m.release_edge_status(); │ │ │ │ +154 _m.remove_property( vp_pos_ ); │ │ │ │ +155 _m.remove_property( ep_nv_ ); │ │ │ │ +156 _m.remove_property( mp_gen_ ); │ │ │ │ +157 return true; │ │ │ │ +158 } │ │ │ │ +159 │ │ │ │ +_1_6_0 bool _s_u_b_d_i_v_i_d_e( MeshType& _m, size_t _n , const bool _update_points = true) │ │ │ │ +override │ │ │ │ +161 { │ │ │ │ +162 │ │ │ │ +164 │ │ │ │ +165 typename MeshType::Point pos(0,0,0), zero(0,0,0); │ │ │ │ +166 size_t &gen = _m.property( mp_gen_ ); │ │ │ │ +167 │ │ │ │ +168 for (size_t l=0; l<_n; ++l) │ │ │ │ +169 { │ │ │ │ +170 // tag existing edges │ │ │ │ +171 for (auto eh : _m.edges()) │ │ │ │ +172 { │ │ │ │ +173 _m.status( eh ).set_tagged( true ); │ │ │ │ +174 if ( (gen%2) && _m.is_boundary(eh) ) │ │ │ │ +175 compute_new_boundary_points( _m, eh ); // *) creates new vertices │ │ │ │ +176 } │ │ │ │ +177 │ │ │ │ +178 // do relaxation of old vertices, but store new pos in property vp_pos_ │ │ │ │ +179 │ │ │ │ +180 for (auto vh : _m.vertices()) │ │ │ │ +181 { │ │ │ │ +182 if ( _m.is_boundary(vh) ) │ │ │ │ +183 { │ │ │ │ +184 if ( gen%2 ) │ │ │ │ +185 { │ │ │ │ +186 auto heh = _m.halfedge_handle(vh); │ │ │ │ +187 if (heh.is_valid()) // skip isolated newly inserted vertices *) │ │ │ │ +188 { │ │ │ │ +189 auto prev_heh = _m.prev_halfedge_handle(heh); │ │ │ │ +190 │ │ │ │ +191 assert( _m.is_boundary(heh ) ); │ │ │ │ +192 assert( _m.is_boundary(prev_heh) ); │ │ │ │ +193 │ │ │ │ +194 pos = _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +195 pos += _m.point(_m.from_vertex_handle(prev_heh)); │ │ │ │ +196 pos *= real_t(4.0); │ │ │ │ +197 │ │ │ │ +198 pos += real_t(19.0) * _m.point( vh ); │ │ │ │ +199 pos *= _1over27; │ │ │ │ +200 │ │ │ │ +201 _m.property( vp_pos_, vh ) = pos; │ │ │ │ +202 } │ │ │ │ +203 } │ │ │ │ +204 else │ │ │ │ +205 _m.property( vp_pos_, vh ) = _m.point( vh ); │ │ │ │ +206 } │ │ │ │ +207 else │ │ │ │ +208 { │ │ │ │ +209 size_t valence=0; │ │ │ │ +210 │ │ │ │ +211 pos = zero; │ │ │ │ +212 for ( auto vvh : _m.vv_range(vh)) │ │ │ │ +213 { │ │ │ │ +214 pos += _m.point( vvh ); │ │ │ │ +215 ++valence; │ │ │ │ +216 } │ │ │ │ +217 pos *= weights_[ valence ].second; │ │ │ │ +218 pos += weights_[ valence ].first * _m.point(vh); │ │ │ │ +219 _m.property( vp_pos_, vh ) = pos; │ │ │ │ +220 } │ │ │ │ +221 } │ │ │ │ +222 │ │ │ │ +223 // insert new vertices, but store pos in vp_pos_ │ │ │ │ +224 for (auto fh : _m.faces()) │ │ │ │ +225 { │ │ │ │ +226 if ( (gen%2) && _m.is_boundary(fh)) │ │ │ │ +227 { │ │ │ │ +228 boundary_split( _m, fh ); │ │ │ │ +229 } │ │ │ │ +230 else │ │ │ │ +231 { │ │ │ │ +232 auto fvit = _m.fv_iter( fh ); │ │ │ │ +233 pos = _m.point( *fvit); │ │ │ │ +234 pos += _m.point(*(++fvit)); │ │ │ │ +235 pos += _m.point(*(++fvit)); │ │ │ │ +236 pos *= _1over3; │ │ │ │ +237 auto vh = _m.add_vertex( zero ); │ │ │ │ +238 _m.property( vp_pos_, vh ) = pos; │ │ │ │ +239 _m.split( fh, vh ); │ │ │ │ +240 } │ │ │ │ +241 } │ │ │ │ +242 │ │ │ │ +243 // commit new positions (now iterating over all vertices) │ │ │ │ +244 for (auto vh : _m.vertices()) │ │ │ │ +245 _m.set_point(vh, _m.property( vp_pos_, vh ) ); │ │ │ │ +246 │ │ │ │ +247 // flip old edges │ │ │ │ +248 for (auto eh : _m.edges()) │ │ │ │ +249 if ( _m.status( eh ).tagged() && !_m.is_boundary( eh ) ) │ │ │ │ +250 _m.flip(eh); │ │ │ │ +251 │ │ │ │ +252 // Now we have an consistent mesh! │ │ │ │ +253 ASSERT_CONSISTENCY( MeshType, _m ); │ │ │ │ +254 │ │ │ │ +255 // increase generation by one │ │ │ │ +256 ++gen; │ │ │ │ +257 } │ │ │ │ +258 return true; │ │ │ │ +259 } │ │ │ │ +260 │ │ │ │ +261private: │ │ │ │ +262 │ │ │ │ +265 struct compute_weight │ │ │ │ +266 { │ │ │ │ +267 compute_weight() : valence(-1) { } │ │ │ │ +268 weight_t operator() (void) │ │ │ │ +269 { │ │ │ │ +270#if !defined(OM_CC_MIPS) │ │ │ │ +271 using std::cos; │ │ │ │ +272#endif │ │ │ │ +273 if (++valence) │ │ │ │ +274 { │ │ │ │ +275 real_t alpha = real_t( (4.0-2.0*cos(2.0*M_PI / real_t(valence)) )/9.0 ); │ │ │ │ +276 return weight_t( real_t(1)-alpha, alpha/real_t(valence) ); │ │ │ │ +277 } │ │ │ │ +278 return weight_t(real_t(0.0), real_t(0.0) ); │ │ │ │ +279 } │ │ │ │ +280 int valence; │ │ │ │ +281 }; │ │ │ │ +282 │ │ │ │ +283private: │ │ │ │ +284 │ │ │ │ +285 // Pre-compute location of new boundary points for odd generations │ │ │ │ +286 // and store them in the edge property ep_nv_; │ │ │ │ +287 void compute_new_boundary_points( MeshType& _m, │ │ │ │ +288 const typename MeshType::EdgeHandle& _eh) │ │ │ │ +289 { │ │ │ │ +290 assert( _m.is_boundary(_eh) ); │ │ │ │ +291 │ │ │ │ +292 typename MeshType::HalfedgeHandle heh; │ │ │ │ +293 typename MeshType::VertexHandle vh1, vh2, vh3, vh4, vhl, vhr; │ │ │ │ +294 typename MeshType::Point zero(0,0,0), P1, P2, P3, P4; │ │ │ │ +295 │ │ │ │ +296 /* │ │ │ │ +297 // *---------*---------* │ │ │ │ +298 // / \ / \ / \ │ │ │ │ +299 // / \ / \ / \ │ │ │ │ +300 // / \ / \ / \ │ │ │ │ +301 // / \ / \ / \ │ │ │ │ +302 // *---------*--#---#--*---------* │ │ │ │ +303 // │ │ │ │ +304 // ^ ^ ^ ^ ^ ^ │ │ │ │ +305 // P1 P2 pl pr P3 P4 │ │ │ │ +306 */ │ │ │ │ +307 // get halfedge pointing from P3 to P2 (outer boundary halfedge) │ │ │ │ +308 │ │ │ │ +309 heh = _m.halfedge_handle(_eh, │ │ │ │ +310 _m.is_boundary(_m.halfedge_handle(_eh,1))); │ │ │ │ +311 │ │ │ │ +312 assert( _m.is_boundary( _m.next_halfedge_handle( heh ) ) ); │ │ │ │ +313 assert( _m.is_boundary( _m.prev_halfedge_handle( heh ) ) ); │ │ │ │ +314 │ │ │ │ +315 vh1 = _m.to_vertex_handle( _m.next_halfedge_handle( heh ) ); │ │ │ │ +316 vh2 = _m.to_vertex_handle( heh ); │ │ │ │ +317 vh3 = _m.from_vertex_handle( heh ); │ │ │ │ +318 vh4 = _m.from_vertex_handle( _m.prev_halfedge_handle( heh )); │ │ │ │ +319 │ │ │ │ +320 P1 = _m.point(vh1); │ │ │ │ +321 P2 = _m.point(vh2); │ │ │ │ +322 P3 = _m.point(vh3); │ │ │ │ +323 P4 = _m.point(vh4); │ │ │ │ +324 │ │ │ │ +325 vhl = _m.add_vertex(zero); │ │ │ │ +326 vhr = _m.add_vertex(zero); │ │ │ │ +327 │ │ │ │ +328 _m.property(vp_pos_, vhl ) = (P1 + real_t(16.0f) * P2 + real_t(10.0f) * P3) │ │ │ │ +* _1over27; │ │ │ │ +329 _m.property(vp_pos_, vhr ) = ( real_t(10.0f) * P2 + real_t(16.0f) * P3 + │ │ │ │ +P4) * _1over27; │ │ │ │ +330 _m.property(ep_nv_, _eh).first = vhl; │ │ │ │ +331 _m.property(ep_nv_, _eh).second = vhr; │ │ │ │ +332 } │ │ │ │ +333 │ │ │ │ +334 │ │ │ │ +335 void boundary_split( MeshType& _m, const typename MeshType::FaceHandle& _fh │ │ │ │ +) │ │ │ │ +336 { │ │ │ │ +337 assert( _m.is_boundary(_fh) ); │ │ │ │ +338 │ │ │ │ +339 typename MeshType::VertexHandle vhl, vhr; │ │ │ │ +340 typename MeshType::FaceEdgeIter fe_it; │ │ │ │ +341 typename MeshType::HalfedgeHandle heh; │ │ │ │ +342 │ │ │ │ +343 // find boundary edge │ │ │ │ +344 for( fe_it=_m.fe_iter( _fh ); fe_it.is_valid() && !_m.is_boundary( *fe_it │ │ │ │ +); ++fe_it ) {}; │ │ │ │ +345 │ │ │ │ +346 // use precomputed, already inserted but not linked vertices │ │ │ │ +347 vhl = _m.property(ep_nv_, *fe_it).first; │ │ │ │ +348 vhr = _m.property(ep_nv_, *fe_it).second; │ │ │ │ +349 │ │ │ │ +350 /* │ │ │ │ +351 // *---------*---------* │ │ │ │ +352 // / \ / \ / \ │ │ │ │ +353 // / \ / \ / \ │ │ │ │ +354 // / \ / \ / \ │ │ │ │ +355 // / \ / \ / \ │ │ │ │ +356 // *---------*--#---#--*---------* │ │ │ │ +357 // │ │ │ │ +358 // ^ ^ ^ ^ ^ ^ │ │ │ │ +359 // P1 P2 pl pr P3 P4 │ │ │ │ +360 */ │ │ │ │ +361 // get halfedge pointing from P2 to P3 (inner boundary halfedge) │ │ │ │ +362 │ │ │ │ +363 heh = _m.halfedge_handle(*fe_it, │ │ │ │ +364 _m.is_boundary(_m.halfedge_handle(*fe_it,0))); │ │ │ │ +365 │ │ │ │ +366 typename MeshType::HalfedgeHandle pl_P3; │ │ │ │ +367 │ │ │ │ +368 // split P2->P3 (heh) in P2->pl (heh) and pl->P3 │ │ │ │ +369 boundary_split( _m, heh, vhl ); // split edge │ │ │ │ +370 pl_P3 = _m.next_halfedge_handle( heh ); // store next halfedge handle │ │ │ │ +371 boundary_split( _m, heh ); // split face │ │ │ │ +372 │ │ │ │ +373 // split pl->P3 in pl->pr and pr->P3 │ │ │ │ +374 boundary_split( _m, pl_P3, vhr ); │ │ │ │ +375 boundary_split( _m, pl_P3 ); │ │ │ │ +376 │ │ │ │ +377 assert( _m.is_boundary( vhl ) && _m.halfedge_handle(vhl).is_valid() ); │ │ │ │ +378 assert( _m.is_boundary( vhr ) && _m.halfedge_handle(vhr).is_valid() ); │ │ │ │ +379 } │ │ │ │ +380 │ │ │ │ +381 void boundary_split(MeshType& _m, │ │ │ │ +382 const typename MeshType::HalfedgeHandle& _heh, │ │ │ │ +383 const typename MeshType::VertexHandle& _vh) │ │ │ │ +384 { │ │ │ │ +385 assert( _m.is_boundary( _m.edge_handle(_heh) ) ); │ │ │ │ +386 │ │ │ │ +387 typename MeshType::HalfedgeHandle │ │ │ │ +388 heh(_heh), │ │ │ │ +389 opp_heh( _m.opposite_halfedge_handle(_heh) ), │ │ │ │ +390 new_heh, opp_new_heh; │ │ │ │ +391 typename MeshType::VertexHandle to_vh(_m.to_vertex_handle(heh)); │ │ │ │ +392 typename MeshType::HalfedgeHandle t_heh; │ │ │ │ +393 │ │ │ │ +394 /* │ │ │ │ +395 * P5 │ │ │ │ +396 * * │ │ │ │ +397 * /|\ │ │ │ │ +398 * / \ │ │ │ │ +399 * / \ │ │ │ │ +400 * / \ │ │ │ │ +401 * / \ │ │ │ │ +402 * /_ heh new \ │ │ │ │ +403 * *-----\*-----\*\-----* │ │ │ │ +404 * ^ ^ t_heh │ │ │ │ +405 * _vh to_vh │ │ │ │ +406 * │ │ │ │ +407 * P1 P2 P3 P4 │ │ │ │ +408 */ │ │ │ │ +409 // Re-Setting Handles │ │ │ │ +410 │ │ │ │ +411 // find halfedge point from P4 to P3 │ │ │ │ +412 for(t_heh = heh; │ │ │ │ +413 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +414 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh))) │ │ │ │ +415 {} │ │ │ │ +416 │ │ │ │ +417 assert( _m.is_boundary( t_heh ) ); │ │ │ │ +418 │ │ │ │ +419 new_heh = _m.new_edge( _vh, to_vh ); │ │ │ │ +420 opp_new_heh = _m.opposite_halfedge_handle(new_heh); │ │ │ │ +421 │ │ │ │ +422 // update halfedge connectivity │ │ │ │ +423 │ │ │ │ +424 _m.set_next_halfedge_handle(t_heh, opp_new_heh); // P4-P3 -> P3-P2 │ │ │ │ +425 // P2-P3 -> P3-P5 │ │ │ │ +426 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh)); │ │ │ │ +427 _m.set_next_halfedge_handle(heh, new_heh); // P1-P2 -> P2-P3 │ │ │ │ +428 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); // P3-P2 -> P2-P1 │ │ │ │ +429 │ │ │ │ +430 // both opposite halfedges point to same face │ │ │ │ +431 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh)); │ │ │ │ +432 │ │ │ │ +433 // let heh finally point to new inserted vertex │ │ │ │ +434 _m.set_vertex_handle(heh, _vh); │ │ │ │ +435 │ │ │ │ +436 // let heh and new_heh point to same face │ │ │ │ +437 _m.set_face_handle(new_heh, _m.face_handle(heh)); │ │ │ │ +438 │ │ │ │ +439 // let opp_new_heh be the new outgoing halfedge for to_vh │ │ │ │ +440 // (replaces for opp_heh) │ │ │ │ +441 _m.set_halfedge_handle( to_vh, opp_new_heh ); │ │ │ │ +442 │ │ │ │ +443 // let opp_heh be the outgoing halfedge for _vh │ │ │ │ +444 _m.set_halfedge_handle( _vh, opp_heh ); │ │ │ │ +445 } │ │ │ │ +446 │ │ │ │ +447 void boundary_split( MeshType& _m, │ │ │ │ +448 const typename MeshType::HalfedgeHandle& _heh) │ │ │ │ +449 { │ │ │ │ +450 assert( _m.is_boundary( _m.opposite_halfedge_handle( _heh ) ) ); │ │ │ │ +451 │ │ │ │ +452 typename MeshType::HalfedgeHandle │ │ │ │ +453 heh(_heh), │ │ │ │ +454 n_heh(_m.next_halfedge_handle(heh)); │ │ │ │ +455 │ │ │ │ +456 typename MeshType::VertexHandle │ │ │ │ +457 to_vh(_m.to_vertex_handle(heh)); │ │ │ │ +458 │ │ │ │ +459 typename MeshType::HalfedgeHandle │ │ │ │ +460 heh2(_m.new_edge(to_vh, │ │ │ │ +461 _m.to_vertex_handle(_m.next_halfedge_handle(n_heh)))), │ │ │ │ +462 heh3(_m.opposite_halfedge_handle(heh2)); │ │ │ │ +463 │ │ │ │ +464 typename MeshType::FaceHandle │ │ │ │ +465 new_fh(_m.new_face()), │ │ │ │ +466 fh(_m.face_handle(heh)); │ │ │ │ +467 │ │ │ │ +468 // Relink (half)edges │ │ │ │ +469 │ │ │ │ +470#define set_next_heh set_next_halfedge_handle │ │ │ │ +471#define next_heh next_halfedge_handle │ │ │ │ +472 │ │ │ │ +473 _m.set_face_handle(heh, new_fh); │ │ │ │ +474 _m.set_face_handle(heh2, new_fh); │ │ │ │ +475 _m.set_next_heh(heh2, _m.next_heh(_m.next_heh(n_heh))); │ │ │ │ +476 _m.set_next_heh(heh, heh2); │ │ │ │ +477 _m.set_face_handle( _m.next_heh(heh2), new_fh); │ │ │ │ +478 │ │ │ │ +479 // _m.set_face_handle( _m.next_heh(_m.next_heh(heh2)), new_fh); │ │ │ │ +480 │ │ │ │ +481 _m.set_next_heh(heh3, n_heh); │ │ │ │ +482 _m.set_next_heh(_m.next_halfedge_handle(n_heh), heh3); │ │ │ │ +483 _m.set_face_handle(heh3, fh); │ │ │ │ +484 // _m.set_face_handle(n_heh, fh); │ │ │ │ +485 │ │ │ │ +486 _m.set_halfedge_handle( fh, n_heh); │ │ │ │ +487 _m.set_halfedge_handle(new_fh, heh); │ │ │ │ +488 │ │ │ │ +489#undef set_next_halfedge_handle │ │ │ │ +490#undef next_halfedge_handle │ │ │ │ +491 │ │ │ │ +492 } │ │ │ │ +493 │ │ │ │ +494private: │ │ │ │ +495 │ │ │ │ +496 weights_t weights_; │ │ │ │ +497 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _M_e_s_h_T_y_p_e_:_:_P_o_i_n_t_ _> vp_pos_; │ │ │ │ +498 _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T< std::pair< typename MeshType::VertexHandle, │ │ │ │ +499 typename MeshType::VertexHandle> > ep_nv_; │ │ │ │ +500 _O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_ _s_i_z_e___t_ _> mp_gen_; │ │ │ │ +501 │ │ │ │ +502 const real_t _1over3; │ │ │ │ +503 const real_t _1over27; │ │ │ │ +504}; │ │ │ │ +505 │ │ │ │ +506 │ │ │ │ +507// │ │ │ │ +============================================================================= │ │ │ │ +508} // END_NS_UNIFORM │ │ │ │ +509} // END_NS_SUBDIVIDER │ │ │ │ +510} // END_NS_OPENMESH │ │ │ │ +511// │ │ │ │ ============================================================================= │ │ │ │ -71} // namespace OpenMesh │ │ │ │ -72// │ │ │ │ +512#endif // OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH │ │ │ │ +513// │ │ │ │ ============================================================================= │ │ │ │ +_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ +bool is_valid() const │ │ │ │ +The handle is valid iff the index is not negative. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _M_e_s_h_T_y_p_e_:_:_P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing an edge property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:447 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_ _s_i_z_e___t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_q_r_t_3_T │ │ │ │ +Uniform Sqrt3 subdivision algorithm │ │ │ │ +DDeeffiinniittiioonn Sqrt3T.hh:99 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_q_r_t_3_T_:_:_c_l_e_a_n_u_p │ │ │ │ +bool cleanup(MeshType &_m) override │ │ │ │ +Cleanup mesh after usage, e.g. remove added properties. │ │ │ │ +DDeeffiinniittiioonn Sqrt3T.hh:151 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_q_r_t_3_T_:_:_s_u_b_d_i_v_i_d_e │ │ │ │ +bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true) │ │ │ │ +override │ │ │ │ +Subdivide mesh _m _n times. │ │ │ │ +DDeeffiinniittiioonn Sqrt3T.hh:160 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_q_r_t_3_T_:_:_p_r_e_p_a_r_e │ │ │ │ +bool prepare(MeshType &_m) override │ │ │ │ +Prepare mesh, e.g. │ │ │ │ +DDeeffiinniittiioonn Sqrt3T.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_q_r_t_3_T_:_:_n_a_m_e │ │ │ │ +const char * name() const override │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn Sqrt3T.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_q_r_t_3_T_:_:_i_n_i_t___w_e_i_g_h_t_s │ │ │ │ +void init_weights(size_t _max_valence=50) │ │ │ │ +Pre-compute weights. │ │ │ │ +DDeeffiinniittiioonn Sqrt3T.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00515_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/OMFormat.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/CompositeSqrt3T.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OMFormat.hh
│ │ │ +
CompositeSqrt3T.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -138,734 +138,124 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45#ifndef OPENMESH_IO_OMFORMAT_HH
│ │ │ -
46#define OPENMESH_IO_OMFORMAT_HH
│ │ │ -
47
│ │ │ -
48
│ │ │ -
49//=== INCLUDES ================================================================
│ │ │ -
50
│ │ │ -
51#include <OpenMesh/Core/System/config.h>
│ │ │ - │ │ │ -
53#include <OpenMesh/Core/IO/SR_store.hh>
│ │ │ -
54#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
55#include <OpenMesh/Core/Utils/Endian.hh>
│ │ │ -
56#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ -
57// --------------------
│ │ │ -
58#include <iostream>
│ │ │ -
59#if defined(OM_CC_GCC) && (OM_GCC_VERSION < 30000)
│ │ │ - │ │ │ -
61# define OM_MISSING_HEADER_LIMITS 1
│ │ │ -
62#else
│ │ │ -
63# include <limits>
│ │ │ -
64#endif
│ │ │ +
48//=============================================================================
│ │ │ +
49//
│ │ │ +
50// CLASS SQRT3T
│ │ │ +
51//
│ │ │ +
52//=============================================================================
│ │ │ +
53
│ │ │ +
54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITESQRT3T_HH
│ │ │ +
55#define OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITESQRT3T_HH
│ │ │ +
56
│ │ │ +
57
│ │ │ +
58//== INCLUDES =================================================================
│ │ │ +
59
│ │ │ +
60#include "Composite/CompositeT.hh"
│ │ │ +
61#include "Composite/CompositeTraits.hh"
│ │ │ +
62
│ │ │ +
63
│ │ │ +
64//== NAMESPACE ================================================================
│ │ │
65
│ │ │ -
66
│ │ │ -
67//== NAMESPACES ==============================================================
│ │ │ -
68
│ │ │ -
69#ifndef DOXY_IGNORE_THIS
│ │ │ -
70namespace OpenMesh {
│ │ │ -
71namespace IO {
│ │ │ -
72namespace OMFormat {
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75//=== IMPLEMENTATION ==========================================================
│ │ │ -
76
│ │ │ -
77
│ │ │ +
66namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
67namespace Subdivider { // BEGIN_NS_DECIMATER
│ │ │ +
68namespace Uniform { // BEGIN_NS_UNIFORM
│ │ │ +
69
│ │ │ +
70
│ │ │ +
71//== CLASS DEFINITION =========================================================
│ │ │ +
72
│ │ │ +
75template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
76class CompositeSqrt3T : public CompositeT<MeshType, RealType>
│ │ │ +
77{
│ │ │ +
78public:
│ │ │ +
79
│ │ │ + │ │ │
81
│ │ │ -
82//-----------------------------------------------------------------------------
│ │ │ +
82public:
│ │ │
83
│ │ │ -
84 // <:Header>
│ │ │ -
85 // <:Comment>
│ │ │ -
86 // Chunk 0
│ │ │ -
87 // <:ChunkHeader>
│ │ │ -
88 // <:Comment>
│ │ │ -
89 // data
│ │ │ -
90 // Chunk 1
│ │ │ -
91 // <:ChunkHeader>
│ │ │ -
92 // <:Comment>
│ │ │ -
93 // data
│ │ │ -
94 // .
│ │ │ -
95 // .
│ │ │ -
96 // .
│ │ │ -
97 // Chunk N
│ │ │ -
98
│ │ │ -
99 //
│ │ │ -
100 // NOTICE!
│ │ │ -
101 //
│ │ │ -
102 // The usage of data types who differ in size
│ │ │ -
103 // on different pc architectures (32/64 bit) and/or
│ │ │ -
104 // operating systems, e.g. (unsigned) long, size_t,
│ │ │ -
105 // is not recommended because of inconsistencies
│ │ │ -
106 // in case of cross writing and reading.
│ │ │ -
107 //
│ │ │ -
108 // Basic types that are supported are:
│ │ │ -
109
│ │ │ -
110
│ │ │ -
111 typedef unsigned char uchar;
│ │ │ -
112 typedef uint8_t uint8;
│ │ │ -
113 typedef uint16_t uint16;
│ │ │ -
114 typedef uint32_t uint32;
│ │ │ -
115 typedef uint64_t uint64;
│ │ │ -
116 typedef int8_t int8;
│ │ │ -
117 typedef int16_t int16;
│ │ │ -
118 typedef int32_t int32;
│ │ │ -
119 typedef int64_t int64;
│ │ │ -
120 typedef float32_t float32;
│ │ │ -
121 typedef float64_t float64;
│ │ │ -
122
│ │ │ -
123 struct Header
│ │ │ -
124 {
│ │ │ -
125 uchar magic_[2]; // OM
│ │ │ -
126 uchar mesh_; // [T]riangles, [Q]uads, [P]olygonals
│ │ │ -
127 uint8 version_;
│ │ │ -
128 uint32 n_vertices_;
│ │ │ -
129 uint32 n_faces_;
│ │ │ -
130 uint32 n_edges_;
│ │ │ -
131
│ │ │ -
132 size_t store( std::ostream& _os, bool _swap ) const
│ │ │ -
133 {
│ │ │ -
134 _os.write( (char*)this, 4); // magic_, mesh_, version_
│ │ │ -
135 size_t bytes = 4;
│ │ │ -
136 bytes += binary<uint32_t>::store( _os, n_vertices_, _swap );
│ │ │ -
137 bytes += binary<uint32_t>::store( _os, n_faces_, _swap );
│ │ │ -
138 bytes += binary<uint32_t>::store( _os, n_edges_, _swap );
│ │ │ -
139 return bytes;
│ │ │ -
140 }
│ │ │ + │ │ │ +
85 explicit CompositeSqrt3T(MeshType& _mesh) : Inherited(_mesh) {};
│ │ │ + │ │ │ +
87
│ │ │ +
88public:
│ │ │ +
89
│ │ │ +
90 const char *name() const override { return "Uniform Composite Sqrt3"; }
│ │ │ +
91
│ │ │ +
92protected: // inherited interface
│ │ │ +
93
│ │ │ +
│ │ │ +
94 void apply_rules(void) override
│ │ │ +
95 {
│ │ │ +
96 Inherited::Tvv3();
│ │ │ +
97 Inherited::VF();
│ │ │ +
98 Inherited::FF();
│ │ │ +
99 Inherited::FVc(coeffs_);
│ │ │ +
100 }
│ │ │ +
│ │ │ +
101
│ │ │ +
102protected:
│ │ │ +
103
│ │ │ +
104 typedef typename Inherited::Coeff Coeff;
│ │ │ +
105
│ │ │ +
│ │ │ +
109 struct FVCoeff : public Coeff
│ │ │ +
110 {
│ │ │ +
111 FVCoeff() : Coeff() { init(50); }
│ │ │ +
112
│ │ │ +
113 void init(size_t _max_valence)
│ │ │ +
114 {
│ │ │ +
115 weights_.resize(_max_valence);
│ │ │ +
116 std::generate(weights_.begin(),
│ │ │ +
117 weights_.end(), compute_weight() );
│ │ │ +
118 }
│ │ │ +
119
│ │ │ +
120 double operator()(size_t _valence) override { return weights_[_valence]; }
│ │ │ +
121
│ │ │ +
│ │ │ + │ │ │ +
125 {
│ │ │ +
126 compute_weight() : val_(0) { }
│ │ │ +
127
│ │ │ +
128 double operator()(void) // sqrt(3) weights for non-boundary vertices
│ │ │ +
129 {
│ │ │ +
130 return 2.0/3.0 * (cos(2.0*M_PI/val_++)+1.0);
│ │ │ +
131 }
│ │ │ +
132 size_t val_;
│ │ │ +
133 };
│ │ │ +
│ │ │ +
134
│ │ │ +
135 std::vector<double> weights_;
│ │ │ +
136
│ │ │ +
137 } coeffs_;
│ │ │ +
│ │ │ +
138
│ │ │ +
139};
│ │ │ +
│ │ │ +
140
│ │ │
141
│ │ │ -
142 size_t restore( std::istream& _is, bool _swap )
│ │ │ -
143 {
│ │ │ -
144 if (_is.read( reinterpret_cast<char*>(this) , 4 ).eof())
│ │ │ -
145 return 0;
│ │ │ -
146
│ │ │ -
147 size_t bytes = 4;
│ │ │ -
148 bytes += binary<uint32_t>::restore( _is, n_vertices_, _swap );
│ │ │ -
149 bytes += binary<uint32_t>::restore( _is, n_faces_, _swap );
│ │ │ -
150 bytes += binary<uint32_t>::restore( _is, n_edges_, _swap );
│ │ │ -
151 return bytes;
│ │ │ -
152 }
│ │ │ -
153
│ │ │ -
154 };
│ │ │ -
155
│ │ │ -
156 struct Chunk
│ │ │ -
157 {
│ │ │ -
158 // Hardcoded this size to an uint32 to make the system 32/64 bit compatible.
│ │ │ -
159 // Needs further investigation!
│ │ │ -
160 typedef uint32 esize_t; // element size, used for custom properties
│ │ │ -
161
│ │ │ -
162 enum Type {
│ │ │ -
163 Type_Pos = 0x00,
│ │ │ -
164 Type_Normal = 0x01,
│ │ │ -
165 Type_Texcoord = 0x02,
│ │ │ -
166 Type_Status = 0x03,
│ │ │ -
167 Type_Color = 0x04,
│ │ │ -
168 Type_Custom = 0x06,
│ │ │ -
169 Type_Topology = 0x07
│ │ │ -
170 };
│ │ │ -
171
│ │ │ -
172 enum Entity {
│ │ │ -
173 Entity_Vertex = 0x00,
│ │ │ -
174 Entity_Mesh = 0x01,
│ │ │ -
175 Entity_Face = 0x02,
│ │ │ -
176 Entity_Edge = 0x04,
│ │ │ -
177 Entity_Halfedge = 0x06,
│ │ │ -
178 Entity_Sentinel = 0x07
│ │ │ -
179 };
│ │ │ -
180
│ │ │ -
181 enum Dim {
│ │ │ -
182 Dim_1D = 0x00,
│ │ │ -
183 Dim_2D = 0x01,
│ │ │ -
184 Dim_3D = 0x02,
│ │ │ -
185 Dim_4D = 0x03,
│ │ │ -
186 Dim_5D = 0x04,
│ │ │ -
187 Dim_6D = 0x05,
│ │ │ -
188 Dim_7D = 0x06,
│ │ │ -
189 Dim_8D = 0x07
│ │ │ -
190 };
│ │ │ -
191
│ │ │ -
192 enum Integer_Size {
│ │ │ -
193 Integer_8 = 0x00, // 1 byte for (unsigned) char
│ │ │ -
194 Integer_16 = 0x01, // 2 bytes for short
│ │ │ -
195 Integer_32 = 0x02, // 4 bytes for long
│ │ │ -
196 Integer_64 = 0x03 // 8 bytes for long long
│ │ │ -
197 };
│ │ │ -
198
│ │ │ -
199 enum Float_Size {
│ │ │ -
200 Float_32 = 0x00, // 4 bytes for float
│ │ │ -
201 Float_64 = 0x01, // 8 bytes for double
│ │ │ -
202 Float_128 = 0x02 // 16 bytes for long double (an assumption!)
│ │ │ -
203 };
│ │ │ -
204
│ │ │ -
205 static const int SIZE_RESERVED = 1; // 1
│ │ │ -
206 static const int SIZE_NAME = 1; // 2
│ │ │ -
207 static const int SIZE_ENTITY = 3; // 5
│ │ │ -
208 static const int SIZE_TYPE = 4; // 9
│ │ │ -
209
│ │ │ -
210 static const int SIZE_SIGNED = 1; // 10
│ │ │ -
211 static const int SIZE_FLOAT = 1; // 11
│ │ │ -
212 static const int SIZE_DIM = 3; // 14
│ │ │ -
213 static const int SIZE_BITS = 2; // 16
│ │ │ -
214
│ │ │ -
215 static const int OFF_RESERVED = 0; // 0
│ │ │ -
216 static const int OFF_NAME = SIZE_RESERVED + OFF_RESERVED; // 2
│ │ │ -
217 static const int OFF_ENTITY = SIZE_NAME + OFF_NAME; // 3
│ │ │ -
218 static const int OFF_TYPE = SIZE_ENTITY + OFF_ENTITY; // 5
│ │ │ -
219 static const int OFF_SIGNED = SIZE_TYPE + OFF_TYPE; // 9
│ │ │ -
220 static const int OFF_FLOAT = SIZE_SIGNED + OFF_SIGNED; // 10
│ │ │ -
221 static const int OFF_DIM = SIZE_FLOAT + OFF_FLOAT; // 11
│ │ │ -
222 static const int OFF_BITS = SIZE_DIM + OFF_DIM; // 14
│ │ │ -
223
│ │ │ -
224 // !Attention! When changing the bit size, the operators
│ │ │ -
225 // << (uint16, Header) and << (Header, uint16) must be changed as well
│ │ │ -
226 //
│ │ │ -
227 // Entries signed_, float_, dim_, bits_ are not used when type_
│ │ │ -
228 // equals Type_Custom
│ │ │ -
229 //
│ │ │ -
230 struct Header // 16 bits long
│ │ │ -
231 {
│ │ │ -
232 unsigned reserved_: SIZE_RESERVED;
│ │ │ -
233 unsigned name_ : SIZE_NAME; // 1 named property, 0 anonymous
│ │ │ -
234 unsigned entity_ : SIZE_ENTITY; // 0 vertex, 1 mesh, 2 edge,
│ │ │ -
235 // 4 halfedge, 6 face
│ │ │ -
236 unsigned type_ : SIZE_TYPE; // 0 pos, 1 normal, 2 texcoord,
│ │ │ -
237 // 3 status, 4 color 6 custom 7 topology
│ │ │ -
238 unsigned signed_ : SIZE_SIGNED; // bool
│ │ │ -
239 unsigned float_ : SIZE_FLOAT; // bool
│ │ │ -
240 unsigned dim_ : SIZE_DIM; // 0 1D, 1 2D, 2 3D, .., 7 8D
│ │ │ -
241 unsigned bits_ : SIZE_BITS; // {8, 16, 32, 64} | {32, 64, 128}
│ │ │ -
242 // (integer) (float)
│ │ │ -
243 unsigned unused_ : 16; // fill up to 32 bits
│ │ │ -
244 }; // struct Header
│ │ │ -
245
│ │ │ -
246
│ │ │ -
247 class PropertyName : public std::string
│ │ │ -
248 {
│ │ │ -
249 public:
│ │ │ -
250
│ │ │ -
251 static const size_t size_max = 256;
│ │ │ -
252
│ │ │ -
253 PropertyName( ) { }
│ │ │ -
254
│ │ │ -
255 explicit PropertyName( const std::string& _name ) { *this = _name; }
│ │ │ -
256
│ │ │ -
257 bool is_valid() const { return is_valid( size() ); }
│ │ │ -
258
│ │ │ -
259 static bool is_valid( size_t _s ) { return _s <= size_max; }
│ │ │ -
260
│ │ │ -
261 PropertyName& operator = ( const std::string& _rhs )
│ │ │ -
262 {
│ │ │ -
263 assert( is_valid( _rhs.size() ) );
│ │ │ -
264
│ │ │ -
265 if ( is_valid( _rhs.size() ) )
│ │ │ -
266 std::string::operator = ( _rhs );
│ │ │ -
267 else
│ │ │ -
268 {
│ │ │ -
269 omerr() << "Warning! Property name too long. Will be shortened!\n";
│ │ │ -
270 this->std::string::operator = ( _rhs.substr(0, size_max) );
│ │ │ -
271 }
│ │ │ -
272
│ │ │ -
273 return *this;
│ │ │ -
274 }
│ │ │ -
275
│ │ │ -
276 };
│ │ │ -
277
│ │ │ -
278 }; // Chunk
│ │ │ -
279
│ │ │ -
280 // ------------------------------------------------------------ Helper
│ │ │ -
281 // -------------------- get size information
│ │ │ -
282
│ │ │ -
284 inline size_t header_size(void) { return sizeof(Header); }
│ │ │ -
285
│ │ │ -
286
│ │ │ -
288 inline size_t chunk_header_size( void ) { return sizeof(uint16); }
│ │ │ -
289
│ │ │ -
290
│ │ │ -
292 inline size_t scalar_size( const Chunk::Header& _hdr )
│ │ │ -
293 {
│ │ │ -
294 return _hdr.float_ ? (0x01 << _hdr.bits_) : (0x04 << _hdr.bits_);
│ │ │ -
295 }
│ │ │ -
296
│ │ │ -
297
│ │ │ -
299 inline size_t dimensions(const Chunk::Header& _chdr) { return _chdr.dim_+1; }
│ │ │ -
300
│ │ │ -
301
│ │ │ -
303 inline size_t vector_size( const Chunk::Header& _chdr )
│ │ │ -
304 {
│ │ │ -
305 return dimensions(_chdr)*scalar_size(_chdr);
│ │ │ -
306 }
│ │ │ -
307
│ │ │ -
308
│ │ │ -
310 inline size_t chunk_data_size( const Header& _hdr, const Chunk::Header& _chunk_hdr )
│ │ │ -
311 {
│ │ │ -
312 size_t C;
│ │ │ -
313 switch( _chunk_hdr.entity_ )
│ │ │ -
314 {
│ │ │ -
315 case Chunk::Entity_Vertex: C = _hdr.n_vertices_; break;
│ │ │ -
316 case Chunk::Entity_Face: C = _hdr.n_faces_; break;
│ │ │ -
317 case Chunk::Entity_Halfedge: C = _hdr.n_edges_*2; break;
│ │ │ -
318 case Chunk::Entity_Edge: C = _hdr.n_edges_; break;
│ │ │ -
319 case Chunk::Entity_Mesh: C = 1; break;
│ │ │ -
320 default:
│ │ │ -
321 C = 0;
│ │ │ -
322 std::cerr << "Invalid value in _chunk_hdr.entity_\n";
│ │ │ -
323 assert( false );
│ │ │ -
324 break;
│ │ │ -
325 }
│ │ │ -
326
│ │ │ -
327 return C * vector_size( _chunk_hdr );
│ │ │ -
328 }
│ │ │ -
329
│ │ │ -
330 inline size_t chunk_size( const Header& _hdr, const Chunk::Header& _chunk_hdr )
│ │ │ -
331 {
│ │ │ -
332 return chunk_header_size() + chunk_data_size( _hdr, _chunk_hdr );
│ │ │ -
333 }
│ │ │ -
334
│ │ │ -
335 // -------------------- convert from Chunk::Header to storage type
│ │ │ -
336
│ │ │ -
337 uint16& operator << (uint16& val, const Chunk::Header& hdr);
│ │ │ -
338 Chunk::Header& operator << (Chunk::Header& hdr, const uint16 val);
│ │ │ -
339
│ │ │ -
340
│ │ │ -
341 // -------------------- type information
│ │ │ -
342
│ │ │ -
343 template <typename T> bool is_float(const T&)
│ │ │ -
344 {
│ │ │ -
345#if defined(OM_MISSING_HEADER_LIMITS)
│ │ │ -
346 return !Utils::NumLimitsT<T>::is_integer();
│ │ │ -
347#else
│ │ │ -
348 return !std::numeric_limits<T>::is_integer;
│ │ │ -
349#endif
│ │ │ -
350 }
│ │ │ -
351
│ │ │ -
352 template <typename T> bool is_double(const T&)
│ │ │ -
353 {
│ │ │ -
354 return false;
│ │ │ -
355 }
│ │ │ -
356
│ │ │ -
357 template <> inline bool is_double(const double&)
│ │ │ -
358 {
│ │ │ -
359 return true;
│ │ │ -
360 }
│ │ │ -
361
│ │ │ -
362 template <typename T> bool is_integer(const T)
│ │ │ -
363 {
│ │ │ -
364#if defined(OM_MISSING_HEADER_LIMITS)
│ │ │ -
365 return Utils::NumLimitsT<T>::is_integer();
│ │ │ -
366#else
│ │ │ -
367 return std::numeric_limits<T>::is_integer;
│ │ │ -
368#endif
│ │ │ -
369 }
│ │ │ -
370
│ │ │ -
371 template <typename T> bool is_signed(const T&)
│ │ │ -
372 {
│ │ │ -
373#if defined(OM_MISSING_HEADER_LIMITS)
│ │ │ -
374 return Utils::NumLimitsT<T>::is_signed();
│ │ │ -
375#else
│ │ │ -
376 return std::numeric_limits<T>::is_signed;
│ │ │ -
377#endif
│ │ │ -
378 }
│ │ │ -
379
│ │ │ -
380 // -------------------- conversions (format type <- type/value)
│ │ │ -
381
│ │ │ -
382 template <typename VecType>
│ │ │ -
383 inline
│ │ │ -
384 Chunk::Dim dim( VecType )
│ │ │ -
385 {
│ │ │ -
386 assert( vector_traits< VecType >::size() < 9 );
│ │ │ -
387 return static_cast<Chunk::Dim>(vector_traits< VecType >::size() - 1);
│ │ │ -
388 }
│ │ │ -
389
│ │ │ -
390 template <typename VecType>
│ │ │ -
391 inline
│ │ │ -
392 Chunk::Dim dim( const Chunk::Header& _hdr )
│ │ │ -
393 {
│ │ │ -
394 return static_cast<Chunk::Dim>( _hdr.dim_ );
│ │ │ -
395 }
│ │ │ -
396
│ │ │ -
397 // calc minimum (power-of-2) number of bits needed
│ │ │ -
398 Chunk::Integer_Size needed_bits( size_t s );
│ │ │ -
399
│ │ │ -
400 // Convert size of type to Integer_Size
│ │ │ -
401#ifdef NDEBUG
│ │ │ -
402 template <typename T> Chunk::Integer_Size integer_size(const T&)
│ │ │ -
403#else
│ │ │ -
404 template <typename T> Chunk::Integer_Size integer_size(const T& d)
│ │ │ -
405#endif
│ │ │ -
406 {
│ │ │ -
407#ifndef NDEBUG
│ │ │ -
408 assert( is_integer(d) );
│ │ │ -
409#endif
│ │ │ -
410
│ │ │ -
411 switch( sizeof(T) )
│ │ │ -
412 {
│ │ │ -
413 case 1: return OMFormat::Chunk::Integer_8;
│ │ │ -
414 case 2: return OMFormat::Chunk::Integer_16;
│ │ │ -
415 case 4: return OMFormat::Chunk::Integer_32;
│ │ │ -
416 case 8: return OMFormat::Chunk::Integer_64;
│ │ │ -
417 default:
│ │ │ -
418 std::cerr << "Invalid value in integer_size\n";
│ │ │ -
419 assert( false );
│ │ │ -
420 break;
│ │ │ -
421 }
│ │ │ -
422 return Chunk::Integer_Size(0);
│ │ │ -
423 }
│ │ │ -
424
│ │ │ -
425
│ │ │ -
426 // Convert size of type to FLoat_Size
│ │ │ -
427#ifdef NDEBUG
│ │ │ -
428 template <typename T> Chunk::Float_Size float_size(const T&)
│ │ │ -
429#else
│ │ │ -
430 template <typename T> Chunk::Float_Size float_size(const T& d)
│ │ │ -
431#endif
│ │ │ -
432 {
│ │ │ -
433#ifndef NDEBUG
│ │ │ -
434 assert( is_float(d) );
│ │ │ -
435#endif
│ │ │ -
436
│ │ │ -
437 switch( sizeof(T) )
│ │ │ -
438 {
│ │ │ -
439 case 4: return OMFormat::Chunk::Float_32;
│ │ │ -
440 case 8: return OMFormat::Chunk::Float_64;
│ │ │ -
441 case 16: return OMFormat::Chunk::Float_128;
│ │ │ -
442 default:
│ │ │ -
443 std::cerr << "Invalid value in float_size\n";
│ │ │ -
444 assert( false );
│ │ │ -
445 break;
│ │ │ -
446 }
│ │ │ -
447 return Chunk::Float_Size(0);
│ │ │ -
448 }
│ │ │ -
449
│ │ │ -
450 // Return the storage type (Chunk::Header::bits_)
│ │ │ -
451 template <typename T>
│ │ │ -
452 inline
│ │ │ -
453 unsigned int bits(const T& val)
│ │ │ -
454 {
│ │ │ -
455 return is_integer(val)
│ │ │ -
456 ? (static_cast<unsigned int>(integer_size(val)))
│ │ │ -
457 : (static_cast<unsigned int>(float_size(val)));
│ │ │ -
458 }
│ │ │ -
459
│ │ │ -
460 // -------------------- create/read version
│ │ │ -
461
│ │ │ -
462 inline uint8 mk_version(const uint16 major, const uint16 minor)
│ │ │ -
463 { return (major & 0x07) << 5 | (minor & 0x1f); }
│ │ │ -
464
│ │ │ -
465
│ │ │ -
466 inline uint16 major_version(const uint8 version)
│ │ │ -
467 { return (version >> 5) & 0x07; }
│ │ │ -
468
│ │ │ -
469
│ │ │ -
470 inline uint16 minor_version(const uint8 version)
│ │ │ -
471 { return (version & 0x001f); }
│ │ │ -
472
│ │ │ -
473
│ │ │ -
474 // ---------------------------------------- convenience functions
│ │ │ -
475
│ │ │ -
476 std::string as_string(uint8 version);
│ │ │ -
477
│ │ │ -
478 const char *as_string(Chunk::Type t);
│ │ │ -
479 const char *as_string(Chunk::Entity e);
│ │ │ -
480 const char *as_string(Chunk::Dim d);
│ │ │ -
481 const char *as_string(Chunk::Integer_Size d);
│ │ │ -
482 const char *as_string(Chunk::Float_Size d);
│ │ │ -
483
│ │ │ -
484 std::ostream& operator << ( std::ostream& _os, const Header& _h );
│ │ │ -
485 std::ostream& operator << ( std::ostream& _os, const Chunk::Header& _c );
│ │ │ -
486
│ │ │ -
488} // namespace OMFormat
│ │ │ -
489
│ │ │ -
490 // -------------------- (re-)store header
│ │ │ -
491
│ │ │ -
492 template <> inline
│ │ │ -
493 size_t store( std::ostream& _os, const OMFormat::Header& _hdr, bool _swap)
│ │ │ -
494 { return _hdr.store( _os, _swap ); }
│ │ │ -
495
│ │ │ -
496 template <> inline
│ │ │ -
497 size_t restore( std::istream& _is, OMFormat::Header& _hdr, bool _swap )
│ │ │ -
498 { return _hdr.restore( _is, _swap ); }
│ │ │ -
499
│ │ │ -
500
│ │ │ -
501 // -------------------- (re-)store chunk header
│ │ │ -
502
│ │ │ -
503 template <> inline
│ │ │ -
504 size_t
│ │ │ -
505 store( std::ostream& _os, const OMFormat::Chunk::Header& _hdr, bool _swap)
│ │ │ -
506 {
│ │ │ -
507 OMFormat::uint16 val;
│ │ │ -
508 val << _hdr;
│ │ │ -
509 return binary<uint16_t>::store( _os, val, _swap );
│ │ │ -
510 }
│ │ │ -
511
│ │ │ -
512 template <> inline
│ │ │ -
513 size_t
│ │ │ -
514 restore( std::istream& _is, OMFormat::Chunk::Header& _hdr, bool _swap )
│ │ │ -
515 {
│ │ │ -
516 OMFormat::uint16 val;
│ │ │ -
517 size_t bytes = binary<uint16_t>::restore( _is, val, _swap );
│ │ │ -
518
│ │ │ -
519 _hdr << val;
│ │ │ -
520
│ │ │ -
521 return bytes;
│ │ │ -
522 }
│ │ │ -
523
│ │ │ -
524 // -------------------- (re-)store integer with wanted number of bits (bytes)
│ │ │ -
525
│ │ │ -
526 typedef GenProg::TrueType t_signed;
│ │ │ -
527 typedef GenProg::FalseType t_unsigned;
│ │ │ -
528
│ │ │ -
529 // helper to store a an integer
│ │ │ -
530 template< typename T >
│ │ │ -
531 size_t
│ │ │ -
532 store( std::ostream& _os,
│ │ │ -
533 const T& _val,
│ │ │ -
534 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
535 bool _swap,
│ │ │ -
536 t_signed);
│ │ │ -
537
│ │ │ -
538 // helper to store a an unsigned integer
│ │ │ -
539 template< typename T >
│ │ │ -
540 size_t
│ │ │ -
541 store( std::ostream& _os,
│ │ │ -
542 const T& _val,
│ │ │ -
543 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
544 bool _swap,
│ │ │ -
545 t_unsigned);
│ │ │ -
546
│ │ │ -
548 template< typename T >
│ │ │ -
549 inline
│ │ │ -
550 size_t
│ │ │ -
551 store( std::ostream& _os,
│ │ │ -
552 const T& _val,
│ │ │ -
553 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
554 bool _swap)
│ │ │ -
555 {
│ │ │ -
556 assert( OMFormat::is_integer( _val ) );
│ │ │ -
557
│ │ │ -
558 if ( OMFormat::is_signed( _val ) )
│ │ │ -
559 return store( _os, _val, _b, _swap, t_signed() );
│ │ │ -
560 return store( _os, _val, _b, _swap, t_unsigned() );
│ │ │ -
561 }
│ │ │ -
562
│ │ │ -
563 // helper to store a an integer
│ │ │ -
564 template< typename T > inline
│ │ │ -
565 size_t restore( std::istream& _is,
│ │ │ -
566 T& _val,
│ │ │ -
567 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
568 bool _swap,
│ │ │ -
569 t_signed);
│ │ │ -
570
│ │ │ -
571 // helper to store a an unsigned integer
│ │ │ -
572 template< typename T > inline
│ │ │ -
573 size_t restore( std::istream& _is,
│ │ │ -
574 T& _val,
│ │ │ -
575 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
576 bool _swap,
│ │ │ -
577 t_unsigned);
│ │ │ -
578
│ │ │ -
580 template< typename T >
│ │ │ -
581 inline
│ │ │ -
582 size_t
│ │ │ -
583 restore( std::istream& _is,
│ │ │ -
584 T& _val,
│ │ │ -
585 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
586 bool _swap)
│ │ │ -
587 {
│ │ │ -
588 assert( OMFormat::is_integer( _val ) );
│ │ │ -
589
│ │ │ -
590 if ( OMFormat::is_signed( _val ) )
│ │ │ -
591 return restore( _is, _val, _b, _swap, t_signed() );
│ │ │ -
592 return restore( _is, _val, _b, _swap, t_unsigned() );
│ │ │ -
593 }
│ │ │ -
594
│ │ │ -
595
│ │ │ -
596 //
│ │ │ -
597 // ---------------------------------------- storing vectors
│ │ │ -
598 template <typename VecT> inline
│ │ │ -
599 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<2>,
│ │ │ -
600 bool _swap )
│ │ │ -
601 {
│ │ │ -
602 size_t bytes = store( _os, _vec[0], _swap );
│ │ │ -
603 bytes += store( _os, _vec[1], _swap );
│ │ │ -
604 return bytes;
│ │ │ -
605 }
│ │ │ -
606
│ │ │ -
607 template <typename VecT> inline
│ │ │ -
608 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<3>,
│ │ │ -
609 bool _swap )
│ │ │ -
610 {
│ │ │ -
611 size_t bytes = store( _os, _vec[0], _swap );
│ │ │ -
612 bytes += store( _os, _vec[1], _swap );
│ │ │ -
613 bytes += store( _os, _vec[2], _swap );
│ │ │ -
614 return bytes;
│ │ │ -
615 }
│ │ │ -
616
│ │ │ -
617 template <typename VecT> inline
│ │ │ -
618 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<4>,
│ │ │ -
619 bool _swap )
│ │ │ -
620 {
│ │ │ -
621 size_t bytes = store( _os, _vec[0], _swap );
│ │ │ -
622 bytes += store( _os, _vec[1], _swap );
│ │ │ -
623 bytes += store( _os, _vec[2], _swap );
│ │ │ -
624 bytes += store( _os, _vec[3], _swap );
│ │ │ -
625 return bytes;
│ │ │ -
626 }
│ │ │ -
627
│ │ │ -
628 template <typename VecT> inline
│ │ │ -
629 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<1>,
│ │ │ -
630 bool _swap )
│ │ │ -
631 {
│ │ │ -
632 return store( _os, _vec[0], _swap );
│ │ │ -
633 }
│ │ │ -
634
│ │ │ -
636 template <typename VecT> inline
│ │ │ -
637 size_t vector_store( std::ostream& _os, const VecT& _vec, bool _swap )
│ │ │ -
638 {
│ │ │ -
639 return store( _os, _vec,
│ │ │ -
640 GenProg::Int2Type< vector_traits<VecT>::size_ >(),
│ │ │ -
641 _swap );
│ │ │ -
642 }
│ │ │ -
643
│ │ │ -
644 // ---------------------------------------- restoring vectors
│ │ │ -
645 template <typename VecT>
│ │ │ -
646 inline
│ │ │ -
647 size_t
│ │ │ -
648 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<2>,
│ │ │ -
649 bool _swap )
│ │ │ -
650 {
│ │ │ -
651 size_t bytes = restore( _is, _vec[0], _swap );
│ │ │ -
652 bytes += restore( _is, _vec[1], _swap );
│ │ │ -
653 return bytes;
│ │ │ -
654 }
│ │ │ -
655
│ │ │ -
656 template <typename VecT>
│ │ │ -
657 inline
│ │ │ -
658 size_t
│ │ │ -
659 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<3>,
│ │ │ -
660 bool _swap )
│ │ │ -
661 {
│ │ │ -
662 typedef typename vector_traits<VecT>::value_type scalar_type;
│ │ │ -
663 size_t bytes;
│ │ │ -
664
│ │ │ -
665 bytes = binary<scalar_type>::restore( _is, _vec[0], _swap );
│ │ │ -
666 bytes += binary<scalar_type>::restore( _is, _vec[1], _swap );
│ │ │ -
667 bytes += binary<scalar_type>::restore( _is, _vec[2], _swap );
│ │ │ -
668 return bytes;
│ │ │ -
669 }
│ │ │ -
670
│ │ │ -
671 template <typename VecT>
│ │ │ -
672 inline
│ │ │ -
673 size_t
│ │ │ -
674 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<4>,
│ │ │ -
675 bool _swap )
│ │ │ -
676 {
│ │ │ -
677 typedef typename vector_traits<VecT>::value_type scalar_type;
│ │ │ -
678 size_t bytes;
│ │ │ -
679
│ │ │ -
680 bytes = binary<scalar_type>::restore( _is, _vec[0], _swap );
│ │ │ -
681 bytes += binary<scalar_type>::restore( _is, _vec[1], _swap );
│ │ │ -
682 bytes += binary<scalar_type>::restore( _is, _vec[2], _swap );
│ │ │ -
683 bytes += binary<scalar_type>::restore( _is, _vec[3], _swap );
│ │ │ -
684 return bytes;
│ │ │ -
685 }
│ │ │ -
686
│ │ │ -
687 template <typename VecT>
│ │ │ -
688 inline
│ │ │ -
689 size_t
│ │ │ -
690 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<1>,
│ │ │ -
691 bool _swap )
│ │ │ -
692 {
│ │ │ -
693 return restore( _is, _vec[0], _swap );
│ │ │ -
694 }
│ │ │ -
695
│ │ │ -
697 template <typename VecT>
│ │ │ -
698 inline
│ │ │ -
699 size_t
│ │ │ -
700 vector_restore( std::istream& _is, VecT& _vec, bool _swap )
│ │ │ -
701 {
│ │ │ -
702 return restore( _is, _vec,
│ │ │ -
703 GenProg::Int2Type< vector_traits<VecT>::size_ >(),
│ │ │ -
704 _swap );
│ │ │ -
705 }
│ │ │ -
706
│ │ │ -
707
│ │ │ -
708 // ---------------------------------------- storing property names
│ │ │ -
709
│ │ │ -
710 template <>
│ │ │ -
711 inline
│ │ │ -
712 size_t store( std::ostream& _os, const OMFormat::Chunk::PropertyName& _pn,
│ │ │ -
713 bool _swap )
│ │ │ -
714 {
│ │ │ -
715 store( _os, _pn.size(), OMFormat::Chunk::Integer_8, _swap ); // 1 byte
│ │ │ -
716 if ( _pn.size() )
│ │ │ -
717 _os.write( _pn.c_str(), _pn.size() ); // size bytes
│ │ │ -
718 return _pn.size() + 1;
│ │ │ -
719 }
│ │ │ -
720
│ │ │ -
721 template <>
│ │ │ -
722 inline
│ │ │ -
723 size_t restore( std::istream& _is, OMFormat::Chunk::PropertyName& _pn,
│ │ │ -
724 bool _swap )
│ │ │ -
725 {
│ │ │ -
726 size_t size;
│ │ │ -
727
│ │ │ -
728 restore( _is, size, OMFormat::Chunk::Integer_8, _swap); // 1 byte
│ │ │ -
729
│ │ │ -
730 assert( OMFormat::Chunk::PropertyName::is_valid( size ) );
│ │ │ -
731
│ │ │ -
732 if ( size > 0 )
│ │ │ -
733 {
│ │ │ -
734 char buf[256];
│ │ │ -
735 _is.read( buf, size ); // size bytes
│ │ │ -
736 buf[size] = '\0';
│ │ │ -
737 _pn.resize(size);
│ │ │ -
738 _pn = buf;
│ │ │ -
739 }
│ │ │ -
740 return size+1;
│ │ │ -
741 }
│ │ │ -
742
│ │ │ -
743//=============================================================================
│ │ │ -
744} // namespace IO
│ │ │ -
745} // namespace OpenMesh
│ │ │ -
746#endif
│ │ │ -
747//=============================================================================
│ │ │ -
748#if defined(OM_MISSING_HEADER_LIMITS)
│ │ │ -
749# undef OM_MISSING_HEADER_LIMITS
│ │ │ -
750#endif
│ │ │ -
751//=============================================================================
│ │ │ -
752#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_IO_OMFORMAT_CC)
│ │ │ -
753# define OPENMESH_IO_OMFORMAT_TEMPLATES
│ │ │ -
754# include "OMFormatT_impl.hh"
│ │ │ -
755#endif
│ │ │ -
756//=============================================================================
│ │ │ -
757#endif
│ │ │ -
758//=============================================================================
│ │ │ -
This file provides the streams omlog, omout, and omerr.
│ │ │ -
Temporary solution until std::numeric_limits is standard.
│ │ │ +
142//=============================================================================
│ │ │ +
143} // END_NS_UNIFORM
│ │ │ +
144} // END_NS_SUBDIVIDER
│ │ │ +
145} // END_NS_OPENMESH
│ │ │ +
146//=============================================================================
│ │ │ +
147#endif // OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITESQRT3T_HH defined
│ │ │ +
148//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
signed char int8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ -
short int16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
double float64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:93
│ │ │ -
unsigned char uchar
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:76
│ │ │ -
unsigned long long uint64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
unsigned int uint32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
long long int64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
unsigned short uint16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
float float32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:92
│ │ │ -
int int32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
unsigned char uint8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ -
static size_t restore(std::istream &, value_type &, bool=false, bool=true)
Restore a value of T and return the number of bytes read.
Definition SR_binary.hh:125
│ │ │ -
static size_t store(std::ostream &, const value_type &, bool=false, bool=true)
Store a value of T and return the number of bytes written.
Definition SR_binary.hh:113
│ │ │ -
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │ -
static const size_t size_
size/dimension of the vector
Definition vector_traits.hh:97
│ │ │ -
static size_t size()
size/dimension of the vector
Definition vector_traits.hh:100
│ │ │ +
This class provides the composite subdivision rules for the uniform case.
Definition CompositeT.hh:90
│ │ │ +
Abstract base class for coefficient functions.
Definition CompositeT.hh:158
│ │ │ +
Uniform composite sqrt(3) subdivision algorithm.
Definition CompositeSqrt3T.hh:77
│ │ │ +
const char * name() const override
Return name of subdivision algorithm.
Definition CompositeSqrt3T.hh:90
│ │ │ +
void apply_rules(void) override
Assemble here the rule sequence, by calling the constructor of the wanted rules.
Definition CompositeSqrt3T.hh:94
│ │ │ +
Helper class.
Definition CompositeSqrt3T.hh:110
│ │ │ + │ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OMFormat.hh │ │ │ │ +CompositeSqrt3T.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,797 +48,139 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45#ifndef OPENMESH_IO_OMFORMAT_HH │ │ │ │ -46#define OPENMESH_IO_OMFORMAT_HH │ │ │ │ -47 │ │ │ │ -48 │ │ │ │ -49//=== INCLUDES │ │ │ │ +48// │ │ │ │ +============================================================================= │ │ │ │ +49// │ │ │ │ +50// CLASS SQRT3T │ │ │ │ +51// │ │ │ │ +52// │ │ │ │ +============================================================================= │ │ │ │ +53 │ │ │ │ +54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITESQRT3T_HH │ │ │ │ +55#define OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITESQRT3T_HH │ │ │ │ +56 │ │ │ │ +57 │ │ │ │ +58//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +59 │ │ │ │ +60#include "Composite/CompositeT.hh" │ │ │ │ +61#include "Composite/CompositeTraits.hh" │ │ │ │ +62 │ │ │ │ +63 │ │ │ │ +64//== NAMESPACE │ │ │ │ ================================================================ │ │ │ │ -50 │ │ │ │ -51#include │ │ │ │ -52#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ -53#include │ │ │ │ -54#include │ │ │ │ -55#include │ │ │ │ -56#include │ │ │ │ -57// -------------------- │ │ │ │ -58#include │ │ │ │ -59#if defined(OM_CC_GCC) && (OM_GCC_VERSION < 30000) │ │ │ │ -60# include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_U_t_i_l_s_/_N_u_m_L_i_m_i_t_s_T_._h_h> │ │ │ │ -61# define OM_MISSING_HEADER_LIMITS 1 │ │ │ │ -62#else │ │ │ │ -63# include │ │ │ │ -64#endif │ │ │ │ 65 │ │ │ │ -66 │ │ │ │ -67//== NAMESPACES │ │ │ │ -============================================================== │ │ │ │ -68 │ │ │ │ -69#ifndef DOXY_IGNORE_THIS │ │ │ │ -70namespace _O_p_e_n_M_e_s_h { │ │ │ │ -71namespace IO { │ │ │ │ -72namespace OMFormat { │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -75//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -76 │ │ │ │ -77 │ │ │ │ +66namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +67namespace Subdivider { // BEGIN_NS_DECIMATER │ │ │ │ +68namespace Uniform { // BEGIN_NS_UNIFORM │ │ │ │ +69 │ │ │ │ +70 │ │ │ │ +71//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +72 │ │ │ │ +75template │ │ │ │ +_7_6class _C_o_m_p_o_s_i_t_e_S_q_r_t_3_T : public _C_o_m_p_o_s_i_t_e_T │ │ │ │ +77{ │ │ │ │ +78public: │ │ │ │ +79 │ │ │ │ +80 typedef _C_o_m_p_o_s_i_t_e_T_<_M_e_s_h_T_y_p_e_,_ _R_e_a_l_T_y_p_e_> _I_n_h_e_r_i_t_e_d; │ │ │ │ 81 │ │ │ │ -82//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ +82public: │ │ │ │ 83 │ │ │ │ -84 // <:Header> │ │ │ │ -85 // <:Comment> │ │ │ │ -86 // Chunk 0 │ │ │ │ -87 // <:ChunkHeader> │ │ │ │ -88 // <:Comment> │ │ │ │ -89 // data │ │ │ │ -90 // Chunk 1 │ │ │ │ -91 // <:ChunkHeader> │ │ │ │ -92 // <:Comment> │ │ │ │ -93 // data │ │ │ │ -94 // . │ │ │ │ -95 // . │ │ │ │ -96 // . │ │ │ │ -97 // Chunk N │ │ │ │ -98 │ │ │ │ -99 // │ │ │ │ -100 // NOTICE! │ │ │ │ -101 // │ │ │ │ -102 // The usage of data types who differ in size │ │ │ │ -103 // on different pc architectures (32/64 bit) and/or │ │ │ │ -104 // operating systems, e.g. (unsigned) long, size_t, │ │ │ │ -105 // is not recommended because of inconsistencies │ │ │ │ -106 // in case of cross writing and reading. │ │ │ │ -107 // │ │ │ │ -108 // Basic types that are supported are: │ │ │ │ -109 │ │ │ │ -110 │ │ │ │ -111 typedef unsigned char _u_c_h_a_r; │ │ │ │ -112 typedef _u_i_n_t_8___t uint8; │ │ │ │ -113 typedef _u_i_n_t_1_6___t uint16; │ │ │ │ -114 typedef _u_i_n_t_3_2___t uint32; │ │ │ │ -115 typedef _u_i_n_t_6_4___t uint64; │ │ │ │ -116 typedef _i_n_t_8___t int8; │ │ │ │ -117 typedef _i_n_t_1_6___t int16; │ │ │ │ -118 typedef _i_n_t_3_2___t int32; │ │ │ │ -119 typedef _i_n_t_6_4___t int64; │ │ │ │ -120 typedef _f_l_o_a_t_3_2___t float32; │ │ │ │ -121 typedef _f_l_o_a_t_6_4___t float64; │ │ │ │ -122 │ │ │ │ -123 struct Header │ │ │ │ -124 { │ │ │ │ -125 _u_c_h_a_r magic_[2]; // OM │ │ │ │ -126 _u_c_h_a_r mesh_; // [T]riangles, [Q]uads, [P]olygonals │ │ │ │ -127 uint8 version_; │ │ │ │ -128 uint32 n_vertices_; │ │ │ │ -129 uint32 n_faces_; │ │ │ │ -130 uint32 n_edges_; │ │ │ │ -131 │ │ │ │ -132 size_t store( std::ostream& _os, bool _swap ) const │ │ │ │ -133 { │ │ │ │ -134 _os.write( (char*)this, 4); // magic_, mesh_, version_ │ │ │ │ -135 size_t bytes = 4; │ │ │ │ -136 bytes += binary::store( _os, n_vertices_, _swap ); │ │ │ │ -137 bytes += binary::store( _os, n_faces_, _swap ); │ │ │ │ -138 bytes += binary::store( _os, n_edges_, _swap ); │ │ │ │ -139 return bytes; │ │ │ │ -140 } │ │ │ │ +84 _C_o_m_p_o_s_i_t_e_S_q_r_t_3_T() : _I_n_h_e_r_i_t_e_d() {}; │ │ │ │ +85 explicit _C_o_m_p_o_s_i_t_e_S_q_r_t_3_T(MeshType& _mesh) : _I_n_h_e_r_i_t_e_d(_mesh) {}; │ │ │ │ +86 _~_C_o_m_p_o_s_i_t_e_S_q_r_t_3_T() {} │ │ │ │ +87 │ │ │ │ +88public: │ │ │ │ +89 │ │ │ │ +_9_0 const char *_n_a_m_e() const override { return "Uniform Composite Sqrt3"; } │ │ │ │ +91 │ │ │ │ +92protected: // inherited interface │ │ │ │ +93 │ │ │ │ +_9_4 void _a_p_p_l_y___r_u_l_e_s(void) override │ │ │ │ +95 { │ │ │ │ +96 Inherited::Tvv3(); │ │ │ │ +97 Inherited::VF(); │ │ │ │ +98 Inherited::FF(); │ │ │ │ +99 Inherited::FVc(coeffs_); │ │ │ │ +100 } │ │ │ │ +101 │ │ │ │ +102protected: │ │ │ │ +103 │ │ │ │ +104 typedef typename Inherited::Coeff Coeff; │ │ │ │ +105 │ │ │ │ +_1_0_9 struct _F_V_C_o_e_f_f : public _C_o_e_f_f │ │ │ │ +110 { │ │ │ │ +111 _F_V_C_o_e_f_f() : _C_o_e_f_f() { init(50); } │ │ │ │ +112 │ │ │ │ +113 void init(size_t _max_valence) │ │ │ │ +114 { │ │ │ │ +115 weights_.resize(_max_valence); │ │ │ │ +116 std::generate(weights_.begin(), │ │ │ │ +117 weights_.end(), _c_o_m_p_u_t_e___w_e_i_g_h_t() ); │ │ │ │ +118 } │ │ │ │ +119 │ │ │ │ +120 double operator()(size_t _valence) override { return weights_[_valence]; } │ │ │ │ +121 │ │ │ │ +_1_2_4 struct _c_o_m_p_u_t_e___w_e_i_g_h_t │ │ │ │ +125 { │ │ │ │ +126 _c_o_m_p_u_t_e___w_e_i_g_h_t() : val_(0) { } │ │ │ │ +127 │ │ │ │ +128 double operator()(void) // sqrt(3) weights for non-boundary vertices │ │ │ │ +129 { │ │ │ │ +130 return 2.0/3.0 * (cos(2.0*M_PI/val_++)+1.0); │ │ │ │ +131 } │ │ │ │ +132 size_t val_; │ │ │ │ +133 }; │ │ │ │ +134 │ │ │ │ +135 std::vector weights_; │ │ │ │ +136 │ │ │ │ +137 } coeffs_; │ │ │ │ +138 │ │ │ │ +139}; │ │ │ │ +140 │ │ │ │ 141 │ │ │ │ -142 size_t restore( std::istream& _is, bool _swap ) │ │ │ │ -143 { │ │ │ │ -144 if (_is.read( reinterpret_cast(this) , 4 ).eof()) │ │ │ │ -145 return 0; │ │ │ │ -146 │ │ │ │ -147 size_t bytes = 4; │ │ │ │ -148 bytes += binary::restore( _is, n_vertices_, _swap ); │ │ │ │ -149 bytes += binary::restore( _is, n_faces_, _swap ); │ │ │ │ -150 bytes += binary::restore( _is, n_edges_, _swap ); │ │ │ │ -151 return bytes; │ │ │ │ -152 } │ │ │ │ -153 │ │ │ │ -154 }; │ │ │ │ -155 │ │ │ │ -156 struct Chunk │ │ │ │ -157 { │ │ │ │ -158 // Hardcoded this size to an uint32 to make the system 32/64 bit │ │ │ │ -compatible. │ │ │ │ -159 // Needs further investigation! │ │ │ │ -160 typedef uint32 esize_t; // element size, used for custom properties │ │ │ │ -161 │ │ │ │ -162 enum Type { │ │ │ │ -163 Type_Pos = 0x00, │ │ │ │ -164 Type_Normal = 0x01, │ │ │ │ -165 Type_Texcoord = 0x02, │ │ │ │ -166 Type_Status = 0x03, │ │ │ │ -167 Type_Color = 0x04, │ │ │ │ -168 Type_Custom = 0x06, │ │ │ │ -169 Type_Topology = 0x07 │ │ │ │ -170 }; │ │ │ │ -171 │ │ │ │ -172 enum Entity { │ │ │ │ -173 Entity_Vertex = 0x00, │ │ │ │ -174 Entity_Mesh = 0x01, │ │ │ │ -175 Entity_Face = 0x02, │ │ │ │ -176 Entity_Edge = 0x04, │ │ │ │ -177 Entity_Halfedge = 0x06, │ │ │ │ -178 Entity_Sentinel = 0x07 │ │ │ │ -179 }; │ │ │ │ -180 │ │ │ │ -181 enum Dim { │ │ │ │ -182 Dim_1D = 0x00, │ │ │ │ -183 Dim_2D = 0x01, │ │ │ │ -184 Dim_3D = 0x02, │ │ │ │ -185 Dim_4D = 0x03, │ │ │ │ -186 Dim_5D = 0x04, │ │ │ │ -187 Dim_6D = 0x05, │ │ │ │ -188 Dim_7D = 0x06, │ │ │ │ -189 Dim_8D = 0x07 │ │ │ │ -190 }; │ │ │ │ -191 │ │ │ │ -192 enum Integer_Size { │ │ │ │ -193 Integer_8 = 0x00, // 1 byte for (unsigned) char │ │ │ │ -194 Integer_16 = 0x01, // 2 bytes for short │ │ │ │ -195 Integer_32 = 0x02, // 4 bytes for long │ │ │ │ -196 Integer_64 = 0x03 // 8 bytes for long long │ │ │ │ -197 }; │ │ │ │ -198 │ │ │ │ -199 enum Float_Size { │ │ │ │ -200 Float_32 = 0x00, // 4 bytes for float │ │ │ │ -201 Float_64 = 0x01, // 8 bytes for double │ │ │ │ -202 Float_128 = 0x02 // 16 bytes for long double (an assumption!) │ │ │ │ -203 }; │ │ │ │ -204 │ │ │ │ -205 static const int SIZE_RESERVED = 1; // 1 │ │ │ │ -206 static const int SIZE_NAME = 1; // 2 │ │ │ │ -207 static const int SIZE_ENTITY = 3; // 5 │ │ │ │ -208 static const int SIZE_TYPE = 4; // 9 │ │ │ │ -209 │ │ │ │ -210 static const int SIZE_SIGNED = 1; // 10 │ │ │ │ -211 static const int SIZE_FLOAT = 1; // 11 │ │ │ │ -212 static const int SIZE_DIM = 3; // 14 │ │ │ │ -213 static const int SIZE_BITS = 2; // 16 │ │ │ │ -214 │ │ │ │ -215 static const int OFF_RESERVED = 0; // 0 │ │ │ │ -216 static const int OFF_NAME = SIZE_RESERVED + OFF_RESERVED; // 2 │ │ │ │ -217 static const int OFF_ENTITY = SIZE_NAME + OFF_NAME; // 3 │ │ │ │ -218 static const int OFF_TYPE = SIZE_ENTITY + OFF_ENTITY; // 5 │ │ │ │ -219 static const int OFF_SIGNED = SIZE_TYPE + OFF_TYPE; // 9 │ │ │ │ -220 static const int OFF_FLOAT = SIZE_SIGNED + OFF_SIGNED; // 10 │ │ │ │ -221 static const int OFF_DIM = SIZE_FLOAT + OFF_FLOAT; // 11 │ │ │ │ -222 static const int OFF_BITS = SIZE_DIM + OFF_DIM; // 14 │ │ │ │ -223 │ │ │ │ -224 // !Attention! When changing the bit size, the operators │ │ │ │ -225 // << (uint16, Header) and << (Header, uint16) must be changed as well │ │ │ │ -226 // │ │ │ │ -227 // Entries signed_, float_, dim_, bits_ are not used when type_ │ │ │ │ -228 // equals Type_Custom │ │ │ │ -229 // │ │ │ │ -230 struct Header // 16 bits long │ │ │ │ -231 { │ │ │ │ -232 unsigned reserved_: SIZE_RESERVED; │ │ │ │ -233 unsigned name_ : SIZE_NAME; // 1 named property, 0 anonymous │ │ │ │ -234 unsigned entity_ : SIZE_ENTITY; // 0 vertex, 1 mesh, 2 edge, │ │ │ │ -235 // 4 halfedge, 6 face │ │ │ │ -236 unsigned type_ : SIZE_TYPE; // 0 pos, 1 normal, 2 texcoord, │ │ │ │ -237 // 3 status, 4 color 6 custom 7 topology │ │ │ │ -238 unsigned signed_ : SIZE_SIGNED; // bool │ │ │ │ -239 unsigned float_ : SIZE_FLOAT; // bool │ │ │ │ -240 unsigned dim_ : SIZE_DIM; // 0 1D, 1 2D, 2 3D, .., 7 8D │ │ │ │ -241 unsigned bits_ : SIZE_BITS; // {8, 16, 32, 64} | {32, 64, 128} │ │ │ │ -242 // (integer) (float) │ │ │ │ -243 unsigned unused_ : 16; // fill up to 32 bits │ │ │ │ -244 }; // struct Header │ │ │ │ -245 │ │ │ │ -246 │ │ │ │ -247 class PropertyName : public std::string │ │ │ │ -248 { │ │ │ │ -249 public: │ │ │ │ -250 │ │ │ │ -251 static const size_t size_max = 256; │ │ │ │ -252 │ │ │ │ -253 PropertyName( ) { } │ │ │ │ -254 │ │ │ │ -255 explicit PropertyName( const std::string& _name ) { *this = _name; } │ │ │ │ -256 │ │ │ │ -257 bool is_valid() const { return is_valid( size() ); } │ │ │ │ -258 │ │ │ │ -259 static bool is_valid( size_t _s ) { return _s <= size_max; } │ │ │ │ -260 │ │ │ │ -261 PropertyName& operator = ( const std::string& _rhs ) │ │ │ │ -262 { │ │ │ │ -263 assert( is_valid( _rhs.size() ) ); │ │ │ │ -264 │ │ │ │ -265 if ( is_valid( _rhs.size() ) ) │ │ │ │ -266 std::string::operator = ( _rhs ); │ │ │ │ -267 else │ │ │ │ -268 { │ │ │ │ -269 omerr() << "Warning! Property name too long. Will be shortened!\n"; │ │ │ │ -270 this->std::string::operator = ( _rhs.substr(0, size_max) ); │ │ │ │ -271 } │ │ │ │ -272 │ │ │ │ -273 return *this; │ │ │ │ -274 } │ │ │ │ -275 │ │ │ │ -276 }; │ │ │ │ -277 │ │ │ │ -278 }; // Chunk │ │ │ │ -279 │ │ │ │ -280 // ------------------------------------------------------------ Helper │ │ │ │ -281 // -------------------- get size information │ │ │ │ -282 │ │ │ │ -284 inline size_t header_size(void) { return sizeof(Header); } │ │ │ │ -285 │ │ │ │ -286 │ │ │ │ -288 inline size_t chunk_header_size( void ) { return sizeof(uint16); } │ │ │ │ -289 │ │ │ │ -290 │ │ │ │ -292 inline size_t scalar_size( const Chunk::Header& _hdr ) │ │ │ │ -293 { │ │ │ │ -294 return _hdr.float_ ? (0x01 << _hdr.bits_) : (0x04 << _hdr.bits_); │ │ │ │ -295 } │ │ │ │ -296 │ │ │ │ -297 │ │ │ │ -299 inline size_t dimensions(const Chunk::Header& _chdr) { return _chdr.dim_+1; │ │ │ │ -} │ │ │ │ -300 │ │ │ │ -301 │ │ │ │ -303 inline size_t vector_size( const Chunk::Header& _chdr ) │ │ │ │ -304 { │ │ │ │ -305 return dimensions(_chdr)*scalar_size(_chdr); │ │ │ │ -306 } │ │ │ │ -307 │ │ │ │ -308 │ │ │ │ -310 inline size_t chunk_data_size( const Header& _hdr, const Chunk::Header& │ │ │ │ -_chunk_hdr ) │ │ │ │ -311 { │ │ │ │ -312 size_t C; │ │ │ │ -313 switch( _chunk_hdr.entity_ ) │ │ │ │ -314 { │ │ │ │ -315 case Chunk::Entity_Vertex: C = _hdr.n_vertices_; break; │ │ │ │ -316 case Chunk::Entity_Face: C = _hdr.n_faces_; break; │ │ │ │ -317 case Chunk::Entity_Halfedge: C = _hdr.n_edges_*2; break; │ │ │ │ -318 case Chunk::Entity_Edge: C = _hdr.n_edges_; break; │ │ │ │ -319 case Chunk::Entity_Mesh: C = 1; break; │ │ │ │ -320 default: │ │ │ │ -321 C = 0; │ │ │ │ -322 std::cerr << "Invalid value in _chunk_hdr.entity_\n"; │ │ │ │ -323 assert( false ); │ │ │ │ -324 break; │ │ │ │ -325 } │ │ │ │ -326 │ │ │ │ -327 return C * vector_size( _chunk_hdr ); │ │ │ │ -328 } │ │ │ │ -329 │ │ │ │ -330 inline size_t chunk_size( const Header& _hdr, const Chunk::Header& │ │ │ │ -_chunk_hdr ) │ │ │ │ -331 { │ │ │ │ -332 return chunk_header_size() + chunk_data_size( _hdr, _chunk_hdr ); │ │ │ │ -333 } │ │ │ │ -334 │ │ │ │ -335 // -------------------- convert from Chunk::Header to storage type │ │ │ │ -336 │ │ │ │ -337 uint16& operator << (uint16& val, const Chunk::Header& hdr); │ │ │ │ -338 Chunk::Header& operator << (Chunk::Header& hdr, const uint16 val); │ │ │ │ -339 │ │ │ │ -340 │ │ │ │ -341 // -------------------- type information │ │ │ │ -342 │ │ │ │ -343 template bool is_float(const T&) │ │ │ │ -344 { │ │ │ │ -345#if defined(OM_MISSING_HEADER_LIMITS) │ │ │ │ -346 return !Utils::NumLimitsT::is_integer(); │ │ │ │ -347#else │ │ │ │ -348 return !std::numeric_limits::is_integer; │ │ │ │ -349#endif │ │ │ │ -350 } │ │ │ │ -351 │ │ │ │ -352 template bool is_double(const T&) │ │ │ │ -353 { │ │ │ │ -354 return false; │ │ │ │ -355 } │ │ │ │ -356 │ │ │ │ -357 template <> inline bool is_double(const double&) │ │ │ │ -358 { │ │ │ │ -359 return true; │ │ │ │ -360 } │ │ │ │ -361 │ │ │ │ -362 template bool is_integer(const T) │ │ │ │ -363 { │ │ │ │ -364#if defined(OM_MISSING_HEADER_LIMITS) │ │ │ │ -365 return Utils::NumLimitsT::is_integer(); │ │ │ │ -366#else │ │ │ │ -367 return std::numeric_limits::is_integer; │ │ │ │ -368#endif │ │ │ │ -369 } │ │ │ │ -370 │ │ │ │ -371 template bool is_signed(const T&) │ │ │ │ -372 { │ │ │ │ -373#if defined(OM_MISSING_HEADER_LIMITS) │ │ │ │ -374 return Utils::NumLimitsT::is_signed(); │ │ │ │ -375#else │ │ │ │ -376 return std::numeric_limits::is_signed; │ │ │ │ -377#endif │ │ │ │ -378 } │ │ │ │ -379 │ │ │ │ -380 // -------------------- conversions (format type <- type/value) │ │ │ │ -381 │ │ │ │ -382 template │ │ │ │ -383 inline │ │ │ │ -384 Chunk::Dim dim( VecType ) │ │ │ │ -385 { │ │ │ │ -386 assert( _v_e_c_t_o_r___t_r_a_i_t_s_<_ _V_e_c_T_y_p_e_ _>_:_:_s_i_z_e() < 9 ); │ │ │ │ -387 return static_cast(_v_e_c_t_o_r___t_r_a_i_t_s_<_ _V_e_c_T_y_p_e_ _>_:_:_s_i_z_e() - 1); │ │ │ │ -388 } │ │ │ │ -389 │ │ │ │ -390 template │ │ │ │ -391 inline │ │ │ │ -392 Chunk::Dim dim( const Chunk::Header& _hdr ) │ │ │ │ -393 { │ │ │ │ -394 return static_cast( _hdr.dim_ ); │ │ │ │ -395 } │ │ │ │ -396 │ │ │ │ -397 // calc minimum (power-of-2) number of bits needed │ │ │ │ -398 Chunk::Integer_Size needed_bits( size_t s ); │ │ │ │ -399 │ │ │ │ -400 // Convert size of type to Integer_Size │ │ │ │ -401#ifdef NDEBUG │ │ │ │ -402 template Chunk::Integer_Size integer_size(const T&) │ │ │ │ -403#else │ │ │ │ -404 template Chunk::Integer_Size integer_size(const T& d) │ │ │ │ -405#endif │ │ │ │ -406 { │ │ │ │ -407#ifndef NDEBUG │ │ │ │ -408 assert( is_integer(d) ); │ │ │ │ -409#endif │ │ │ │ -410 │ │ │ │ -411 switch( sizeof(T) ) │ │ │ │ -412 { │ │ │ │ -413 case 1: return OMFormat::Chunk::Integer_8; │ │ │ │ -414 case 2: return OMFormat::Chunk::Integer_16; │ │ │ │ -415 case 4: return OMFormat::Chunk::Integer_32; │ │ │ │ -416 case 8: return OMFormat::Chunk::Integer_64; │ │ │ │ -417 default: │ │ │ │ -418 std::cerr << "Invalid value in integer_size\n"; │ │ │ │ -419 assert( false ); │ │ │ │ -420 break; │ │ │ │ -421 } │ │ │ │ -422 return Chunk::Integer_Size(0); │ │ │ │ -423 } │ │ │ │ -424 │ │ │ │ -425 │ │ │ │ -426 // Convert size of type to FLoat_Size │ │ │ │ -427#ifdef NDEBUG │ │ │ │ -428 template Chunk::Float_Size float_size(const T&) │ │ │ │ -429#else │ │ │ │ -430 template Chunk::Float_Size float_size(const T& d) │ │ │ │ -431#endif │ │ │ │ -432 { │ │ │ │ -433#ifndef NDEBUG │ │ │ │ -434 assert( is_float(d) ); │ │ │ │ -435#endif │ │ │ │ -436 │ │ │ │ -437 switch( sizeof(T) ) │ │ │ │ -438 { │ │ │ │ -439 case 4: return OMFormat::Chunk::Float_32; │ │ │ │ -440 case 8: return OMFormat::Chunk::Float_64; │ │ │ │ -441 case 16: return OMFormat::Chunk::Float_128; │ │ │ │ -442 default: │ │ │ │ -443 std::cerr << "Invalid value in float_size\n"; │ │ │ │ -444 assert( false ); │ │ │ │ -445 break; │ │ │ │ -446 } │ │ │ │ -447 return Chunk::Float_Size(0); │ │ │ │ -448 } │ │ │ │ -449 │ │ │ │ -450 // Return the storage type (Chunk::Header::bits_) │ │ │ │ -451 template │ │ │ │ -452 inline │ │ │ │ -453 unsigned int bits(const T& val) │ │ │ │ -454 { │ │ │ │ -455 return is_integer(val) │ │ │ │ -456 ? (static_cast(integer_size(val))) │ │ │ │ -457 : (static_cast(float_size(val))); │ │ │ │ -458 } │ │ │ │ -459 │ │ │ │ -460 // -------------------- create/read version │ │ │ │ -461 │ │ │ │ -462 inline uint8 mk_version(const uint16 major, const uint16 minor) │ │ │ │ -463 { return (major & 0x07) << 5 | (minor & 0x1f); } │ │ │ │ -464 │ │ │ │ -465 │ │ │ │ -466 inline uint16 major_version(const uint8 version) │ │ │ │ -467 { return (version >> 5) & 0x07; } │ │ │ │ -468 │ │ │ │ -469 │ │ │ │ -470 inline uint16 minor_version(const uint8 version) │ │ │ │ -471 { return (version & 0x001f); } │ │ │ │ -472 │ │ │ │ -473 │ │ │ │ -474 // ---------------------------------------- convenience functions │ │ │ │ -475 │ │ │ │ -476 std::string as_string(uint8 version); │ │ │ │ -477 │ │ │ │ -478 const char *as_string(Chunk::Type t); │ │ │ │ -479 const char *as_string(Chunk::Entity e); │ │ │ │ -480 const char *as_string(Chunk::Dim d); │ │ │ │ -481 const char *as_string(Chunk::Integer_Size d); │ │ │ │ -482 const char *as_string(Chunk::Float_Size d); │ │ │ │ -483 │ │ │ │ -484 std::ostream& operator << ( std::ostream& _os, const Header& _h ); │ │ │ │ -485 std::ostream& operator << ( std::ostream& _os, const Chunk::Header& _c ); │ │ │ │ -486 │ │ │ │ -488} // namespace OMFormat │ │ │ │ -489 │ │ │ │ -490 // -------------------- (re-)store header │ │ │ │ -491 │ │ │ │ -492 template <> inline │ │ │ │ -493 size_t store( std::ostream& _os, const OMFormat::Header& _hdr, bool _swap) │ │ │ │ -494 { return _hdr.store( _os, _swap ); } │ │ │ │ -495 │ │ │ │ -496 template <> inline │ │ │ │ -497 size_t restore( std::istream& _is, OMFormat::Header& _hdr, bool _swap ) │ │ │ │ -498 { return _hdr.restore( _is, _swap ); } │ │ │ │ -499 │ │ │ │ -500 │ │ │ │ -501 // -------------------- (re-)store chunk header │ │ │ │ -502 │ │ │ │ -503 template <> inline │ │ │ │ -504 size_t │ │ │ │ -505 store( std::ostream& _os, const OMFormat::Chunk::Header& _hdr, bool _swap) │ │ │ │ -506 { │ │ │ │ -507 OMFormat::uint16 val; │ │ │ │ -508 val << _hdr; │ │ │ │ -509 return _b_i_n_a_r_y_<_u_i_n_t_1_6___t_>_:_:_s_t_o_r_e( _os, val, _swap ); │ │ │ │ -510 } │ │ │ │ -511 │ │ │ │ -512 template <> inline │ │ │ │ -513 size_t │ │ │ │ -514 restore( std::istream& _is, OMFormat::Chunk::Header& _hdr, bool _swap ) │ │ │ │ -515 { │ │ │ │ -516 OMFormat::uint16 val; │ │ │ │ -517 size_t bytes = _b_i_n_a_r_y_<_u_i_n_t_1_6___t_>_:_:_r_e_s_t_o_r_e( _is, val, _swap ); │ │ │ │ -518 │ │ │ │ -519 _hdr << val; │ │ │ │ -520 │ │ │ │ -521 return bytes; │ │ │ │ -522 } │ │ │ │ -523 │ │ │ │ -524 // -------------------- (re-)store integer with wanted number of bits │ │ │ │ -(bytes) │ │ │ │ -525 │ │ │ │ -526 typedef GenProg::TrueType t_signed; │ │ │ │ -527 typedef GenProg::FalseType t_unsigned; │ │ │ │ -528 │ │ │ │ -529 // helper to store a an integer │ │ │ │ -530 template< typename T > │ │ │ │ -531 size_t │ │ │ │ -532 store( std::ostream& _os, │ │ │ │ -533 const T& _val, │ │ │ │ -534 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -535 bool _swap, │ │ │ │ -536 t_signed); │ │ │ │ -537 │ │ │ │ -538 // helper to store a an unsigned integer │ │ │ │ -539 template< typename T > │ │ │ │ -540 size_t │ │ │ │ -541 store( std::ostream& _os, │ │ │ │ -542 const T& _val, │ │ │ │ -543 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -544 bool _swap, │ │ │ │ -545 t_unsigned); │ │ │ │ -546 │ │ │ │ -548 template< typename T > │ │ │ │ -549 inline │ │ │ │ -550 size_t │ │ │ │ -551 store( std::ostream& _os, │ │ │ │ -552 const T& _val, │ │ │ │ -553 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -554 bool _swap) │ │ │ │ -555 { │ │ │ │ -556 assert( OMFormat::is_integer( _val ) ); │ │ │ │ -557 │ │ │ │ -558 if ( OMFormat::is_signed( _val ) ) │ │ │ │ -559 return store( _os, _val, _b, _swap, t_signed() ); │ │ │ │ -560 return store( _os, _val, _b, _swap, t_unsigned() ); │ │ │ │ -561 } │ │ │ │ -562 │ │ │ │ -563 // helper to store a an integer │ │ │ │ -564 template< typename T > inline │ │ │ │ -565 size_t restore( std::istream& _is, │ │ │ │ -566 T& _val, │ │ │ │ -567 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -568 bool _swap, │ │ │ │ -569 t_signed); │ │ │ │ -570 │ │ │ │ -571 // helper to store a an unsigned integer │ │ │ │ -572 template< typename T > inline │ │ │ │ -573 size_t restore( std::istream& _is, │ │ │ │ -574 T& _val, │ │ │ │ -575 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -576 bool _swap, │ │ │ │ -577 t_unsigned); │ │ │ │ -578 │ │ │ │ -580 template< typename T > │ │ │ │ -581 inline │ │ │ │ -582 size_t │ │ │ │ -583 restore( std::istream& _is, │ │ │ │ -584 T& _val, │ │ │ │ -585 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -586 bool _swap) │ │ │ │ -587 { │ │ │ │ -588 assert( OMFormat::is_integer( _val ) ); │ │ │ │ -589 │ │ │ │ -590 if ( OMFormat::is_signed( _val ) ) │ │ │ │ -591 return restore( _is, _val, _b, _swap, t_signed() ); │ │ │ │ -592 return restore( _is, _val, _b, _swap, t_unsigned() ); │ │ │ │ -593 } │ │ │ │ -594 │ │ │ │ -595 │ │ │ │ -596 // │ │ │ │ -597 // ---------------------------------------- storing vectors │ │ │ │ -598 template inline │ │ │ │ -599 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<2>, │ │ │ │ -600 bool _swap ) │ │ │ │ -601 { │ │ │ │ -602 size_t bytes = store( _os, _vec[0], _swap ); │ │ │ │ -603 bytes += store( _os, _vec[1], _swap ); │ │ │ │ -604 return bytes; │ │ │ │ -605 } │ │ │ │ -606 │ │ │ │ -607 template inline │ │ │ │ -608 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<3>, │ │ │ │ -609 bool _swap ) │ │ │ │ -610 { │ │ │ │ -611 size_t bytes = store( _os, _vec[0], _swap ); │ │ │ │ -612 bytes += store( _os, _vec[1], _swap ); │ │ │ │ -613 bytes += store( _os, _vec[2], _swap ); │ │ │ │ -614 return bytes; │ │ │ │ -615 } │ │ │ │ -616 │ │ │ │ -617 template inline │ │ │ │ -618 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<4>, │ │ │ │ -619 bool _swap ) │ │ │ │ -620 { │ │ │ │ -621 size_t bytes = store( _os, _vec[0], _swap ); │ │ │ │ -622 bytes += store( _os, _vec[1], _swap ); │ │ │ │ -623 bytes += store( _os, _vec[2], _swap ); │ │ │ │ -624 bytes += store( _os, _vec[3], _swap ); │ │ │ │ -625 return bytes; │ │ │ │ -626 } │ │ │ │ -627 │ │ │ │ -628 template inline │ │ │ │ -629 size_t store( std::ostream& _os, const VecT& _vec, GenProg::Int2Type<1>, │ │ │ │ -630 bool _swap ) │ │ │ │ -631 { │ │ │ │ -632 return store( _os, _vec[0], _swap ); │ │ │ │ -633 } │ │ │ │ -634 │ │ │ │ -636 template inline │ │ │ │ -637 size_t vector_store( std::ostream& _os, const VecT& _vec, bool _swap ) │ │ │ │ -638 { │ │ │ │ -639 return store( _os, _vec, │ │ │ │ -640 GenProg::Int2Type< _v_e_c_t_o_r___t_r_a_i_t_s_<_V_e_c_T_>_:_:_s_i_z_e__ >(), │ │ │ │ -641 _swap ); │ │ │ │ -642 } │ │ │ │ -643 │ │ │ │ -644 // ---------------------------------------- restoring vectors │ │ │ │ -645 template │ │ │ │ -646 inline │ │ │ │ -647 size_t │ │ │ │ -648 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<2>, │ │ │ │ -649 bool _swap ) │ │ │ │ -650 { │ │ │ │ -651 size_t bytes = restore( _is, _vec[0], _swap ); │ │ │ │ -652 bytes += restore( _is, _vec[1], _swap ); │ │ │ │ -653 return bytes; │ │ │ │ -654 } │ │ │ │ -655 │ │ │ │ -656 template │ │ │ │ -657 inline │ │ │ │ -658 size_t │ │ │ │ -659 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<3>, │ │ │ │ -660 bool _swap ) │ │ │ │ -661 { │ │ │ │ -662 typedef typename _v_e_c_t_o_r___t_r_a_i_t_s_<_V_e_c_T_>_:_:_v_a_l_u_e___t_y_p_e scalar_type; │ │ │ │ -663 size_t bytes; │ │ │ │ -664 │ │ │ │ -665 bytes = _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[0], _swap ); │ │ │ │ -666 bytes += _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[1], _swap ); │ │ │ │ -667 bytes += _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[2], _swap ); │ │ │ │ -668 return bytes; │ │ │ │ -669 } │ │ │ │ -670 │ │ │ │ -671 template │ │ │ │ -672 inline │ │ │ │ -673 size_t │ │ │ │ -674 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<4>, │ │ │ │ -675 bool _swap ) │ │ │ │ -676 { │ │ │ │ -677 typedef typename _v_e_c_t_o_r___t_r_a_i_t_s_<_V_e_c_T_>_:_:_v_a_l_u_e___t_y_p_e scalar_type; │ │ │ │ -678 size_t bytes; │ │ │ │ -679 │ │ │ │ -680 bytes = _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[0], _swap ); │ │ │ │ -681 bytes += _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[1], _swap ); │ │ │ │ -682 bytes += _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[2], _swap ); │ │ │ │ -683 bytes += _b_i_n_a_r_y_<_s_c_a_l_a_r___t_y_p_e_>_:_:_r_e_s_t_o_r_e( _is, _vec[3], _swap ); │ │ │ │ -684 return bytes; │ │ │ │ -685 } │ │ │ │ -686 │ │ │ │ -687 template │ │ │ │ -688 inline │ │ │ │ -689 size_t │ │ │ │ -690 restore( std::istream& _is, VecT& _vec, GenProg::Int2Type<1>, │ │ │ │ -691 bool _swap ) │ │ │ │ -692 { │ │ │ │ -693 return restore( _is, _vec[0], _swap ); │ │ │ │ -694 } │ │ │ │ -695 │ │ │ │ -697 template │ │ │ │ -698 inline │ │ │ │ -699 size_t │ │ │ │ -700 vector_restore( std::istream& _is, VecT& _vec, bool _swap ) │ │ │ │ -701 { │ │ │ │ -702 return restore( _is, _vec, │ │ │ │ -703 GenProg::Int2Type< _v_e_c_t_o_r___t_r_a_i_t_s_<_V_e_c_T_>_:_:_s_i_z_e__ >(), │ │ │ │ -704 _swap ); │ │ │ │ -705 } │ │ │ │ -706 │ │ │ │ -707 │ │ │ │ -708 // ---------------------------------------- storing property names │ │ │ │ -709 │ │ │ │ -710 template <> │ │ │ │ -711 inline │ │ │ │ -712 size_t store( std::ostream& _os, const OMFormat::Chunk::PropertyName& _pn, │ │ │ │ -713 bool _swap ) │ │ │ │ -714 { │ │ │ │ -715 store( _os, _pn.size(), OMFormat::Chunk::Integer_8, _swap ); // 1 byte │ │ │ │ -716 if ( _pn.size() ) │ │ │ │ -717 _os.write( _pn.c_str(), _pn.size() ); // size bytes │ │ │ │ -718 return _pn.size() + 1; │ │ │ │ -719 } │ │ │ │ -720 │ │ │ │ -721 template <> │ │ │ │ -722 inline │ │ │ │ -723 size_t restore( std::istream& _is, OMFormat::Chunk::PropertyName& _pn, │ │ │ │ -724 bool _swap ) │ │ │ │ -725 { │ │ │ │ -726 size_t size; │ │ │ │ -727 │ │ │ │ -728 restore( _is, size, OMFormat::Chunk::Integer_8, _swap); // 1 byte │ │ │ │ -729 │ │ │ │ -730 assert( OMFormat::Chunk::PropertyName::is_valid( size ) ); │ │ │ │ -731 │ │ │ │ -732 if ( size > 0 ) │ │ │ │ -733 { │ │ │ │ -734 char buf[256]; │ │ │ │ -735 _is.read( buf, size ); // size bytes │ │ │ │ -736 buf[size] = '\0'; │ │ │ │ -737 _pn.resize(size); │ │ │ │ -738 _pn = buf; │ │ │ │ -739 } │ │ │ │ -740 return size+1; │ │ │ │ -741 } │ │ │ │ -742 │ │ │ │ -743// │ │ │ │ -============================================================================= │ │ │ │ -744} // namespace IO │ │ │ │ -745} // namespace OpenMesh │ │ │ │ -746#endif │ │ │ │ -747// │ │ │ │ -============================================================================= │ │ │ │ -748#if defined(OM_MISSING_HEADER_LIMITS) │ │ │ │ -749# undef OM_MISSING_HEADER_LIMITS │ │ │ │ -750#endif │ │ │ │ -751// │ │ │ │ +142// │ │ │ │ ============================================================================= │ │ │ │ -752#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_IO_OMFORMAT_CC) │ │ │ │ -753# define OPENMESH_IO_OMFORMAT_TEMPLATES │ │ │ │ -754# include "OMFormatT_impl.hh" │ │ │ │ -755#endif │ │ │ │ -756// │ │ │ │ +143} // END_NS_UNIFORM │ │ │ │ +144} // END_NS_SUBDIVIDER │ │ │ │ +145} // END_NS_OPENMESH │ │ │ │ +146// │ │ │ │ ============================================================================= │ │ │ │ -757#endif │ │ │ │ -758// │ │ │ │ +147#endif // OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITESQRT3T_HH defined │ │ │ │ +148// │ │ │ │ ============================================================================= │ │ │ │ -_o_m_s_t_r_e_a_m_._h_h │ │ │ │ -This file provides the streams omlog, omout, and omerr. │ │ │ │ -_N_u_m_L_i_m_i_t_s_T_._h_h │ │ │ │ -Temporary solution until std::numeric_limits is standard. │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_8___t │ │ │ │ -signed char int8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_1_6___t │ │ │ │ -short int16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_f_l_o_a_t_6_4___t │ │ │ │ -double float64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:93 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_c_h_a_r │ │ │ │ -unsigned char uchar │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:76 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_6_4___t │ │ │ │ -unsigned long long uint64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_3_2___t │ │ │ │ -unsigned int uint32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_6_4___t │ │ │ │ -long long int64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_1_6___t │ │ │ │ -unsigned short uint16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_f_l_o_a_t_3_2___t │ │ │ │ -float float32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_3_2___t │ │ │ │ -int int32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_8___t │ │ │ │ -unsigned char uint8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_r_e_s_t_o_r_e │ │ │ │ -static size_t restore(std::istream &, value_type &, bool=false, bool=true) │ │ │ │ -Restore a value of T and return the number of bytes read. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:125 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_t_o_r_e │ │ │ │ -static size_t store(std::ostream &, const value_type &, bool=false, bool=true) │ │ │ │ -Store a value of T and return the number of bytes written. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:113 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -T::value_type value_type │ │ │ │ -Type of the scalar value. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e__ │ │ │ │ -static const size_t size_ │ │ │ │ -size/dimension of the vector │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e │ │ │ │ -static size_t size() │ │ │ │ -size/dimension of the vector │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:100 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_T │ │ │ │ +This class provides the composite subdivision rules for the uniform case. │ │ │ │ +DDeeffiinniittiioonn CompositeT.hh:90 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_T_:_:_C_o_e_f_f │ │ │ │ +Abstract base class for coefficient functions. │ │ │ │ +DDeeffiinniittiioonn CompositeT.hh:158 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_S_q_r_t_3_T │ │ │ │ +Uniform composite sqrt(3) subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn CompositeSqrt3T.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_S_q_r_t_3_T_:_:_n_a_m_e │ │ │ │ +const char * name() const override │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn CompositeSqrt3T.hh:90 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_S_q_r_t_3_T_:_:_a_p_p_l_y___r_u_l_e_s │ │ │ │ +void apply_rules(void) override │ │ │ │ +Assemble here the rule sequence, by calling the constructor of the wanted │ │ │ │ +rules. │ │ │ │ +DDeeffiinniittiioonn CompositeSqrt3T.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_S_q_r_t_3_T_:_:_F_V_C_o_e_f_f │ │ │ │ +Helper class. │ │ │ │ +DDeeffiinniittiioonn CompositeSqrt3T.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_o_m_p_o_s_i_t_e_S_q_r_t_3_T_:_:_F_V_C_o_e_f_f_:_:_c_o_m_p_u_t_e___w_e_i_g_h_t │ │ │ │ +DDeeffiinniittiioonn CompositeSqrt3T.hh:125 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00518_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/SR_types.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/SubdividerT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SR_types.hh
│ │ │ +
SubdividerT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -138,89 +138,154 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51#ifndef OPENMESH_SR_TYPES_HH
│ │ │ -
52#define OPENMESH_SR_TYPES_HH
│ │ │ +
48//=============================================================================
│ │ │ +
49//
│ │ │ +
50// CLASS SubdividerT
│ │ │ +
51//
│ │ │ +
52//=============================================================================
│ │ │
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_SUDIVIDERT_HH
│ │ │ +
55#define OPENMESH_SUBDIVIDER_UNIFORM_SUDIVIDERT_HH
│ │ │
56
│ │ │ -
57#include <OpenMesh/Core/System/config.h>
│ │ │ +
57//== INCLUDE ==================================================================
│ │ │
58
│ │ │ -
59
│ │ │ -
60//== NAMESPACES ===============================================================
│ │ │ -
61
│ │ │ -
62namespace OpenMesh {
│ │ │ -
63namespace IO {
│ │ │ -
64
│ │ │ -
65
│ │ │ -
66//=============================================================================
│ │ │ -
67
│ │ │ -
68
│ │ │ -
73
│ │ │ -
74//-----------------------------------------------------------------------------
│ │ │ -
75
│ │ │ -
76typedef unsigned char uchar;
│ │ │ -
77typedef unsigned short ushort;
│ │ │ -
78typedef unsigned long ulong;
│ │ │ -
79
│ │ │ -
80typedef signed char int8_t; typedef unsigned char uint8_t;
│ │ │ -
81typedef short int16_t; typedef unsigned short uint16_t;
│ │ │ -
82
│ │ │ -
83// Int should be 32 bit on all archs.
│ │ │ -
84// long is 32 under windows but 64 under unix 64 bit
│ │ │ -
85typedef int int32_t; typedef unsigned int uint32_t;
│ │ │ -
86#if defined(OM_CC_MSVC)
│ │ │ -
87typedef __int64 int64_t; typedef unsigned __int64 uint64_t;
│ │ │ -
88#else
│ │ │ -
89typedef long long int64_t; typedef unsigned long long uint64_t;
│ │ │ -
90#endif
│ │ │ +
59#include <OpenMesh/Core/System/config.hh>
│ │ │ +
60#include <OpenMesh/Core/Utils/Noncopyable.hh>
│ │ │ +
61#if defined(_DEBUG) || defined(DEBUG)
│ │ │ +
62// Makes life lot easier, when playing/messing around with low-level topology
│ │ │ +
63// changing methods of OpenMesh
│ │ │ +
64# include <OpenMesh/Tools/Utils/MeshCheckerT.hh>
│ │ │ +
65# define ASSERT_CONSISTENCY( T, m ) \
│ │ │ +
66 assert(OpenMesh::Utils::MeshCheckerT<T>(m).check())
│ │ │ +
67#else
│ │ │ +
68# define ASSERT_CONSISTENCY( T, m )
│ │ │ +
69#endif
│ │ │ +
70
│ │ │ +
71//== NAMESPACE ================================================================
│ │ │ +
72
│ │ │ +
73namespace OpenMesh {
│ │ │ +
74namespace Subdivider {
│ │ │ +
75namespace Uniform {
│ │ │ +
76
│ │ │ +
77//== CLASS DEFINITION =========================================================
│ │ │ +
78
│ │ │ +
87template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ + │ │ │ +
89{
│ │ │ +
90public:
│ │ │
91
│ │ │ -
92typedef float float32_t;
│ │ │ -
93typedef double float64_t;
│ │ │ +
92 typedef MeshType mesh_t;
│ │ │ +
93 typedef RealType real_t;
│ │ │
94
│ │ │ -
95typedef uint8_t rgb_t[3];
│ │ │ -
96typedef uint8_t rgba_t[4];
│ │ │ -
97
│ │ │ +
95public:
│ │ │ +
96
│ │ │ +
98
│ │ │
99
│ │ │ -
100
│ │ │ -
101//=============================================================================
│ │ │ -
102} // namespace IO
│ │ │ -
103} // namespace OpenMesh
│ │ │ -
104//=============================================================================
│ │ │ -
105#endif // OPENMESH_MESHREADER_HH defined
│ │ │ -
106//=============================================================================
│ │ │ -
107
│ │ │ +
101 SubdividerT(void) : attached_() { }
│ │ │ +
102
│ │ │ +
105 explicit SubdividerT( MeshType &_m ) : attached_(nullptr) { attach(_m); }
│ │ │ +
106
│ │ │ +
108
│ │ │ +
│ │ │ +
110 virtual ~SubdividerT()
│ │ │ +
111 { detach(); }
│ │ │ +
│ │ │ +
112
│ │ │ +
114 virtual const char *name( void ) const = 0;
│ │ │ +
115
│ │ │ +
116
│ │ │ +
117public:
│ │ │ +
118
│ │ │ +
120
│ │ │ +
│ │ │ +
122 bool operator () ( MeshType& _m, size_t _n , const bool _update_points = true)
│ │ │ +
123 {
│ │ │ +
124 return prepare(_m) && subdivide( _m, _n , _update_points ) && cleanup( _m );
│ │ │ +
125 }
│ │ │ +
│ │ │ +
127
│ │ │ +
128public:
│ │ │ +
130
│ │ │ +
│ │ │ +
132 bool attach( MeshType& _m )
│ │ │ +
133 {
│ │ │ +
134 if ( attached_ == &_m )
│ │ │ +
135 return true;
│ │ │ +
136
│ │ │ +
137 detach();
│ │ │ +
138 if (prepare( _m ))
│ │ │ +
139 {
│ │ │ +
140 attached_ = &_m;
│ │ │ +
141 return true;
│ │ │ +
142 }
│ │ │ +
143 return false;
│ │ │ +
144 }
│ │ │ +
│ │ │ +
145
│ │ │ +
│ │ │ +
148 bool operator()( size_t _n , const bool _update_points = true)
│ │ │ +
149 {
│ │ │ +
150 return attached_ ? subdivide( *attached_, _n , _update_points) : false;
│ │ │ +
151 }
│ │ │ +
│ │ │ +
152
│ │ │ +
│ │ │ +
155 void detach(void)
│ │ │ +
156 {
│ │ │ +
157 if ( attached_ )
│ │ │ +
158 {
│ │ │ +
159 cleanup( *attached_ );
│ │ │ +
160 attached_ = nullptr;
│ │ │ +
161 }
│ │ │ +
162 }
│ │ │ +
│ │ │ +
164
│ │ │ +
165protected:
│ │ │ +
166
│ │ │ +
168
│ │ │ +
169
│ │ │ +
174 virtual bool prepare( MeshType& /*_m*/ ) { return false; };
│ │ │ +
175
│ │ │ +
177 virtual bool subdivide( MeshType& _m, size_t _n, const bool _update_points = true) = 0;
│ │ │ +
178
│ │ │ +
180 virtual bool cleanup( MeshType& _m ) = 0;
│ │ │ +
182
│ │ │ +
183private:
│ │ │ +
184
│ │ │ +
185 MeshType *attached_;
│ │ │ +
186
│ │ │ +
187};
│ │ │ +
│ │ │ +
188
│ │ │ +
189//=============================================================================
│ │ │ +
190} // namespace Uniform
│ │ │ +
191} // namespace Subdivider
│ │ │ +
192} // namespace OpenMesh
│ │ │ +
193//=============================================================================
│ │ │ +
194#endif // OPENMESH_SUBDIVIDER_UNIFORM_SUBDIVIDERT_HH
│ │ │ +
195//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
signed char int8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ -
short int16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
uint8_t rgb_t[3]
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:95
│ │ │ -
uint8_t rgba_t[4]
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:96
│ │ │ -
double float64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:93
│ │ │ -
unsigned char uchar
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:76
│ │ │ -
unsigned long long uint64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
unsigned int uint32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
unsigned long ulong
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:78
│ │ │ -
long long int64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
unsigned short uint16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
float float32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:92
│ │ │ -
unsigned short ushort
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:77
│ │ │ -
int int32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
unsigned char uint8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ +
This class demonstrates the non copyable idiom.
Definition Noncopyable.hh:72
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │ +
virtual bool cleanup(MeshType &_m)=0
Cleanup mesh after usage, e.g. remove added properties.
│ │ │ +
bool operator()(size_t _n, const bool _update_points=true)
Subdivide the attached _n times.
Definition SubdividerT.hh:148
│ │ │ +
bool attach(MeshType &_m)
Attach mesh _m to self.
Definition SubdividerT.hh:132
│ │ │ +
void detach(void)
Detach an eventually attached mesh.
Definition SubdividerT.hh:155
│ │ │ +
SubdividerT(MeshType &_m)
Constructor to be used with interface 1 (calls attach())
Definition SubdividerT.hh:105
│ │ │ +
SubdividerT(void)
Constructor to be used with interface 2.
Definition SubdividerT.hh:101
│ │ │ +
virtual ~SubdividerT()
Destructor (calls detach())
Definition SubdividerT.hh:110
│ │ │ +
virtual bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true)=0
Subdivide mesh _m _n times.
│ │ │ +
virtual bool prepare(MeshType &)
Prepare mesh, e.g.
Definition SubdividerT.hh:174
│ │ │ +
virtual const char * name(void) const =0
Return name of subdivision algorithm.
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SR_types.hh │ │ │ │ +SubdividerT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,142 +48,184 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ 48// │ │ │ │ +============================================================================= │ │ │ │ 49// │ │ │ │ +50// CLASS SubdividerT │ │ │ │ +51// │ │ │ │ +52// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_SR_TYPES_HH │ │ │ │ -52#define OPENMESH_SR_TYPES_HH │ │ │ │ 53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_SUDIVIDERT_HH │ │ │ │ +55#define OPENMESH_SUBDIVIDER_UNIFORM_SUDIVIDERT_HH │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ +57//== INCLUDE │ │ │ │ +================================================================== │ │ │ │ 58 │ │ │ │ -59 │ │ │ │ -60//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -61 │ │ │ │ -62namespace _O_p_e_n_M_e_s_h { │ │ │ │ -63namespace IO { │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66// │ │ │ │ -============================================================================= │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -73 │ │ │ │ -74//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -75 │ │ │ │ -_7_6typedef unsigned char _u_c_h_a_r; │ │ │ │ -_7_7typedef unsigned short _u_s_h_o_r_t; │ │ │ │ -_7_8typedef unsigned long _u_l_o_n_g; │ │ │ │ -79 │ │ │ │ -_8_0typedef signed char _i_n_t_8___t; typedef unsigned char _u_i_n_t_8___t; │ │ │ │ -_8_1typedef short _i_n_t_1_6___t; typedef unsigned short _u_i_n_t_1_6___t; │ │ │ │ -82 │ │ │ │ -83// Int should be 32 bit on all archs. │ │ │ │ -84// long is 32 under windows but 64 under unix 64 bit │ │ │ │ -_8_5typedef int _i_n_t_3_2___t; typedef unsigned int _u_i_n_t_3_2___t; │ │ │ │ -86#if defined(OM_CC_MSVC) │ │ │ │ -87typedef __int64 _i_n_t_6_4___t; typedef unsigned __int64 _u_i_n_t_6_4___t; │ │ │ │ -88#else │ │ │ │ -_8_9typedef long long _i_n_t_6_4___t; typedef unsigned long long _u_i_n_t_6_4___t; │ │ │ │ -90#endif │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ +62// Makes life lot easier, when playing/messing around with low-level topology │ │ │ │ +63// changing methods of OpenMesh │ │ │ │ +64# include │ │ │ │ +65# define ASSERT_CONSISTENCY( T, m ) \ │ │ │ │ +66 assert(OpenMesh::Utils::MeshCheckerT(m).check()) │ │ │ │ +67#else │ │ │ │ +68# define ASSERT_CONSISTENCY( T, m ) │ │ │ │ +69#endif │ │ │ │ +70 │ │ │ │ +71//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ +72 │ │ │ │ +73namespace _O_p_e_n_M_e_s_h { │ │ │ │ +74namespace Subdivider { │ │ │ │ +75namespace Uniform { │ │ │ │ +76 │ │ │ │ +77//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +78 │ │ │ │ +87template │ │ │ │ +_8_8class _S_u_b_d_i_v_i_d_e_r_T : private _U_t_i_l_s_:_:_N_o_n_c_o_p_y_a_b_l_e │ │ │ │ +89{ │ │ │ │ +90public: │ │ │ │ 91 │ │ │ │ -_9_2typedef float _f_l_o_a_t_3_2___t; │ │ │ │ -_9_3typedef double _f_l_o_a_t_6_4___t; │ │ │ │ +92 typedef MeshType mesh_t; │ │ │ │ +93 typedef RealType real_t; │ │ │ │ 94 │ │ │ │ -_9_5typedef _u_i_n_t_8___t _r_g_b___t[3]; │ │ │ │ -_9_6typedef _u_i_n_t_8___t _r_g_b_a___t[4]; │ │ │ │ -97 │ │ │ │ +95public: │ │ │ │ +96 │ │ │ │ +98 │ │ │ │ 99 │ │ │ │ -100 │ │ │ │ -101// │ │ │ │ -============================================================================= │ │ │ │ -102} // namespace IO │ │ │ │ -103} // namespace OpenMesh │ │ │ │ -104// │ │ │ │ +_1_0_1 _S_u_b_d_i_v_i_d_e_r_T(void) : attached_() { } │ │ │ │ +102 │ │ │ │ +_1_0_5 explicit _S_u_b_d_i_v_i_d_e_r_T( MeshType &_m ) : attached_(nullptr) { _a_t_t_a_c_h(_m); } │ │ │ │ +106 │ │ │ │ +108 │ │ │ │ +_1_1_0 virtual _~_S_u_b_d_i_v_i_d_e_r_T() │ │ │ │ +111 { _d_e_t_a_c_h(); } │ │ │ │ +112 │ │ │ │ +_1_1_4 virtual const char *_n_a_m_e( void ) const = 0; │ │ │ │ +115 │ │ │ │ +116 │ │ │ │ +117public: │ │ │ │ +118 │ │ │ │ +120 │ │ │ │ +_1_2_2 bool operator () ( MeshType& _m, size_t _n , const bool _update_points = │ │ │ │ +true) │ │ │ │ +123 { │ │ │ │ +124 return _p_r_e_p_a_r_e(_m) && _s_u_b_d_i_v_i_d_e( _m, _n , _update_points ) && _c_l_e_a_n_u_p( _m │ │ │ │ +); │ │ │ │ +125 } │ │ │ │ +127 │ │ │ │ +128public: │ │ │ │ +130 │ │ │ │ +_1_3_2 bool _a_t_t_a_c_h( MeshType& _m ) │ │ │ │ +133 { │ │ │ │ +134 if ( attached_ == &_m ) │ │ │ │ +135 return true; │ │ │ │ +136 │ │ │ │ +137 _d_e_t_a_c_h(); │ │ │ │ +138 if (_p_r_e_p_a_r_e( _m )) │ │ │ │ +139 { │ │ │ │ +140 attached_ = &_m; │ │ │ │ +141 return true; │ │ │ │ +142 } │ │ │ │ +143 return false; │ │ │ │ +144 } │ │ │ │ +145 │ │ │ │ +_1_4_8 bool _o_p_e_r_a_t_o_r_(_)( size_t _n , const bool _update_points = true) │ │ │ │ +149 { │ │ │ │ +150 return attached_ ? _s_u_b_d_i_v_i_d_e( *attached_, _n , _update_points) : false; │ │ │ │ +151 } │ │ │ │ +152 │ │ │ │ +_1_5_5 void _d_e_t_a_c_h(void) │ │ │ │ +156 { │ │ │ │ +157 if ( attached_ ) │ │ │ │ +158 { │ │ │ │ +159 _c_l_e_a_n_u_p( *attached_ ); │ │ │ │ +160 attached_ = nullptr; │ │ │ │ +161 } │ │ │ │ +162 } │ │ │ │ +164 │ │ │ │ +165protected: │ │ │ │ +166 │ │ │ │ +168 │ │ │ │ +169 │ │ │ │ +_1_7_4 virtual bool _p_r_e_p_a_r_e( MeshType& /*_m*/ ) { return false; }; │ │ │ │ +175 │ │ │ │ +_1_7_7 virtual bool _s_u_b_d_i_v_i_d_e( MeshType& _m, size_t _n, const bool _update_points │ │ │ │ += true) = 0; │ │ │ │ +178 │ │ │ │ +_1_8_0 virtual bool _c_l_e_a_n_u_p( MeshType& _m ) = 0; │ │ │ │ +182 │ │ │ │ +183private: │ │ │ │ +184 │ │ │ │ +185 MeshType *attached_; │ │ │ │ +186 │ │ │ │ +187}; │ │ │ │ +188 │ │ │ │ +189// │ │ │ │ +============================================================================= │ │ │ │ +190} // namespace Uniform │ │ │ │ +191} // namespace Subdivider │ │ │ │ +192} // namespace OpenMesh │ │ │ │ +193// │ │ │ │ ============================================================================= │ │ │ │ -105#endif // OPENMESH_MESHREADER_HH defined │ │ │ │ -106// │ │ │ │ +194#endif // OPENMESH_SUBDIVIDER_UNIFORM_SUBDIVIDERT_HH │ │ │ │ +195// │ │ │ │ ============================================================================= │ │ │ │ -107 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_8___t │ │ │ │ -signed char int8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_1_6___t │ │ │ │ -short int16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_g_b___t │ │ │ │ -uint8_t rgb_t[3] │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_g_b_a___t │ │ │ │ -uint8_t rgba_t[4] │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_f_l_o_a_t_6_4___t │ │ │ │ -double float64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:93 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_c_h_a_r │ │ │ │ -unsigned char uchar │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:76 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_6_4___t │ │ │ │ -unsigned long long uint64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_3_2___t │ │ │ │ -unsigned int uint32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_l_o_n_g │ │ │ │ -unsigned long ulong │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:78 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_6_4___t │ │ │ │ -long long int64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_1_6___t │ │ │ │ -unsigned short uint16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_f_l_o_a_t_3_2___t │ │ │ │ -float float32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_s_h_o_r_t │ │ │ │ -unsigned short ushort │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:77 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_3_2___t │ │ │ │ -int int32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_8___t │ │ │ │ -unsigned char uint8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_N_o_n_c_o_p_y_a_b_l_e │ │ │ │ +This class demonstrates the non copyable idiom. │ │ │ │ +DDeeffiinniittiioonn Noncopyable.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_c_l_e_a_n_u_p │ │ │ │ +virtual bool cleanup(MeshType &_m)=0 │ │ │ │ +Cleanup mesh after usage, e.g. remove added properties. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ +bool operator()(size_t _n, const bool _update_points=true) │ │ │ │ +Subdivide the attached _n times. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:148 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_a_t_t_a_c_h │ │ │ │ +bool attach(MeshType &_m) │ │ │ │ +Attach mesh _m to self. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:132 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_d_e_t_a_c_h │ │ │ │ +void detach(void) │ │ │ │ +Detach an eventually attached mesh. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:155 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +SubdividerT(MeshType &_m) │ │ │ │ +Constructor to be used with interface 1 (calls attach()) │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:105 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +SubdividerT(void) │ │ │ │ +Constructor to be used with interface 2. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:101 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_~_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +virtual ~SubdividerT() │ │ │ │ +Destructor (calls detach()) │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_s_u_b_d_i_v_i_d_e │ │ │ │ +virtual bool subdivide(MeshType &_m, size_t _n, const bool │ │ │ │ +_update_points=true)=0 │ │ │ │ +Subdivide mesh _m _n times. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_p_r_e_p_a_r_e │ │ │ │ +virtual bool prepare(MeshType &) │ │ │ │ +Prepare mesh, e.g. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T_:_:_n_a_m_e │ │ │ │ +virtual const char * name(void) const =0 │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00521_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/SR_store.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/CatmullClarkT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SR_store.hh
│ │ │ +
CatmullClarkT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,40 +136,377 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51#ifndef OPENMESH_SR_STORE_HH
│ │ │ -
52#define OPENMESH_SR_STORE_HH
│ │ │ -
53
│ │ │ +
42//=============================================================================
│ │ │ +
43//
│ │ │ +
44// CLASS CatmullClarkT - IMPLEMENTATION
│ │ │ +
45//
│ │ │ +
46//=============================================================================
│ │ │ +
47
│ │ │ +
48#define OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARK_CC
│ │ │ +
49
│ │ │ +
50//== INCLUDES =================================================================
│ │ │ +
51
│ │ │ +
52#include "CatmullClarkT.hh"
│ │ │ +
53#include <OpenMesh/Tools/Utils/MeshCheckerT.hh>
│ │ │
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
55//== NAMESPACES ===============================================================
│ │ │
56
│ │ │ -
57#include <OpenMesh/Core/System/config.h>
│ │ │ -
58#include <OpenMesh/Core/IO/SR_types.hh>
│ │ │ -
59#include <OpenMesh/Core/IO/SR_rbo.hh>
│ │ │ -
60#include <OpenMesh/Core/IO/SR_binary.hh>
│ │ │ -
61#include <OpenMesh/Core/IO/SR_binary_spec.hh>
│ │ │ -
62#include <OpenMesh/Core/IO/StoreRestore.hh>
│ │ │ -
63
│ │ │ -
64//=============================================================================
│ │ │ -
65#endif // OPENMESH_STORE_HH defined
│ │ │ -
66//=============================================================================
│ │ │ -
67
│ │ │ +
57namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
58namespace Subdivider { // BEGIN_NS_SUBVIDER
│ │ │ +
59namespace Uniform { // BEGIN_NS_UNIFORM
│ │ │ +
60
│ │ │ +
61//== IMPLEMENTATION ==========================================================
│ │ │ +
62
│ │ │ +
63template <typename MeshType, typename RealType>
│ │ │ +
64bool
│ │ │ +
│ │ │ + │ │ │ +
66{
│ │ │ +
67 _m.add_property( vp_pos_ );
│ │ │ +
68 _m.add_property( ep_pos_ );
│ │ │ +
69 _m.add_property( fp_pos_ );
│ │ │ +
70 _m.add_property( creaseWeights_ );
│ │ │ +
71
│ │ │ +
72 // initialize all weights to 0 (= smooth edge)
│ │ │ +
73 for( EdgeIter e_it = _m.edges_begin(); e_it != _m.edges_end(); ++e_it)
│ │ │ +
74 _m.property(creaseWeights_, *e_it ) = 0.0;
│ │ │ +
75
│ │ │ +
76 return true;
│ │ │ +
77}
│ │ │ +
│ │ │ +
78
│ │ │ +
79//-----------------------------------------------------------------------------
│ │ │ +
80
│ │ │ +
81template <typename MeshType, typename RealType>
│ │ │ +
82bool
│ │ │ +
│ │ │ + │ │ │ +
84{
│ │ │ +
85 _m.remove_property( vp_pos_ );
│ │ │ +
86 _m.remove_property( ep_pos_ );
│ │ │ +
87 _m.remove_property( fp_pos_ );
│ │ │ +
88 _m.remove_property( creaseWeights_ );
│ │ │ +
89 return true;
│ │ │ +
90}
│ │ │ +
│ │ │ +
91
│ │ │ +
92//-----------------------------------------------------------------------------
│ │ │ +
93
│ │ │ +
94template <typename MeshType, typename RealType>
│ │ │ +
95bool
│ │ │ +
│ │ │ +
96CatmullClarkT<MeshType,RealType>::subdivide( MeshType& _m , size_t _n , const bool _update_points)
│ │ │ +
97{
│ │ │ +
98 // Do _n subdivisions
│ │ │ +
99 for ( size_t i = 0; i < _n; ++i)
│ │ │ +
100 {
│ │ │ +
101
│ │ │ +
102 // Compute face centroid
│ │ │ +
103 for ( auto fh : _m.faces())
│ │ │ +
104 {
│ │ │ +
105 Point centroid;
│ │ │ +
106 _m.calc_face_centroid( fh, centroid);
│ │ │ +
107 _m.property( fp_pos_, fh ) = centroid;
│ │ │ +
108 }
│ │ │ +
109
│ │ │ +
110 // Compute position for new (edge-) vertices and store them in the edge property
│ │ │ +
111 for ( auto eh : _m.edges())
│ │ │ +
112 compute_midpoint( _m, eh, _update_points );
│ │ │ +
113
│ │ │ +
114 // position updates activated?
│ │ │ +
115 if(_update_points)
│ │ │ +
116 {
│ │ │ +
117 // compute new positions for old vertices
│ │ │ +
118 for ( auto vh : _m.vertices())
│ │ │ +
119 update_vertex( _m, vh );
│ │ │ +
120
│ │ │ +
121 // Commit changes in geometry
│ │ │ +
122 for ( auto vh : _m.vertices())
│ │ │ +
123 _m.set_point(vh, _m.property( vp_pos_, vh ) );
│ │ │ +
124 }
│ │ │ +
125
│ │ │ +
126 // Split each edge at midpoint stored in edge property ep_pos_;
│ │ │ +
127 // Attention! Creating new edges, hence make sure the loop ends correctly.
│ │ │ +
128 for ( auto eh : _m.edges())
│ │ │ +
129 split_edge( _m, eh );
│ │ │ +
130
│ │ │ +
131 // Commit changes in topology and reconsitute consistency
│ │ │ +
132 // Attention! Creating new faces, hence make sure the loop ends correctly.
│ │ │ +
133 for ( auto fh : _m.faces())
│ │ │ +
134 split_face( _m, fh);
│ │ │ +
135
│ │ │ +
136
│ │ │ +
137#if defined(_DEBUG) || defined(DEBUG)
│ │ │ +
138 // Now we have an consistent mesh!
│ │ │ +
139 assert( OpenMesh::Utils::MeshCheckerT<MeshType>(_m).check() );
│ │ │ +
140#endif
│ │ │ +
141 }
│ │ │ +
142
│ │ │ +
143 _m.update_normals();
│ │ │ +
144
│ │ │ +
145 return true;
│ │ │ +
146}
│ │ │ +
│ │ │ +
147
│ │ │ +
148//-----------------------------------------------------------------------------
│ │ │ +
149
│ │ │ +
150template <typename MeshType, typename RealType>
│ │ │ +
151void
│ │ │ + │ │ │ +
153{
│ │ │ +
154 /*
│ │ │ +
155 Split an n-gon into n quads by connecting
│ │ │ +
156 each vertex of fh to vh.
│ │ │ +
157
│ │ │ +
158 - _fh will remain valid (it will become one of the quads)
│ │ │ +
159 - the halfedge handles of the new quads will
│ │ │ +
160 point to the old halfedges
│ │ │ +
161 */
│ │ │ +
162
│ │ │ +
163 // Since edges already refined (valence*2)
│ │ │ +
164 size_t valence = _m.valence(_fh)/2;
│ │ │ +
165
│ │ │ +
166 // new mesh vertex from face centroid
│ │ │ +
167 VertexHandle vh = _m.add_vertex(_m.property( fp_pos_, _fh ));
│ │ │ +
168
│ │ │ +
169 HalfedgeHandle hend = _m.halfedge_handle(_fh);
│ │ │ +
170 HalfedgeHandle hh = _m.next_halfedge_handle(hend);
│ │ │ +
171
│ │ │ +
172 HalfedgeHandle hold = _m.new_edge(_m.to_vertex_handle(hend), vh);
│ │ │ +
173
│ │ │ +
174 _m.set_next_halfedge_handle(hend, hold);
│ │ │ +
175 _m.set_face_handle(hold, _fh);
│ │ │ +
176
│ │ │ +
177 hold = _m.opposite_halfedge_handle(hold);
│ │ │ +
178
│ │ │ +
179 for(size_t i = 1; i < valence; i++)
│ │ │ +
180 {
│ │ │ +
181 HalfedgeHandle hnext = _m.next_halfedge_handle(hh);
│ │ │ +
182
│ │ │ +
183 FaceHandle fnew = _m.new_face();
│ │ │ +
184
│ │ │ +
185 _m.set_halfedge_handle(fnew, hh);
│ │ │ +
186
│ │ │ +
187 HalfedgeHandle hnew = _m.new_edge(_m.to_vertex_handle(hnext), vh);
│ │ │ +
188
│ │ │ +
189 _m.set_face_handle(hnew, fnew);
│ │ │ +
190 _m.set_face_handle(hold, fnew);
│ │ │ +
191 _m.set_face_handle(hh, fnew);
│ │ │ +
192 _m.set_face_handle(hnext, fnew);
│ │ │ +
193
│ │ │ +
194 _m.set_next_halfedge_handle(hnew, hold);
│ │ │ +
195 _m.set_next_halfedge_handle(hold, hh);
│ │ │ +
196 _m.set_next_halfedge_handle(hh, hnext);
│ │ │ +
197 hh = _m.next_halfedge_handle(hnext);
│ │ │ +
198 _m.set_next_halfedge_handle(hnext, hnew);
│ │ │ +
199
│ │ │ +
200 hold = _m.opposite_halfedge_handle(hnew);
│ │ │ +
201 }
│ │ │ +
202
│ │ │ +
203 _m.set_next_halfedge_handle(hold, hh);
│ │ │ +
204 _m.set_next_halfedge_handle(hh, hend);
│ │ │ +
205 hh = _m.next_halfedge_handle(hend);
│ │ │ +
206 _m.set_next_halfedge_handle(hend, hh);
│ │ │ +
207 _m.set_next_halfedge_handle(hh, hold);
│ │ │ +
208
│ │ │ +
209 _m.set_face_handle(hold, _fh);
│ │ │ +
210
│ │ │ +
211 _m.set_halfedge_handle(vh, hold);
│ │ │ +
212}
│ │ │ +
213
│ │ │ +
214//-----------------------------------------------------------------------------
│ │ │ +
215
│ │ │ +
216template <typename MeshType, typename RealType>
│ │ │ +
217void
│ │ │ +
218CatmullClarkT<MeshType,RealType>::split_edge( MeshType& _m, const EdgeHandle& _eh)
│ │ │ +
219{
│ │ │ +
220 HalfedgeHandle heh = _m.halfedge_handle(_eh, 0);
│ │ │ +
221 HalfedgeHandle opp_heh = _m.halfedge_handle(_eh, 1);
│ │ │ +
222
│ │ │ +
223 HalfedgeHandle new_heh, opp_new_heh, t_heh;
│ │ │ +
224 VertexHandle vh;
│ │ │ +
225 VertexHandle vh1( _m.to_vertex_handle(heh));
│ │ │ +
226 Point zero(0,0,0);
│ │ │ +
227
│ │ │ +
228 // new vertex
│ │ │ +
229 vh = _m.new_vertex( zero );
│ │ │ +
230 _m.set_point( vh, _m.property( ep_pos_, _eh ) );
│ │ │ +
231
│ │ │ +
232 // Re-link mesh entities
│ │ │ +
233 if (_m.is_boundary(_eh))
│ │ │ +
234 {
│ │ │ +
235 for (t_heh = heh;
│ │ │ +
236 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
237 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh)))
│ │ │ +
238 {}
│ │ │ +
239 }
│ │ │ +
240 else
│ │ │ +
241 {
│ │ │ +
242 for (t_heh = _m.next_halfedge_handle(opp_heh);
│ │ │ +
243 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
244 t_heh = _m.next_halfedge_handle(t_heh) )
│ │ │ +
245 {}
│ │ │ +
246 }
│ │ │ +
247
│ │ │ +
248 new_heh = _m.new_edge(vh, vh1);
│ │ │ +
249 opp_new_heh = _m.opposite_halfedge_handle(new_heh);
│ │ │ +
250 _m.set_vertex_handle( heh, vh );
│ │ │ +
251
│ │ │ +
252 _m.set_next_halfedge_handle(t_heh, opp_new_heh);
│ │ │ +
253 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh));
│ │ │ +
254 _m.set_next_halfedge_handle(heh, new_heh);
│ │ │ +
255 _m.set_next_halfedge_handle(opp_new_heh, opp_heh);
│ │ │ +
256
│ │ │ +
257 if (_m.face_handle(opp_heh).is_valid())
│ │ │ +
258 {
│ │ │ +
259 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh));
│ │ │ +
260 _m.set_halfedge_handle(_m.face_handle(opp_new_heh), opp_new_heh);
│ │ │ +
261 }
│ │ │ +
262
│ │ │ +
263 if( _m.face_handle(heh).is_valid())
│ │ │ +
264 {
│ │ │ +
265 _m.set_face_handle( new_heh, _m.face_handle(heh) );
│ │ │ +
266 _m.set_halfedge_handle( _m.face_handle(heh), heh );
│ │ │ +
267 }
│ │ │ +
268
│ │ │ +
269 _m.set_halfedge_handle( vh, new_heh);
│ │ │ +
270 _m.set_halfedge_handle( vh1, opp_new_heh );
│ │ │ +
271
│ │ │ +
272 // Never forget this, when playing with the topology
│ │ │ +
273 _m.adjust_outgoing_halfedge( vh );
│ │ │ +
274 _m.adjust_outgoing_halfedge( vh1 );
│ │ │ +
275}
│ │ │ +
276
│ │ │ +
277//-----------------------------------------------------------------------------
│ │ │ +
278
│ │ │ +
279template <typename MeshType, typename RealType>
│ │ │ +
280void
│ │ │ +
281CatmullClarkT<MeshType,RealType>::compute_midpoint( MeshType& _m, const EdgeHandle& _eh, const bool _update_points)
│ │ │ +
282{
│ │ │ +
283 HalfedgeHandle heh, opp_heh;
│ │ │ +
284
│ │ │ +
285 heh = _m.halfedge_handle( _eh, 0);
│ │ │ +
286 opp_heh = _m.halfedge_handle( _eh, 1);
│ │ │ +
287
│ │ │ +
288 Point pos( _m.point( _m.to_vertex_handle( heh)));
│ │ │ +
289
│ │ │ +
290 pos += _m.point( _m.to_vertex_handle( opp_heh));
│ │ │ +
291
│ │ │ +
292 // boundary edge: just average vertex positions
│ │ │ +
293 // this yields the [1/2 1/2] mask
│ │ │ +
294 if (_m.is_boundary(_eh) || !_update_points)
│ │ │ +
295 {
│ │ │ +
296 pos *= static_cast<RealType>(0.5);
│ │ │ +
297 }
│ │ │ +
298// else if (_m.status(_eh).selected() )
│ │ │ +
299// {
│ │ │ +
300// pos *= 0.5; // change this
│ │ │ +
301// }
│ │ │ +
302
│ │ │ +
303 else // inner edge: add neighbouring Vertices to sum
│ │ │ +
304 // this yields the [1/16 1/16; 3/8 3/8; 1/16 1/16] mask
│ │ │ +
305 {
│ │ │ +
306 pos += _m.property(fp_pos_, _m.face_handle(heh));
│ │ │ +
307 pos += _m.property(fp_pos_, _m.face_handle(opp_heh));
│ │ │ +
308 pos *= static_cast<RealType>(0.25);
│ │ │ +
309 }
│ │ │ +
310 _m.property( ep_pos_, _eh ) = pos;
│ │ │ +
311}
│ │ │ +
312
│ │ │ +
313//-----------------------------------------------------------------------------
│ │ │ +
314
│ │ │ +
315template <typename MeshType, typename RealType>
│ │ │ +
316void
│ │ │ +
317CatmullClarkT<MeshType,RealType>::update_vertex( MeshType& _m, const VertexHandle& _vh)
│ │ │ +
318{
│ │ │ +
319 Point pos(0.0,0.0,0.0);
│ │ │ +
320
│ │ │ +
321 // TODO boundary, Extraordinary Vertex and Creased Surfaces
│ │ │ +
322 // see "A Factored Approach to Subdivision Surfaces"
│ │ │ +
323 // http://faculty.cs.tamu.edu/schaefer/research/tutorial.pdf
│ │ │ +
324 // and http://www.cs.utah.edu/~lacewell/subdeval
│ │ │ +
325 if ( _m.is_boundary( _vh))
│ │ │ +
326 {
│ │ │ +
327 pos = _m.point(_vh);
│ │ │ +
328 VertexEdgeIter ve_itr;
│ │ │ +
329 for ( ve_itr = _m.ve_iter( _vh); ve_itr.is_valid(); ++ve_itr)
│ │ │ +
330 if ( _m.is_boundary( *ve_itr))
│ │ │ +
331 pos += _m.property( ep_pos_, *ve_itr);
│ │ │ +
332 pos /= static_cast<typename vector_traits<typename MeshType::Point>::value_type>(3.0);
│ │ │ +
333 }
│ │ │ +
334 else // inner vertex
│ │ │ +
335 {
│ │ │ +
336 /* For each (non boundary) vertex V, introduce a new vertex whose
│ │ │ +
337 position is F/n + 2E/n + (n-3)V/n where F is the average of
│ │ │ +
338 the new face vertices of all faces adjacent to the old vertex
│ │ │ +
339 V, E is the average of the midpoints of all edges incident
│ │ │ +
340 on the old vertex V, and n is the number of edges incident on
│ │ │ +
341 the vertex.
│ │ │ +
342 */
│ │ │ +
343
│ │ │ +
344 /*
│ │ │ +
345 Normal Vec;
│ │ │ +
346 VertexEdgeIter ve_itr;
│ │ │ +
347 double valence(0.0);
│ │ │ +
348
│ │ │ +
349 // R = Calculate Valence and sum of edge midpoints
│ │ │ +
350 for ( ve_itr = _m.ve_iter( _vh); ve_itr; ++ve_itr)
│ │ │ +
351 {
│ │ │ +
352 valence+=1.0;
│ │ │ +
353 pos += _m.property(ep_pos_, *ve_itr);
│ │ │ +
354 }
│ │ │ +
355 pos /= valence*valence;
│ │ │ +
356 */
│ │ │ +
357
│ │ │ +
358 RealType valence(0.0);
│ │ │ +
359 VOHIter voh_it = _m.voh_iter( _vh );
│ │ │ +
360 for( ; voh_it.is_valid(); ++voh_it )
│ │ │ +
361 {
│ │ │ +
362 pos += _m.point( _m.to_vertex_handle( *voh_it ) );
│ │ │ +
363 valence+=1.0;
│ │ │ +
364 }
│ │ │ +
365 pos /= valence*valence;
│ │ │ +
366
│ │ │ +
367 VertexFaceIter vf_itr;
│ │ │ +
368 Point Q(0, 0, 0);
│ │ │ +
369
│ │ │ +
370 for ( vf_itr = _m.vf_iter( _vh); vf_itr.is_valid(); ++vf_itr) //, neigboring_faces += 1.0 )
│ │ │ +
371 {
│ │ │ +
372 Q += _m.property(fp_pos_, *vf_itr);
│ │ │ +
373 }
│ │ │ +
374
│ │ │ +
375 Q /= valence*valence;//neigboring_faces;
│ │ │ +
376
│ │ │ +
377 pos += _m.point(_vh) * (valence - RealType(2.0) )/valence + Q;
│ │ │ +
378 // pos = vector_cast<Vec>(_m.point(_vh));
│ │ │ +
379 }
│ │ │ +
380
│ │ │ +
381 _m.property( vp_pos_, _vh ) = pos;
│ │ │ +
382}
│ │ │ +
383
│ │ │ +
384//-----------------------------------------------------------------------------
│ │ │ +
385
│ │ │ +
386//=============================================================================
│ │ │ +
387} // END_NS_UNIFORM
│ │ │ +
388} // END_NS_SUBDIVIDER
│ │ │ +
389} // END_NS_OPENMESH
│ │ │ +
390//=============================================================================
│ │ │ + │ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Based on code from Leon Kos, CAD lab, Mech.Eng., University of Ljubljana, Slovenia (http://www....
Definition CatmullClarkT.hh:86
│ │ │ +
Check integrity of mesh.
Definition MeshCheckerT.hh:74
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SR_store.hh │ │ │ │ +CatmullClarkT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,41 +45,405 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ +42// │ │ │ │ ============================================================================= │ │ │ │ +43// │ │ │ │ +44// CLASS CatmullClarkT - IMPLEMENTATION │ │ │ │ +45// │ │ │ │ 46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_SR_STORE_HH │ │ │ │ -52#define OPENMESH_SR_STORE_HH │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ +47 │ │ │ │ +48#define OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARK_CC │ │ │ │ +49 │ │ │ │ +50//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ +51 │ │ │ │ +52#include "_C_a_t_m_u_l_l_C_l_a_r_k_T_._h_h" │ │ │ │ +53#include │ │ │ │ +54 │ │ │ │ +55//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ -63 │ │ │ │ -64// │ │ │ │ +57namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +58namespace Subdivider { // BEGIN_NS_SUBVIDER │ │ │ │ +59namespace Uniform { // BEGIN_NS_UNIFORM │ │ │ │ +60 │ │ │ │ +61//== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ +62 │ │ │ │ +63template │ │ │ │ +64bool │ │ │ │ +_6_5_C_a_t_m_u_l_l_C_l_a_r_k_T_<_ _M_e_s_h_T_y_p_e_,_ _R_e_a_l_T_y_p_e_ _>_:_:_p_r_e_p_a_r_e( MeshType& _m ) │ │ │ │ +66{ │ │ │ │ +67 _m.add_property( vp_pos_ ); │ │ │ │ +68 _m.add_property( ep_pos_ ); │ │ │ │ +69 _m.add_property( fp_pos_ ); │ │ │ │ +70 _m.add_property( creaseWeights_ ); │ │ │ │ +71 │ │ │ │ +72 // initialize all weights to 0 (= smooth edge) │ │ │ │ +73 for( EdgeIter e_it = _m.edges_begin(); e_it != _m.edges_end(); ++e_it) │ │ │ │ +74 _m.property(creaseWeights_, *e_it ) = 0.0; │ │ │ │ +75 │ │ │ │ +76 return true; │ │ │ │ +77} │ │ │ │ +78 │ │ │ │ +79//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +80 │ │ │ │ +81template │ │ │ │ +82bool │ │ │ │ +_8_3_C_a_t_m_u_l_l_C_l_a_r_k_T_<_M_e_s_h_T_y_p_e_,_R_e_a_l_T_y_p_e_>_:_:_c_l_e_a_n_u_p( MeshType& _m ) │ │ │ │ +84{ │ │ │ │ +85 _m.remove_property( vp_pos_ ); │ │ │ │ +86 _m.remove_property( ep_pos_ ); │ │ │ │ +87 _m.remove_property( fp_pos_ ); │ │ │ │ +88 _m.remove_property( creaseWeights_ ); │ │ │ │ +89 return true; │ │ │ │ +90} │ │ │ │ +91 │ │ │ │ +92//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +93 │ │ │ │ +94template │ │ │ │ +95bool │ │ │ │ +_9_6_C_a_t_m_u_l_l_C_l_a_r_k_T_<_M_e_s_h_T_y_p_e_,_R_e_a_l_T_y_p_e_>_:_:_s_u_b_d_i_v_i_d_e( MeshType& _m , size_t _n , const │ │ │ │ +bool _update_points) │ │ │ │ +97{ │ │ │ │ +98 // Do _n subdivisions │ │ │ │ +99 for ( size_t i = 0; i < _n; ++i) │ │ │ │ +100 { │ │ │ │ +101 │ │ │ │ +102 // Compute face centroid │ │ │ │ +103 for ( auto fh : _m.faces()) │ │ │ │ +104 { │ │ │ │ +105 Point centroid; │ │ │ │ +106 _m.calc_face_centroid( fh, centroid); │ │ │ │ +107 _m.property( fp_pos_, fh ) = centroid; │ │ │ │ +108 } │ │ │ │ +109 │ │ │ │ +110 // Compute position for new (edge-) vertices and store them in the edge │ │ │ │ +property │ │ │ │ +111 for ( auto eh : _m.edges()) │ │ │ │ +112 compute_midpoint( _m, eh, _update_points ); │ │ │ │ +113 │ │ │ │ +114 // position updates activated? │ │ │ │ +115 if(_update_points) │ │ │ │ +116 { │ │ │ │ +117 // compute new positions for old vertices │ │ │ │ +118 for ( auto vh : _m.vertices()) │ │ │ │ +119 update_vertex( _m, vh ); │ │ │ │ +120 │ │ │ │ +121 // Commit changes in geometry │ │ │ │ +122 for ( auto vh : _m.vertices()) │ │ │ │ +123 _m.set_point(vh, _m.property( vp_pos_, vh ) ); │ │ │ │ +124 } │ │ │ │ +125 │ │ │ │ +126 // Split each edge at midpoint stored in edge property ep_pos_; │ │ │ │ +127 // Attention! Creating new edges, hence make sure the loop ends correctly. │ │ │ │ +128 for ( auto eh : _m.edges()) │ │ │ │ +129 split_edge( _m, eh ); │ │ │ │ +130 │ │ │ │ +131 // Commit changes in topology and reconsitute consistency │ │ │ │ +132 // Attention! Creating new faces, hence make sure the loop ends correctly. │ │ │ │ +133 for ( auto fh : _m.faces()) │ │ │ │ +134 split_face( _m, fh); │ │ │ │ +135 │ │ │ │ +136 │ │ │ │ +137#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ +138 // Now we have an consistent mesh! │ │ │ │ +139 assert( _O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_M_e_s_h_C_h_e_c_k_e_r_T_<_M_e_s_h_T_y_p_e_>(_m).check() ); │ │ │ │ +140#endif │ │ │ │ +141 } │ │ │ │ +142 │ │ │ │ +143 _m.update_normals(); │ │ │ │ +144 │ │ │ │ +145 return true; │ │ │ │ +146} │ │ │ │ +147 │ │ │ │ +148//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +149 │ │ │ │ +150template │ │ │ │ +151void │ │ │ │ +152_C_a_t_m_u_l_l_C_l_a_r_k_T_<_M_e_s_h_T_y_p_e_,_R_e_a_l_T_y_p_e_>_:_:_s_p_l_i_t___f_a_c_e( MeshType& _m, const │ │ │ │ +_F_a_c_e_H_a_n_d_l_e& _fh) │ │ │ │ +153{ │ │ │ │ +154 /* │ │ │ │ +155 Split an n-gon into n quads by connecting │ │ │ │ +156 each vertex of fh to vh. │ │ │ │ +157 │ │ │ │ +158 - _fh will remain valid (it will become one of the quads) │ │ │ │ +159 - the halfedge handles of the new quads will │ │ │ │ +160 point to the old halfedges │ │ │ │ +161 */ │ │ │ │ +162 │ │ │ │ +163 // Since edges already refined (valence*2) │ │ │ │ +164 size_t valence = _m.valence(_fh)/2; │ │ │ │ +165 │ │ │ │ +166 // new mesh vertex from face centroid │ │ │ │ +167 _V_e_r_t_e_x_H_a_n_d_l_e vh = _m.add_vertex(_m.property( fp_pos_, _fh )); │ │ │ │ +168 │ │ │ │ +169 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hend = _m.halfedge_handle(_fh); │ │ │ │ +170 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hh = _m.next_halfedge_handle(hend); │ │ │ │ +171 │ │ │ │ +172 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hold = _m.new_edge(_m.to_vertex_handle(hend), vh); │ │ │ │ +173 │ │ │ │ +174 _m.set_next_halfedge_handle(hend, hold); │ │ │ │ +175 _m.set_face_handle(hold, _fh); │ │ │ │ +176 │ │ │ │ +177 hold = _m.opposite_halfedge_handle(hold); │ │ │ │ +178 │ │ │ │ +179 for(size_t i = 1; i < valence; i++) │ │ │ │ +180 { │ │ │ │ +181 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hnext = _m.next_halfedge_handle(hh); │ │ │ │ +182 │ │ │ │ +183 _F_a_c_e_H_a_n_d_l_e fnew = _m.new_face(); │ │ │ │ +184 │ │ │ │ +185 _m.set_halfedge_handle(fnew, hh); │ │ │ │ +186 │ │ │ │ +187 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hnew = _m.new_edge(_m.to_vertex_handle(hnext), vh); │ │ │ │ +188 │ │ │ │ +189 _m.set_face_handle(hnew, fnew); │ │ │ │ +190 _m.set_face_handle(hold, fnew); │ │ │ │ +191 _m.set_face_handle(hh, fnew); │ │ │ │ +192 _m.set_face_handle(hnext, fnew); │ │ │ │ +193 │ │ │ │ +194 _m.set_next_halfedge_handle(hnew, hold); │ │ │ │ +195 _m.set_next_halfedge_handle(hold, hh); │ │ │ │ +196 _m.set_next_halfedge_handle(hh, hnext); │ │ │ │ +197 hh = _m.next_halfedge_handle(hnext); │ │ │ │ +198 _m.set_next_halfedge_handle(hnext, hnew); │ │ │ │ +199 │ │ │ │ +200 hold = _m.opposite_halfedge_handle(hnew); │ │ │ │ +201 } │ │ │ │ +202 │ │ │ │ +203 _m.set_next_halfedge_handle(hold, hh); │ │ │ │ +204 _m.set_next_halfedge_handle(hh, hend); │ │ │ │ +205 hh = _m.next_halfedge_handle(hend); │ │ │ │ +206 _m.set_next_halfedge_handle(hend, hh); │ │ │ │ +207 _m.set_next_halfedge_handle(hh, hold); │ │ │ │ +208 │ │ │ │ +209 _m.set_face_handle(hold, _fh); │ │ │ │ +210 │ │ │ │ +211 _m.set_halfedge_handle(vh, hold); │ │ │ │ +212} │ │ │ │ +213 │ │ │ │ +214//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +215 │ │ │ │ +216template │ │ │ │ +217void │ │ │ │ +218CatmullClarkT::split_edge( MeshType& _m, const │ │ │ │ +_E_d_g_e_H_a_n_d_l_e& _eh) │ │ │ │ +219{ │ │ │ │ +220 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh = _m.halfedge_handle(_eh, 0); │ │ │ │ +221 _H_a_l_f_e_d_g_e_H_a_n_d_l_e opp_heh = _m.halfedge_handle(_eh, 1); │ │ │ │ +222 │ │ │ │ +223 _H_a_l_f_e_d_g_e_H_a_n_d_l_e new_heh, opp_new_heh, t_heh; │ │ │ │ +224 _V_e_r_t_e_x_H_a_n_d_l_e vh; │ │ │ │ +225 _V_e_r_t_e_x_H_a_n_d_l_e vh1( _m.to_vertex_handle(heh)); │ │ │ │ +226 Point zero(0,0,0); │ │ │ │ +227 │ │ │ │ +228 // new vertex │ │ │ │ +229 vh = _m.new_vertex( zero ); │ │ │ │ +230 _m.set_point( vh, _m.property( ep_pos_, _eh ) ); │ │ │ │ +231 │ │ │ │ +232 // Re-link mesh entities │ │ │ │ +233 if (_m.is_boundary(_eh)) │ │ │ │ +234 { │ │ │ │ +235 for (t_heh = heh; │ │ │ │ +236 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +237 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh))) │ │ │ │ +238 {} │ │ │ │ +239 } │ │ │ │ +240 else │ │ │ │ +241 { │ │ │ │ +242 for (t_heh = _m.next_halfedge_handle(opp_heh); │ │ │ │ +243 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +244 t_heh = _m.next_halfedge_handle(t_heh) ) │ │ │ │ +245 {} │ │ │ │ +246 } │ │ │ │ +247 │ │ │ │ +248 new_heh = _m.new_edge(vh, vh1); │ │ │ │ +249 opp_new_heh = _m.opposite_halfedge_handle(new_heh); │ │ │ │ +250 _m.set_vertex_handle( heh, vh ); │ │ │ │ +251 │ │ │ │ +252 _m.set_next_halfedge_handle(t_heh, opp_new_heh); │ │ │ │ +253 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh)); │ │ │ │ +254 _m.set_next_halfedge_handle(heh, new_heh); │ │ │ │ +255 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); │ │ │ │ +256 │ │ │ │ +257 if (_m.face_handle(opp_heh).is_valid()) │ │ │ │ +258 { │ │ │ │ +259 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh)); │ │ │ │ +260 _m.set_halfedge_handle(_m.face_handle(opp_new_heh), opp_new_heh); │ │ │ │ +261 } │ │ │ │ +262 │ │ │ │ +263 if( _m.face_handle(heh).is_valid()) │ │ │ │ +264 { │ │ │ │ +265 _m.set_face_handle( new_heh, _m.face_handle(heh) ); │ │ │ │ +266 _m.set_halfedge_handle( _m.face_handle(heh), heh ); │ │ │ │ +267 } │ │ │ │ +268 │ │ │ │ +269 _m.set_halfedge_handle( vh, new_heh); │ │ │ │ +270 _m.set_halfedge_handle( vh1, opp_new_heh ); │ │ │ │ +271 │ │ │ │ +272 // Never forget this, when playing with the topology │ │ │ │ +273 _m.adjust_outgoing_halfedge( vh ); │ │ │ │ +274 _m.adjust_outgoing_halfedge( vh1 ); │ │ │ │ +275} │ │ │ │ +276 │ │ │ │ +277//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +278 │ │ │ │ +279template │ │ │ │ +280void │ │ │ │ +281CatmullClarkT::compute_midpoint( MeshType& _m, const │ │ │ │ +EdgeHandle& _eh, const bool _update_points) │ │ │ │ +282{ │ │ │ │ +283 HalfedgeHandle heh, opp_heh; │ │ │ │ +284 │ │ │ │ +285 heh = _m.halfedge_handle( _eh, 0); │ │ │ │ +286 opp_heh = _m.halfedge_handle( _eh, 1); │ │ │ │ +287 │ │ │ │ +288 Point pos( _m.point( _m.to_vertex_handle( heh))); │ │ │ │ +289 │ │ │ │ +290 pos += _m.point( _m.to_vertex_handle( opp_heh)); │ │ │ │ +291 │ │ │ │ +292 // boundary edge: just average vertex positions │ │ │ │ +293 // this yields the [1/2 1/2] mask │ │ │ │ +294 if (_m.is_boundary(_eh) || !_update_points) │ │ │ │ +295 { │ │ │ │ +296 pos *= static_cast(0.5); │ │ │ │ +297 } │ │ │ │ +298// else if (_m.status(_eh).selected() ) │ │ │ │ +299// { │ │ │ │ +300// pos *= 0.5; // change this │ │ │ │ +301// } │ │ │ │ +302 │ │ │ │ +303 else // inner edge: add neighbouring Vertices to sum │ │ │ │ +304 // this yields the [1/16 1/16; 3/8 3/8; 1/16 1/16] mask │ │ │ │ +305 { │ │ │ │ +306 pos += _m.property(fp_pos_, _m.face_handle(heh)); │ │ │ │ +307 pos += _m.property(fp_pos_, _m.face_handle(opp_heh)); │ │ │ │ +308 pos *= static_cast(0.25); │ │ │ │ +309 } │ │ │ │ +310 _m.property( ep_pos_, _eh ) = pos; │ │ │ │ +311} │ │ │ │ +312 │ │ │ │ +313//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +314 │ │ │ │ +315template │ │ │ │ +316void │ │ │ │ +317CatmullClarkT::update_vertex( MeshType& _m, const │ │ │ │ +VertexHandle& _vh) │ │ │ │ +318{ │ │ │ │ +319 Point pos(0.0,0.0,0.0); │ │ │ │ +320 │ │ │ │ +321 // TODO boundary, Extraordinary Vertex and Creased Surfaces │ │ │ │ +322 // see "A Factored Approach to Subdivision Surfaces" │ │ │ │ +323 // http://faculty.cs.tamu.edu/schaefer/research/tutorial.pdf │ │ │ │ +324 // and http://www.cs.utah.edu/~lacewell/subdeval │ │ │ │ +325 if ( _m.is_boundary( _vh)) │ │ │ │ +326 { │ │ │ │ +327 pos = _m.point(_vh); │ │ │ │ +328 VertexEdgeIter ve_itr; │ │ │ │ +329 for ( ve_itr = _m.ve_iter( _vh); ve_itr.is_valid(); ++ve_itr) │ │ │ │ +330 if ( _m.is_boundary( *ve_itr)) │ │ │ │ +331 pos += _m.property( ep_pos_, *ve_itr); │ │ │ │ +332 pos /= static_cast:: │ │ │ │ +value_type>(3.0); │ │ │ │ +333 } │ │ │ │ +334 else // inner vertex │ │ │ │ +335 { │ │ │ │ +336 /* For each (non boundary) vertex V, introduce a new vertex whose │ │ │ │ +337 position is F/n + 2E/n + (n-3)V/n where F is the average of │ │ │ │ +338 the new face vertices of all faces adjacent to the old vertex │ │ │ │ +339 V, E is the average of the midpoints of all edges incident │ │ │ │ +340 on the old vertex V, and n is the number of edges incident on │ │ │ │ +341 the vertex. │ │ │ │ +342 */ │ │ │ │ +343 │ │ │ │ +344 /* │ │ │ │ +345 Normal Vec; │ │ │ │ +346 VertexEdgeIter ve_itr; │ │ │ │ +347 double valence(0.0); │ │ │ │ +348 │ │ │ │ +349 // R = Calculate Valence and sum of edge midpoints │ │ │ │ +350 for ( ve_itr = _m.ve_iter( _vh); ve_itr; ++ve_itr) │ │ │ │ +351 { │ │ │ │ +352 valence+=1.0; │ │ │ │ +353 pos += _m.property(ep_pos_, *ve_itr); │ │ │ │ +354 } │ │ │ │ +355 pos /= valence*valence; │ │ │ │ +356 */ │ │ │ │ +357 │ │ │ │ +358 RealType valence(0.0); │ │ │ │ +359 VOHIter voh_it = _m.voh_iter( _vh ); │ │ │ │ +360 for( ; voh_it.is_valid(); ++voh_it ) │ │ │ │ +361 { │ │ │ │ +362 pos += _m.point( _m.to_vertex_handle( *voh_it ) ); │ │ │ │ +363 valence+=1.0; │ │ │ │ +364 } │ │ │ │ +365 pos /= valence*valence; │ │ │ │ +366 │ │ │ │ +367 VertexFaceIter vf_itr; │ │ │ │ +368 Point Q(0, 0, 0); │ │ │ │ +369 │ │ │ │ +370 for ( vf_itr = _m.vf_iter( _vh); vf_itr.is_valid(); ++vf_itr) //, │ │ │ │ +neigboring_faces += 1.0 ) │ │ │ │ +371 { │ │ │ │ +372 Q += _m.property(fp_pos_, *vf_itr); │ │ │ │ +373 } │ │ │ │ +374 │ │ │ │ +375 Q /= valence*valence;//neigboring_faces; │ │ │ │ +376 │ │ │ │ +377 pos += _m.point(_vh) * (valence - RealType(2.0) )/valence + Q; │ │ │ │ +378 // pos = vector_cast(_m.point(_vh)); │ │ │ │ +379 } │ │ │ │ +380 │ │ │ │ +381 _m.property( vp_pos_, _vh ) = pos; │ │ │ │ +382} │ │ │ │ +383 │ │ │ │ +384//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +385 │ │ │ │ +386// │ │ │ │ ============================================================================= │ │ │ │ -65#endif // OPENMESH_STORE_HH defined │ │ │ │ -66// │ │ │ │ +387} // END_NS_UNIFORM │ │ │ │ +388} // END_NS_SUBDIVIDER │ │ │ │ +389} // END_NS_OPENMESH │ │ │ │ +390// │ │ │ │ ============================================================================= │ │ │ │ -67 │ │ │ │ +_C_a_t_m_u_l_l_C_l_a_r_k_T_._h_h │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T │ │ │ │ +Based on code from Leon Kos, CAD lab, Mech.Eng., University of Ljubljana, │ │ │ │ +Slovenia (http://www.... │ │ │ │ +DDeeffiinniittiioonn CatmullClarkT.hh:86 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_M_e_s_h_C_h_e_c_k_e_r_T │ │ │ │ +Check integrity of mesh. │ │ │ │ +DDeeffiinniittiioonn MeshCheckerT.hh:74 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00524_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/OMFormatT_impl.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/ModifiedButterFlyT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OMFormatT_impl.hh
│ │ │ +
ModifiedButterFlyT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -136,214 +136,545 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#define OPENMESH_IO_OMFORMAT_CC
│ │ │ -
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
51//=============================================================================
│ │ │ +
52//
│ │ │ +
53// CLASS ModifiedButterflyT
│ │ │ +
54//
│ │ │ +
55//=============================================================================
│ │ │
56
│ │ │ -
57#include <OpenMesh/Core/IO/OMFormat.hh>
│ │ │ -
58#include <algorithm>
│ │ │ -
59#include <iomanip>
│ │ │ +
57
│ │ │ +
58#ifndef SP_MODIFIED_BUTTERFLY_H
│ │ │ +
59#define SP_MODIFIED_BUTTERFLY_H
│ │ │
60
│ │ │ -
61//== NAMESPACES ===============================================================
│ │ │ -
62
│ │ │ -
63namespace OpenMesh {
│ │ │ -
64namespace IO {
│ │ │ -
65
│ │ │ -
66 // helper to store a an integer
│ │ │ -
67 template< typename T >
│ │ │ -
68 size_t
│ │ │ -
69 store( std::ostream& _os,
│ │ │ -
70 const T& _val,
│ │ │ -
71 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
72 bool _swap,
│ │ │ -
73 t_signed)
│ │ │ -
74 {
│ │ │ -
75 assert( OMFormat::is_integer( _val ) );
│ │ │ -
76
│ │ │ -
77 switch( _b )
│ │ │ -
78 {
│ │ │ -
79 case OMFormat::Chunk::Integer_8:
│ │ │ -
80 {
│ │ │ -
81 OMFormat::int8 v = static_cast<OMFormat::int8>(_val);
│ │ │ -
82 return store( _os, v, _swap );
│ │ │ -
83 }
│ │ │ -
84 case OMFormat::Chunk::Integer_16:
│ │ │ -
85 {
│ │ │ -
86 OMFormat::int16 v = static_cast<OMFormat::int16>(_val);
│ │ │ -
87 return store( _os, v, _swap );
│ │ │ -
88 }
│ │ │ -
89 case OMFormat::Chunk::Integer_32:
│ │ │ -
90 {
│ │ │ -
91 OMFormat::int32 v = static_cast<OMFormat::int32>(_val);
│ │ │ -
92 return store( _os, v, _swap );
│ │ │ -
93 }
│ │ │ -
94 case OMFormat::Chunk::Integer_64:
│ │ │ -
95 {
│ │ │ -
96 OMFormat::int64 v = static_cast<OMFormat::int64>(_val);
│ │ │ -
97 return store( _os, v, _swap );
│ │ │ -
98 }
│ │ │ -
99 }
│ │ │ -
100 return 0;
│ │ │ -
101 }
│ │ │ + │ │ │ +
62#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ +
63#include <OpenMesh/Core/Utils/Property.hh>
│ │ │ +
64// -------------------- STL
│ │ │ +
65#include <vector>
│ │ │ +
66#if defined(OM_CC_MIPS)
│ │ │ +
67# include <math.h>
│ │ │ +
68#else
│ │ │ +
69# include <cmath>
│ │ │ +
70#endif
│ │ │ +
71
│ │ │ +
72
│ │ │ +
73//== NAMESPACE ================================================================
│ │ │ +
74
│ │ │ +
75namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
76namespace Subdivider { // BEGIN_NS_DECIMATER
│ │ │ +
77namespace Uniform { // BEGIN_NS_UNIFORM
│ │ │ +
78
│ │ │ +
79
│ │ │ +
80//== CLASS DEFINITION =========================================================
│ │ │ +
81
│ │ │ +
82
│ │ │ +
91template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
92class ModifiedButterflyT : public SubdividerT<MeshType, RealType>
│ │ │ +
93{
│ │ │ +
94public:
│ │ │ +
95
│ │ │ +
96 typedef RealType real_t;
│ │ │ +
97 typedef MeshType mesh_t;
│ │ │ + │ │ │ +
99
│ │ │ +
100 typedef std::vector< std::vector<real_t> > weights_t;
│ │ │ +
101 typedef std::vector<real_t> weight_t;
│ │ │
102
│ │ │ -
103
│ │ │ -
104 // helper to store a an unsigned integer
│ │ │ -
105 template< typename T >
│ │ │ -
106 size_t
│ │ │ -
107 store( std::ostream& _os,
│ │ │ -
108 const T& _val,
│ │ │ -
109 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
110 bool _swap,
│ │ │ -
111 t_unsigned)
│ │ │ -
112 {
│ │ │ -
113 assert( OMFormat::is_integer( _val ) );
│ │ │ -
114
│ │ │ -
115 switch( _b )
│ │ │ -
116 {
│ │ │ -
117 case OMFormat::Chunk::Integer_8:
│ │ │ -
118 {
│ │ │ -
119 OMFormat::uint8 v = static_cast<OMFormat::uint8>(_val);
│ │ │ -
120 return store( _os, v, _swap );
│ │ │ -
121 }
│ │ │ -
122 case OMFormat::Chunk::Integer_16:
│ │ │ -
123 {
│ │ │ -
124 OMFormat::uint16 v = static_cast<OMFormat::uint16>(_val);
│ │ │ -
125 return store( _os, v, _swap );
│ │ │ -
126 }
│ │ │ -
127 case OMFormat::Chunk::Integer_32:
│ │ │ -
128 {
│ │ │ -
129 OMFormat::uint32 v = static_cast<OMFormat::uint32>(_val);
│ │ │ -
130 return store( _os, v, _swap );
│ │ │ -
131 }
│ │ │ -
132
│ │ │ -
133 case OMFormat::Chunk::Integer_64:
│ │ │ -
134 {
│ │ │ -
135 OMFormat::uint64 v = static_cast<OMFormat::uint64>(_val);
│ │ │ -
136 return store( _os, v, _swap );
│ │ │ -
137 }
│ │ │ -
138 }
│ │ │ -
139 return 0;
│ │ │ -
140 }
│ │ │ +
103public:
│ │ │ +
104
│ │ │ +
105
│ │ │ + │ │ │ +
107 { init_weights(); }
│ │ │ +
108
│ │ │ +
109
│ │ │ +
110 explicit ModifiedButterflyT( mesh_t& _m) : parent_t(_m)
│ │ │ +
111 { init_weights(); }
│ │ │ +
112
│ │ │ +
113
│ │ │ + │ │ │ +
115
│ │ │ +
116
│ │ │ +
117public:
│ │ │ +
118
│ │ │ +
119
│ │ │ +
120 const char *name() const override { return "Uniform Spectral"; }
│ │ │ +
121
│ │ │ +
122
│ │ │ +
│ │ │ +
124 void init_weights(size_t _max_valence=30)
│ │ │ +
125 {
│ │ │ +
126 weights.resize(_max_valence);
│ │ │ +
127
│ │ │ +
128 //special case: K==3, K==4
│ │ │ +
129 weights[3].resize(4);
│ │ │ +
130 weights[3][0] = real_t(5.0)/12;
│ │ │ +
131 weights[3][1] = real_t(-1.0)/12;
│ │ │ +
132 weights[3][2] = real_t(-1.0)/12;
│ │ │ +
133 weights[3][3] = real_t(3.0)/4;
│ │ │ +
134
│ │ │ +
135 weights[4].resize(5);
│ │ │ +
136 weights[4][0] = real_t(3.0)/8;
│ │ │ +
137 weights[4][1] = 0;
│ │ │ +
138 weights[4][2] = real_t(-1.0)/8;
│ │ │ +
139 weights[4][3] = 0;
│ │ │ +
140 weights[4][4] = real_t(3.0)/4;
│ │ │
141
│ │ │ -
142
│ │ │ -
143 // helper to restore a an integer
│ │ │ -
144 template< typename T >
│ │ │ -
145 size_t
│ │ │ -
146 restore( std::istream& _is,
│ │ │ -
147 T& _val,
│ │ │ -
148 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
149 bool _swap,
│ │ │ -
150 t_signed)
│ │ │ -
151 {
│ │ │ -
152 assert( OMFormat::is_integer( _val ) );
│ │ │ -
153 size_t bytes = 0;
│ │ │ -
154
│ │ │ -
155 switch( _b )
│ │ │ -
156 {
│ │ │ -
157 case OMFormat::Chunk::Integer_8:
│ │ │ -
158 {
│ │ │ -
159 OMFormat::int8 v;
│ │ │ -
160 bytes = restore( _is, v, _swap );
│ │ │ -
161 _val = static_cast<T>(v);
│ │ │ -
162 break;
│ │ │ -
163 }
│ │ │ -
164 case OMFormat::Chunk::Integer_16:
│ │ │ -
165 {
│ │ │ -
166 OMFormat::int16 v;
│ │ │ -
167 bytes = restore( _is, v, _swap );
│ │ │ -
168 _val = static_cast<T>(v);
│ │ │ -
169 break;
│ │ │ -
170 }
│ │ │ -
171 case OMFormat::Chunk::Integer_32:
│ │ │ -
172 {
│ │ │ -
173 OMFormat::int32 v;
│ │ │ -
174 bytes = restore( _is, v, _swap );
│ │ │ -
175 _val = static_cast<T>(v);
│ │ │ -
176 break;
│ │ │ -
177 }
│ │ │ -
178 case OMFormat::Chunk::Integer_64:
│ │ │ -
179 {
│ │ │ -
180 OMFormat::int64 v;
│ │ │ -
181 bytes = restore( _is, v, _swap );
│ │ │ -
182 _val = static_cast<T>(v);
│ │ │ -
183 break;
│ │ │ -
184 }
│ │ │ -
185 }
│ │ │ -
186 return bytes;
│ │ │ -
187 }
│ │ │ -
188
│ │ │ -
189
│ │ │ -
190 // helper to restore a an unsigned integer
│ │ │ -
191 template< typename T >
│ │ │ -
192 size_t
│ │ │ -
193 restore( std::istream& _is,
│ │ │ -
194 T& _val,
│ │ │ -
195 OMFormat::Chunk::Integer_Size _b,
│ │ │ -
196 bool _swap,
│ │ │ -
197 t_unsigned)
│ │ │ -
198 {
│ │ │ -
199 assert( OMFormat::is_integer( _val ) );
│ │ │ -
200 size_t bytes = 0;
│ │ │ -
201
│ │ │ -
202 switch( _b )
│ │ │ -
203 {
│ │ │ -
204 case OMFormat::Chunk::Integer_8:
│ │ │ -
205 {
│ │ │ -
206 OMFormat::uint8 v;
│ │ │ -
207 bytes = restore( _is, v, _swap );
│ │ │ -
208 _val = static_cast<T>(v);
│ │ │ -
209 break;
│ │ │ -
210 }
│ │ │ -
211 case OMFormat::Chunk::Integer_16:
│ │ │ -
212 {
│ │ │ -
213 OMFormat::uint16 v;
│ │ │ -
214 bytes = restore( _is, v, _swap );
│ │ │ -
215 _val = static_cast<T>(v);
│ │ │ -
216 break;
│ │ │ -
217 }
│ │ │ -
218 case OMFormat::Chunk::Integer_32:
│ │ │ -
219 {
│ │ │ -
220 OMFormat::uint32 v;
│ │ │ -
221 bytes = restore( _is, v, _swap );
│ │ │ -
222 _val = static_cast<T>(v);
│ │ │ -
223 break;
│ │ │ -
224 }
│ │ │ -
225
│ │ │ -
226 case OMFormat::Chunk::Integer_64:
│ │ │ -
227 {
│ │ │ -
228 OMFormat::uint64 v;
│ │ │ -
229 bytes = restore( _is, v, _swap );
│ │ │ -
230 _val = static_cast<T>(v);
│ │ │ -
231 break;
│ │ │ -
232 }
│ │ │ -
233 }
│ │ │ -
234 return bytes;
│ │ │ -
235 }
│ │ │ -
236
│ │ │ -
237//=============================================================================
│ │ │ -
238} // namespace IO
│ │ │ -
239} // namespace OpenMesh
│ │ │ -
240//=============================================================================
│ │ │ +
142 for(unsigned int K = 5; K<_max_valence; ++K)
│ │ │ +
143 {
│ │ │ +
144 weights[K].resize(K+1);
│ │ │ +
145 // s(j) = ( 1/4 + cos(2*pi*j/K) + 1/2 * cos(4*pi*j/K) )/K
│ │ │ +
146 double invK = 1.0/static_cast<double>(K);
│ │ │ +
147 real_t sum = 0;
│ │ │ +
148 for(unsigned int j=0; j<K; ++j)
│ │ │ +
149 {
│ │ │ +
150 weights[K][j] = static_cast<real_t>((0.25 + cos(2.0*M_PI*static_cast<double>(j)*invK) + 0.5*cos(4.0*M_PI*static_cast<double>(j)*invK))*invK);
│ │ │ +
151 sum += weights[K][j];
│ │ │ +
152 }
│ │ │ +
153 weights[K][K] = static_cast<real_t>(1.0) - sum;
│ │ │ +
154 }
│ │ │ +
155 }
│ │ │ +
│ │ │ +
156
│ │ │ +
157
│ │ │ +
158protected:
│ │ │ +
159
│ │ │ +
160
│ │ │ +
│ │ │ +
161 bool prepare( mesh_t& _m ) override
│ │ │ +
162 {
│ │ │ +
163 _m.add_property( vp_pos_ );
│ │ │ +
164 _m.add_property( ep_pos_ );
│ │ │ +
165 return true;
│ │ │ +
166 }
│ │ │ +
│ │ │ +
167
│ │ │ +
168
│ │ │ +
│ │ │ +
169 bool cleanup( mesh_t& _m ) override
│ │ │ +
170 {
│ │ │ +
171 _m.remove_property( vp_pos_ );
│ │ │ +
172 _m.remove_property( ep_pos_ );
│ │ │ +
173 return true;
│ │ │ +
174 }
│ │ │ +
│ │ │ +
175
│ │ │ +
176
│ │ │ +
│ │ │ +
177 bool subdivide( MeshType& _m, size_t _n , const bool _update_points = true) override
│ │ │ +
178 {
│ │ │ +
179
│ │ │ +
181
│ │ │ +
182 // Compute the maximal vertex valence in the mesh
│ │ │ +
183 unsigned int maxValence = 0;
│ │ │ +
184 for ( auto vertex : _m.vertices() ) {
│ │ │ +
185 maxValence = std::max(maxValence,_m.valence(vertex));
│ │ │ +
186 }
│ │ │ +
187
│ │ │ +
188 // We pre initialized with 30. If it's larger, we update the weights
│ │ │ +
189 if (maxValence >= 30) {
│ │ │ +
190 init_weights( maxValence + 1 );
│ │ │ +
191 }
│ │ │ +
192
│ │ │ +
193 // Do _n subdivisions
│ │ │ +
194 for (size_t i=0; i < _n; ++i)
│ │ │ +
195 {
│ │ │ +
196
│ │ │ +
197 // This is an interpolating scheme, old vertices remain the same.
│ │ │ +
198 for ( auto vh : _m.vertices())
│ │ │ +
199 _m.property( vp_pos_, vh ) = _m.point(vh);
│ │ │ +
200
│ │ │ +
201 // Compute position for new vertices and store them in the edge property
│ │ │ +
202 for (auto eh : _m.edges())
│ │ │ +
203 compute_midpoint( _m, eh);
│ │ │ +
204
│ │ │ +
205
│ │ │ +
206 // Split each edge at midpoint and store precomputed positions (stored in
│ │ │ +
207 // edge property ep_pos_) in the vertex property vp_pos_;
│ │ │ +
208
│ │ │ +
209 // Attention! Creating new edges, hence make sure the loop ends correctly.
│ │ │ +
210 for (auto eh : _m.edges())
│ │ │ +
211 split_edge(_m, eh );
│ │ │ +
212
│ │ │ +
213
│ │ │ +
214 // Commit changes in topology and reconsitute consistency
│ │ │ +
215
│ │ │ +
216 // Attention! Creating new faces, hence make sure the loop ends correctly.
│ │ │ +
217 for (auto fh : _m.faces())
│ │ │ +
218 split_face(_m, fh );
│ │ │ +
219
│ │ │ +
220
│ │ │ +
221 // Commit changes in geometry
│ │ │ +
222 for ( auto vh : _m.vertices())
│ │ │ +
223 _m.set_point(vh, _m.property( vp_pos_, vh ) );
│ │ │ +
224
│ │ │ +
225#if defined(_DEBUG) || defined(DEBUG)
│ │ │ +
226 // Now we have an consistent mesh!
│ │ │ +
227 assert( OpenMesh::Utils::MeshCheckerT<mesh_t>(_m).check() );
│ │ │ +
228#endif
│ │ │ +
229 }
│ │ │ +
230
│ │ │ +
231 return true;
│ │ │ +
232 }
│ │ │ +
│ │ │ +
233
│ │ │ +
234private: // topological modifiers
│ │ │ +
235
│ │ │ +
236 void split_face(mesh_t& _m, const typename mesh_t::FaceHandle& _fh)
│ │ │ +
237 {
│ │ │ + │ │ │ +
239 heh1(_m.halfedge_handle(_fh)),
│ │ │ +
240 heh2(_m.next_halfedge_handle(_m.next_halfedge_handle(heh1))),
│ │ │ +
241 heh3(_m.next_halfedge_handle(_m.next_halfedge_handle(heh2)));
│ │ │ +
242
│ │ │ +
243 // Cutting off every corner of the 6_gon
│ │ │ +
244 corner_cutting( _m, heh1 );
│ │ │ +
245 corner_cutting( _m, heh2 );
│ │ │ +
246 corner_cutting( _m, heh3 );
│ │ │ +
247 }
│ │ │ +
248
│ │ │ +
249
│ │ │ +
250 void corner_cutting(mesh_t& _m, const typename mesh_t::HalfedgeHandle& _he)
│ │ │ +
251 {
│ │ │ +
252 // Define Halfedge Handles
│ │ │ + │ │ │ +
254 heh1(_he),
│ │ │ +
255 heh5(heh1),
│ │ │ +
256 heh6(_m.next_halfedge_handle(heh1));
│ │ │ +
257
│ │ │ +
258 // Cycle around the polygon to find correct Halfedge
│ │ │ +
259 for (; _m.next_halfedge_handle(_m.next_halfedge_handle(heh5)) != heh1;
│ │ │ +
260 heh5 = _m.next_halfedge_handle(heh5))
│ │ │ +
261 {}
│ │ │ +
262
│ │ │ +
263 typename mesh_t::VertexHandle
│ │ │ +
264 vh1 = _m.to_vertex_handle(heh1),
│ │ │ +
265 vh2 = _m.to_vertex_handle(heh5);
│ │ │ +
266
│ │ │ + │ │ │ +
268 heh2(_m.next_halfedge_handle(heh5)),
│ │ │ +
269 heh3(_m.new_edge( vh1, vh2)),
│ │ │ +
270 heh4(_m.opposite_halfedge_handle(heh3));
│ │ │ +
271
│ │ │ +
272 /* Intermediate result
│ │ │ +
273 *
│ │ │ +
274 * *
│ │ │ +
275 * 5 /|\
│ │ │ +
276 * /_ \
│ │ │ +
277 * vh2> * *
│ │ │ +
278 * /|\3 |\
│ │ │ +
279 * /_ \|4 \
│ │ │ +
280 * *----\*----\*
│ │ │ +
281 * 1 ^ 6
│ │ │ +
282 * vh1 (adjust_outgoing halfedge!)
│ │ │ +
283 */
│ │ │ +
284
│ │ │ +
285 // Old and new Face
│ │ │ +
286 typename mesh_t::FaceHandle fh_old(_m.face_handle(heh6));
│ │ │ +
287 typename mesh_t::FaceHandle fh_new(_m.new_face());
│ │ │ +
288
│ │ │ +
289
│ │ │ +
290 // Re-Set Handles around old Face
│ │ │ +
291 _m.set_next_halfedge_handle(heh4, heh6);
│ │ │ +
292 _m.set_next_halfedge_handle(heh5, heh4);
│ │ │ +
293
│ │ │ +
294 _m.set_face_handle(heh4, fh_old);
│ │ │ +
295 _m.set_face_handle(heh5, fh_old);
│ │ │ +
296 _m.set_face_handle(heh6, fh_old);
│ │ │ +
297 _m.set_halfedge_handle(fh_old, heh4);
│ │ │ +
298
│ │ │ +
299 // Re-Set Handles around new Face
│ │ │ +
300 _m.set_next_halfedge_handle(heh1, heh3);
│ │ │ +
301 _m.set_next_halfedge_handle(heh3, heh2);
│ │ │ +
302
│ │ │ +
303 _m.set_face_handle(heh1, fh_new);
│ │ │ +
304 _m.set_face_handle(heh2, fh_new);
│ │ │ +
305 _m.set_face_handle(heh3, fh_new);
│ │ │ +
306
│ │ │ +
307 _m.set_halfedge_handle(fh_new, heh1);
│ │ │ +
308 }
│ │ │ +
309
│ │ │ +
310
│ │ │ +
311 void split_edge(mesh_t& _m, const typename mesh_t::EdgeHandle& _eh)
│ │ │ +
312 {
│ │ │ + │ │ │ +
314 heh = _m.halfedge_handle(_eh, 0),
│ │ │ +
315 opp_heh = _m.halfedge_handle(_eh, 1);
│ │ │ +
316
│ │ │ +
317 typename mesh_t::HalfedgeHandle new_heh, opp_new_heh, t_heh;
│ │ │ +
318 typename mesh_t::VertexHandle vh;
│ │ │ +
319 typename mesh_t::VertexHandle vh1(_m.to_vertex_handle(heh));
│ │ │ +
320 typename mesh_t::Point zero(0,0,0);
│ │ │ +
321
│ │ │ +
322 // new vertex
│ │ │ +
323 vh = _m.new_vertex( zero );
│ │ │ +
324
│ │ │ +
325 // memorize position, will be set later
│ │ │ +
326 _m.property( vp_pos_, vh ) = _m.property( ep_pos_, _eh );
│ │ │ +
327
│ │ │ +
328
│ │ │ +
329 // Re-link mesh entities
│ │ │ +
330 if (_m.is_boundary(_eh))
│ │ │ +
331 {
│ │ │ +
332 for (t_heh = heh;
│ │ │ +
333 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
334 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh)))
│ │ │ +
335 {}
│ │ │ +
336 }
│ │ │ +
337 else
│ │ │ +
338 {
│ │ │ +
339 for (t_heh = _m.next_halfedge_handle(opp_heh);
│ │ │ +
340 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
341 t_heh = _m.next_halfedge_handle(t_heh) )
│ │ │ +
342 {}
│ │ │ +
343 }
│ │ │ +
344
│ │ │ +
345 new_heh = _m.new_edge(vh, vh1);
│ │ │ +
346 opp_new_heh = _m.opposite_halfedge_handle(new_heh);
│ │ │ +
347 _m.set_vertex_handle( heh, vh );
│ │ │ +
348
│ │ │ +
349 _m.set_next_halfedge_handle(t_heh, opp_new_heh);
│ │ │ +
350 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh));
│ │ │ +
351 _m.set_next_halfedge_handle(heh, new_heh);
│ │ │ +
352 _m.set_next_halfedge_handle(opp_new_heh, opp_heh);
│ │ │ +
353
│ │ │ +
354 if (_m.face_handle(opp_heh).is_valid())
│ │ │ +
355 {
│ │ │ +
356 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh));
│ │ │ +
357 _m.set_halfedge_handle(_m.face_handle(opp_new_heh), opp_new_heh);
│ │ │ +
358 }
│ │ │ +
359
│ │ │ +
360 _m.set_face_handle( new_heh, _m.face_handle(heh) );
│ │ │ +
361 _m.set_halfedge_handle( vh, new_heh);
│ │ │ +
362
│ │ │ +
363 // We cant reconnect a non existing face, so we skip this here if necessary
│ │ │ +
364 if ( !_m.is_boundary(heh) )
│ │ │ +
365 _m.set_halfedge_handle( _m.face_handle(heh), heh );
│ │ │ +
366
│ │ │ +
367 _m.set_halfedge_handle( vh1, opp_new_heh );
│ │ │ +
368
│ │ │ +
369 // Never forget this, when playing with the topology
│ │ │ +
370 _m.adjust_outgoing_halfedge( vh );
│ │ │ +
371 _m.adjust_outgoing_halfedge( vh1 );
│ │ │ +
372 }
│ │ │ +
373
│ │ │ +
374private: // geometry helper
│ │ │ +
375
│ │ │ +
376 void compute_midpoint(mesh_t& _m, const typename mesh_t::EdgeHandle& _eh)
│ │ │ +
377 {
│ │ │ +
378 typename mesh_t::HalfedgeHandle heh, opp_heh;
│ │ │ +
379
│ │ │ +
380 heh = _m.halfedge_handle( _eh, 0);
│ │ │ +
381 opp_heh = _m.halfedge_handle( _eh, 1);
│ │ │ +
382
│ │ │ +
383 typename mesh_t::Point pos(0,0,0);
│ │ │ +
384
│ │ │ +
385 typename mesh_t::VertexHandle a_0(_m.to_vertex_handle(heh));
│ │ │ +
386 typename mesh_t::VertexHandle a_1(_m.to_vertex_handle(opp_heh));
│ │ │ +
387
│ │ │ +
388 // boundary edge: 4-point scheme
│ │ │ +
389 if (_m.is_boundary(_eh) )
│ │ │ +
390 {
│ │ │ +
391 pos = _m.point(a_0);
│ │ │ +
392 pos += _m.point(a_1);
│ │ │ +
393 pos *= static_cast<RealType>(9.0/16.0);
│ │ │ +
394 typename mesh_t::Point tpos;
│ │ │ +
395 if(_m.is_boundary(heh))
│ │ │ +
396 {
│ │ │ +
397 tpos = _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
398 tpos += _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh))));
│ │ │ +
399 }
│ │ │ +
400 else
│ │ │ +
401 {
│ │ │ +
402 assert(_m.is_boundary(opp_heh));
│ │ │ +
403 tpos = _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(opp_heh)));
│ │ │ +
404 tpos += _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(opp_heh))));
│ │ │ +
405 }
│ │ │ +
406 tpos *= static_cast<RealType>(-1.0/16.0);
│ │ │ +
407 pos += tpos;
│ │ │ +
408 }
│ │ │ +
409 else
│ │ │ +
410 {
│ │ │ +
411 int valence_a_0 = _m.valence(a_0);
│ │ │ +
412 int valence_a_1 = _m.valence(a_1);
│ │ │ +
413 assert(valence_a_0>2);
│ │ │ +
414 assert(valence_a_1>2);
│ │ │ +
415
│ │ │ +
416 if( (valence_a_0==6 && valence_a_1==6) || (_m.is_boundary(a_0) && valence_a_1==6) || (_m.is_boundary(a_1) && valence_a_0==6) || (_m.is_boundary(a_0) && _m.is_boundary(a_1)) )// use 8-point scheme
│ │ │ +
417 {
│ │ │ +
418 real_t alpha = real_t(1.0/2);
│ │ │ +
419 real_t beta = real_t(1.0/8);
│ │ │ +
420 real_t gamma = real_t(-1.0/16);
│ │ │ +
421
│ │ │ +
422 //get points
│ │ │ +
423 typename mesh_t::VertexHandle b_0, b_1, c_0, c_1, c_2, c_3;
│ │ │ +
424 typename mesh_t::HalfedgeHandle t_he;
│ │ │ +
425
│ │ │ +
426 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(heh));
│ │ │ +
427 b_0 = _m.to_vertex_handle(t_he);
│ │ │ +
428 if(!_m.is_boundary(_m.opposite_halfedge_handle(t_he)))
│ │ │ +
429 {
│ │ │ +
430 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(t_he));
│ │ │ +
431 c_0 = _m.to_vertex_handle(t_he);
│ │ │ +
432 }
│ │ │ +
433
│ │ │ +
434 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh));
│ │ │ +
435 b_1 = _m.to_vertex_handle(t_he);
│ │ │ +
436 if(!_m.is_boundary(t_he))
│ │ │ +
437 {
│ │ │ +
438 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(t_he));
│ │ │ +
439 c_1 = _m.to_vertex_handle(t_he);
│ │ │ +
440 }
│ │ │ +
441
│ │ │ +
442 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(opp_heh));
│ │ │ +
443 assert(b_1.idx()==_m.to_vertex_handle(t_he).idx());
│ │ │ +
444 if(!_m.is_boundary(_m.opposite_halfedge_handle(t_he)))
│ │ │ +
445 {
│ │ │ +
446 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(t_he));
│ │ │ +
447 c_2 = _m.to_vertex_handle(t_he);
│ │ │ +
448 }
│ │ │ +
449
│ │ │ +
450 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(opp_heh));
│ │ │ +
451 assert(b_0==_m.to_vertex_handle(t_he));
│ │ │ +
452 if(!_m.is_boundary(t_he))
│ │ │ +
453 {
│ │ │ +
454 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(t_he));
│ │ │ +
455 c_3 = _m.to_vertex_handle(t_he);
│ │ │ +
456 }
│ │ │ +
457
│ │ │ +
458 //compute position.
│ │ │ +
459 //a0,a1,b0,b1 must exist.
│ │ │ +
460 assert(a_0.is_valid());
│ │ │ +
461 assert(a_1.is_valid());
│ │ │ +
462 assert(b_0.is_valid());
│ │ │ +
463 assert(b_1.is_valid());
│ │ │ +
464 //The other vertices may be created from symmetry is they are on the other side of the boundary.
│ │ │ +
465
│ │ │ +
466 pos = _m.point(a_0);
│ │ │ +
467 pos += _m.point(a_1);
│ │ │ +
468 pos *= alpha;
│ │ │ +
469
│ │ │ +
470 typename mesh_t::Point tpos ( _m.point(b_0) );
│ │ │ +
471 tpos += _m.point(b_1);
│ │ │ +
472 tpos *= beta;
│ │ │ +
473 pos += tpos;
│ │ │ +
474
│ │ │ +
475 typename mesh_t::Point pc_0, pc_1, pc_2, pc_3;
│ │ │ +
476 if(c_0.is_valid())
│ │ │ +
477 pc_0 = _m.point(c_0);
│ │ │ +
478 else //create the point by symmetry
│ │ │ +
479 {
│ │ │ +
480 pc_0 = _m.point(a_1) + _m.point(b_0) - _m.point(a_0);
│ │ │ +
481 }
│ │ │ +
482 if(c_1.is_valid())
│ │ │ +
483 pc_1 = _m.point(c_1);
│ │ │ +
484 else //create the point by symmetry
│ │ │ +
485 {
│ │ │ +
486 pc_1 = _m.point(a_1) + _m.point(b_1) - _m.point(a_0);
│ │ │ +
487 }
│ │ │ +
488 if(c_2.is_valid())
│ │ │ +
489 pc_2 = _m.point(c_2);
│ │ │ +
490 else //create the point by symmetry
│ │ │ +
491 {
│ │ │ +
492 pc_2 = _m.point(a_0) + _m.point(b_1) - _m.point(a_1);
│ │ │ +
493 }
│ │ │ +
494 if(c_3.is_valid())
│ │ │ +
495 pc_3 = _m.point(c_3);
│ │ │ +
496 else //create the point by symmetry
│ │ │ +
497 {
│ │ │ +
498 pc_3 = _m.point(a_0) + _m.point(b_0) - _m.point(a_1);
│ │ │ +
499 }
│ │ │ +
500 tpos = pc_0;
│ │ │ +
501 tpos += pc_1;
│ │ │ +
502 tpos += pc_2;
│ │ │ +
503 tpos += pc_3;
│ │ │ +
504 tpos *= gamma;
│ │ │ +
505 pos += tpos;
│ │ │ +
506 }
│ │ │ +
507 else //at least one endpoint is [irregular and not in boundary]
│ │ │ +
508 {
│ │ │ +
509 RealType normFactor = static_cast<RealType>(0.0);
│ │ │ +
510
│ │ │ +
511 if(valence_a_0!=6 && !_m.is_boundary(a_0))
│ │ │ +
512 {
│ │ │ +
513 assert((int)weights[valence_a_0].size()==valence_a_0+1);
│ │ │ +
514 typename mesh_t::HalfedgeHandle t_he = opp_heh;
│ │ │ +
515 for(int i = 0; i < valence_a_0 ; t_he=_m.next_halfedge_handle(_m.opposite_halfedge_handle(t_he)), ++i)
│ │ │ +
516 {
│ │ │ +
517 pos += weights[valence_a_0][i] * _m.point(_m.to_vertex_handle(t_he));
│ │ │ +
518 }
│ │ │ +
519 assert(t_he==opp_heh);
│ │ │ +
520
│ │ │ +
521 //add irregular vertex:
│ │ │ +
522 pos += weights[valence_a_0][valence_a_0] * _m.point(a_0);
│ │ │ +
523 ++normFactor;
│ │ │ +
524 }
│ │ │ +
525
│ │ │ +
526 if(valence_a_1!=6 && !_m.is_boundary(a_1))
│ │ │ +
527 {
│ │ │ +
528 assert((int)weights[valence_a_1].size()==valence_a_1+1);
│ │ │ +
529 typename mesh_t::HalfedgeHandle t_he = heh;
│ │ │ +
530 for(int i = 0; i < valence_a_1 ; t_he=_m.next_halfedge_handle(_m.opposite_halfedge_handle(t_he)), ++i)
│ │ │ +
531 {
│ │ │ +
532 pos += weights[valence_a_1][i] * _m.point(_m.to_vertex_handle(t_he));
│ │ │ +
533 }
│ │ │ +
534 assert(t_he==heh);
│ │ │ +
535 //add irregular vertex:
│ │ │ +
536 pos += weights[valence_a_1][valence_a_1] * _m.point(a_1);
│ │ │ +
537 ++normFactor;
│ │ │ +
538 }
│ │ │ +
539
│ │ │ +
540 assert(normFactor>0.1); //normFactor should be 1 or 2
│ │ │ +
541
│ │ │ +
542 //if both vertices are irregular, average positions:
│ │ │ +
543 pos /= normFactor;
│ │ │ +
544 }
│ │ │ +
545 }
│ │ │ +
546 _m.property( ep_pos_, _eh ) = pos;
│ │ │ +
547 }
│ │ │ +
548
│ │ │ +
549private: // data
│ │ │ +
550
│ │ │ + │ │ │ + │ │ │ +
553
│ │ │ +
554 weights_t weights;
│ │ │ +
555
│ │ │ +
556};
│ │ │ +
│ │ │ +
557
│ │ │ +
558} // END_NS_UNIFORM
│ │ │ +
559} // END_NS_SUBDIVIDER
│ │ │ +
560} // END_NS_OPENMESH
│ │ │ +
561#endif
│ │ │ +
562
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
SmartVertexHandle new_vertex()
Uses default copy and assignment operator.
Definition PolyMeshT.hh:201
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ + │ │ │ + │ │ │ +
Modified Butterfly subdivision algorithm.
Definition ModifiedButterFlyT.hh:93
│ │ │ +
const char * name() const override
Return name of subdivision algorithm.
Definition ModifiedButterFlyT.hh:120
│ │ │ +
bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true) override
Subdivide mesh _m _n times.
Definition ModifiedButterFlyT.hh:177
│ │ │ +
void init_weights(size_t _max_valence=30)
Pre-compute weights.
Definition ModifiedButterFlyT.hh:124
│ │ │ +
bool cleanup(mesh_t &_m) override
Cleanup mesh after usage, e.g. remove added properties.
Definition ModifiedButterFlyT.hh:169
│ │ │ +
bool prepare(mesh_t &_m) override
Prepare mesh, e.g.
Definition ModifiedButterFlyT.hh:161
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │ +
Check integrity of mesh.
Definition MeshCheckerT.hh:74
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OMFormatT_impl.hh │ │ │ │ +ModifiedButterFlyT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,219 +46,590 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ +51// │ │ │ │ ============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ +52// │ │ │ │ +53// CLASS ModifiedButterflyT │ │ │ │ +54// │ │ │ │ +55// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#define OPENMESH_IO_OMFORMAT_CC │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ +57 │ │ │ │ +58#ifndef SP_MODIFIED_BUTTERFLY_H │ │ │ │ +59#define SP_MODIFIED_BUTTERFLY_H │ │ │ │ 60 │ │ │ │ -61//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -62 │ │ │ │ -63namespace _O_p_e_n_M_e_s_h { │ │ │ │ -64namespace IO { │ │ │ │ -65 │ │ │ │ -66 // helper to store a an integer │ │ │ │ -67 template< typename T > │ │ │ │ -68 size_t │ │ │ │ -69 store( std::ostream& _os, │ │ │ │ -70 const T& _val, │ │ │ │ -71 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -72 bool _swap, │ │ │ │ -73 t_signed) │ │ │ │ -74 { │ │ │ │ -75 assert( OMFormat::is_integer( _val ) ); │ │ │ │ -76 │ │ │ │ -77 switch( _b ) │ │ │ │ -78 { │ │ │ │ -79 case OMFormat::Chunk::Integer_8: │ │ │ │ -80 { │ │ │ │ -81 OMFormat::int8 v = static_cast(_val); │ │ │ │ -82 return store( _os, v, _swap ); │ │ │ │ -83 } │ │ │ │ -84 case OMFormat::Chunk::Integer_16: │ │ │ │ -85 { │ │ │ │ -86 OMFormat::int16 v = static_cast(_val); │ │ │ │ -87 return store( _os, v, _swap ); │ │ │ │ -88 } │ │ │ │ -89 case OMFormat::Chunk::Integer_32: │ │ │ │ -90 { │ │ │ │ -91 OMFormat::int32 v = static_cast(_val); │ │ │ │ -92 return store( _os, v, _swap ); │ │ │ │ -93 } │ │ │ │ -94 case OMFormat::Chunk::Integer_64: │ │ │ │ -95 { │ │ │ │ -96 OMFormat::int64 v = static_cast(_val); │ │ │ │ -97 return store( _os, v, _swap ); │ │ │ │ -98 } │ │ │ │ -99 } │ │ │ │ -100 return 0; │ │ │ │ -101 } │ │ │ │ +61#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ +62#include │ │ │ │ +63#include │ │ │ │ +64// -------------------- STL │ │ │ │ +65#include │ │ │ │ +66#if defined(OM_CC_MIPS) │ │ │ │ +67# include │ │ │ │ +68#else │ │ │ │ +69# include │ │ │ │ +70#endif │ │ │ │ +71 │ │ │ │ +72 │ │ │ │ +73//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ +74 │ │ │ │ +75namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +76namespace Subdivider { // BEGIN_NS_DECIMATER │ │ │ │ +77namespace Uniform { // BEGIN_NS_UNIFORM │ │ │ │ +78 │ │ │ │ +79 │ │ │ │ +80//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +81 │ │ │ │ +82 │ │ │ │ +91template │ │ │ │ +_9_2class _M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T : public _S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +93{ │ │ │ │ +94public: │ │ │ │ +95 │ │ │ │ +96 typedef RealType real_t; │ │ │ │ +97 typedef MeshType mesh_t; │ │ │ │ +98 typedef _S_u_b_d_i_v_i_d_e_r_T_<_ _m_e_s_h___t_,_ _r_e_a_l___t_ _> _p_a_r_e_n_t___t; │ │ │ │ +99 │ │ │ │ +100 typedef std::vector< std::vector > weights_t; │ │ │ │ +101 typedef std::vector weight_t; │ │ │ │ 102 │ │ │ │ -103 │ │ │ │ -104 // helper to store a an unsigned integer │ │ │ │ -105 template< typename T > │ │ │ │ -106 size_t │ │ │ │ -107 store( std::ostream& _os, │ │ │ │ -108 const T& _val, │ │ │ │ -109 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -110 bool _swap, │ │ │ │ -111 t_unsigned) │ │ │ │ -112 { │ │ │ │ -113 assert( OMFormat::is_integer( _val ) ); │ │ │ │ -114 │ │ │ │ -115 switch( _b ) │ │ │ │ -116 { │ │ │ │ -117 case OMFormat::Chunk::Integer_8: │ │ │ │ -118 { │ │ │ │ -119 OMFormat::uint8 v = static_cast(_val); │ │ │ │ -120 return store( _os, v, _swap ); │ │ │ │ -121 } │ │ │ │ -122 case OMFormat::Chunk::Integer_16: │ │ │ │ -123 { │ │ │ │ -124 OMFormat::uint16 v = static_cast(_val); │ │ │ │ -125 return store( _os, v, _swap ); │ │ │ │ -126 } │ │ │ │ -127 case OMFormat::Chunk::Integer_32: │ │ │ │ -128 { │ │ │ │ -129 OMFormat::uint32 v = static_cast(_val); │ │ │ │ -130 return store( _os, v, _swap ); │ │ │ │ -131 } │ │ │ │ -132 │ │ │ │ -133 case OMFormat::Chunk::Integer_64: │ │ │ │ -134 { │ │ │ │ -135 OMFormat::uint64 v = static_cast(_val); │ │ │ │ -136 return store( _os, v, _swap ); │ │ │ │ -137 } │ │ │ │ -138 } │ │ │ │ -139 return 0; │ │ │ │ -140 } │ │ │ │ +103public: │ │ │ │ +104 │ │ │ │ +105 │ │ │ │ +106 _M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T() : _p_a_r_e_n_t___t() │ │ │ │ +107 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +108 │ │ │ │ +109 │ │ │ │ +110 explicit _M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T( mesh_t& _m) : _p_a_r_e_n_t___t(_m) │ │ │ │ +111 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +112 │ │ │ │ +113 │ │ │ │ +114 _~_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T() {} │ │ │ │ +115 │ │ │ │ +116 │ │ │ │ +117public: │ │ │ │ +118 │ │ │ │ +119 │ │ │ │ +_1_2_0 const char *_n_a_m_e() const override { return "Uniform Spectral"; } │ │ │ │ +121 │ │ │ │ +122 │ │ │ │ +_1_2_4 void _i_n_i_t___w_e_i_g_h_t_s(size_t _max_valence=30) │ │ │ │ +125 { │ │ │ │ +126 weights.resize(_max_valence); │ │ │ │ +127 │ │ │ │ +128 //special case: K==3, K==4 │ │ │ │ +129 weights[3].resize(4); │ │ │ │ +130 weights[3][0] = real_t(5.0)/12; │ │ │ │ +131 weights[3][1] = real_t(-1.0)/12; │ │ │ │ +132 weights[3][2] = real_t(-1.0)/12; │ │ │ │ +133 weights[3][3] = real_t(3.0)/4; │ │ │ │ +134 │ │ │ │ +135 weights[4].resize(5); │ │ │ │ +136 weights[4][0] = real_t(3.0)/8; │ │ │ │ +137 weights[4][1] = 0; │ │ │ │ +138 weights[4][2] = real_t(-1.0)/8; │ │ │ │ +139 weights[4][3] = 0; │ │ │ │ +140 weights[4][4] = real_t(3.0)/4; │ │ │ │ 141 │ │ │ │ -142 │ │ │ │ -143 // helper to restore a an integer │ │ │ │ -144 template< typename T > │ │ │ │ -145 size_t │ │ │ │ -146 restore( std::istream& _is, │ │ │ │ -147 T& _val, │ │ │ │ -148 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -149 bool _swap, │ │ │ │ -150 t_signed) │ │ │ │ -151 { │ │ │ │ -152 assert( OMFormat::is_integer( _val ) ); │ │ │ │ -153 size_t bytes = 0; │ │ │ │ -154 │ │ │ │ -155 switch( _b ) │ │ │ │ -156 { │ │ │ │ -157 case OMFormat::Chunk::Integer_8: │ │ │ │ -158 { │ │ │ │ -159 OMFormat::int8 v; │ │ │ │ -160 bytes = restore( _is, v, _swap ); │ │ │ │ -161 _val = static_cast(v); │ │ │ │ -162 break; │ │ │ │ -163 } │ │ │ │ -164 case OMFormat::Chunk::Integer_16: │ │ │ │ -165 { │ │ │ │ -166 OMFormat::int16 v; │ │ │ │ -167 bytes = restore( _is, v, _swap ); │ │ │ │ -168 _val = static_cast(v); │ │ │ │ -169 break; │ │ │ │ -170 } │ │ │ │ -171 case OMFormat::Chunk::Integer_32: │ │ │ │ -172 { │ │ │ │ -173 OMFormat::int32 v; │ │ │ │ -174 bytes = restore( _is, v, _swap ); │ │ │ │ -175 _val = static_cast(v); │ │ │ │ -176 break; │ │ │ │ -177 } │ │ │ │ -178 case OMFormat::Chunk::Integer_64: │ │ │ │ -179 { │ │ │ │ -180 OMFormat::int64 v; │ │ │ │ -181 bytes = restore( _is, v, _swap ); │ │ │ │ -182 _val = static_cast(v); │ │ │ │ -183 break; │ │ │ │ -184 } │ │ │ │ -185 } │ │ │ │ -186 return bytes; │ │ │ │ -187 } │ │ │ │ -188 │ │ │ │ -189 │ │ │ │ -190 // helper to restore a an unsigned integer │ │ │ │ -191 template< typename T > │ │ │ │ -192 size_t │ │ │ │ -193 restore( std::istream& _is, │ │ │ │ -194 T& _val, │ │ │ │ -195 OMFormat::Chunk::Integer_Size _b, │ │ │ │ -196 bool _swap, │ │ │ │ -197 t_unsigned) │ │ │ │ -198 { │ │ │ │ -199 assert( OMFormat::is_integer( _val ) ); │ │ │ │ -200 size_t bytes = 0; │ │ │ │ -201 │ │ │ │ -202 switch( _b ) │ │ │ │ -203 { │ │ │ │ -204 case OMFormat::Chunk::Integer_8: │ │ │ │ -205 { │ │ │ │ -206 OMFormat::uint8 v; │ │ │ │ -207 bytes = restore( _is, v, _swap ); │ │ │ │ -208 _val = static_cast(v); │ │ │ │ -209 break; │ │ │ │ -210 } │ │ │ │ -211 case OMFormat::Chunk::Integer_16: │ │ │ │ -212 { │ │ │ │ -213 OMFormat::uint16 v; │ │ │ │ -214 bytes = restore( _is, v, _swap ); │ │ │ │ -215 _val = static_cast(v); │ │ │ │ -216 break; │ │ │ │ -217 } │ │ │ │ -218 case OMFormat::Chunk::Integer_32: │ │ │ │ -219 { │ │ │ │ -220 OMFormat::uint32 v; │ │ │ │ -221 bytes = restore( _is, v, _swap ); │ │ │ │ -222 _val = static_cast(v); │ │ │ │ -223 break; │ │ │ │ -224 } │ │ │ │ -225 │ │ │ │ -226 case OMFormat::Chunk::Integer_64: │ │ │ │ -227 { │ │ │ │ -228 OMFormat::uint64 v; │ │ │ │ -229 bytes = restore( _is, v, _swap ); │ │ │ │ -230 _val = static_cast(v); │ │ │ │ -231 break; │ │ │ │ +142 for(unsigned int K = 5; K<_max_valence; ++K) │ │ │ │ +143 { │ │ │ │ +144 weights[K].resize(K+1); │ │ │ │ +145 // s(j) = ( 1/4 + cos(2*pi*j/K) + 1/2 * cos(4*pi*j/K) )/K │ │ │ │ +146 double invK = 1.0/static_cast(K); │ │ │ │ +147 real_t sum = 0; │ │ │ │ +148 for(unsigned int j=0; j((0.25 + cos │ │ │ │ +(2.0*M_PI*static_cast(j)*invK) + 0.5*cos(4.0*M_PI*static_cast │ │ │ │ +(j)*invK))*invK); │ │ │ │ +151 sum += weights[K][j]; │ │ │ │ +152 } │ │ │ │ +153 weights[K][K] = static_cast(1.0) - sum; │ │ │ │ +154 } │ │ │ │ +155 } │ │ │ │ +156 │ │ │ │ +157 │ │ │ │ +158protected: │ │ │ │ +159 │ │ │ │ +160 │ │ │ │ +_1_6_1 bool _p_r_e_p_a_r_e( mesh_t& _m ) override │ │ │ │ +162 { │ │ │ │ +163 _m.add_property( vp_pos_ ); │ │ │ │ +164 _m.add_property( ep_pos_ ); │ │ │ │ +165 return true; │ │ │ │ +166 } │ │ │ │ +167 │ │ │ │ +168 │ │ │ │ +_1_6_9 bool _c_l_e_a_n_u_p( mesh_t& _m ) override │ │ │ │ +170 { │ │ │ │ +171 _m.remove_property( vp_pos_ ); │ │ │ │ +172 _m.remove_property( ep_pos_ ); │ │ │ │ +173 return true; │ │ │ │ +174 } │ │ │ │ +175 │ │ │ │ +176 │ │ │ │ +_1_7_7 bool _s_u_b_d_i_v_i_d_e( MeshType& _m, size_t _n , const bool _update_points = true) │ │ │ │ +override │ │ │ │ +178 { │ │ │ │ +179 │ │ │ │ +181 │ │ │ │ +182 // Compute the maximal vertex valence in the mesh │ │ │ │ +183 unsigned int maxValence = 0; │ │ │ │ +184 for ( auto vertex : _m.vertices() ) { │ │ │ │ +185 maxValence = std::max(maxValence,_m.valence(vertex)); │ │ │ │ +186 } │ │ │ │ +187 │ │ │ │ +188 // We pre initialized with 30. If it's larger, we update the weights │ │ │ │ +189 if (maxValence >= 30) { │ │ │ │ +190 _i_n_i_t___w_e_i_g_h_t_s( maxValence + 1 ); │ │ │ │ +191 } │ │ │ │ +192 │ │ │ │ +193 // Do _n subdivisions │ │ │ │ +194 for (size_t i=0; i < _n; ++i) │ │ │ │ +195 { │ │ │ │ +196 │ │ │ │ +197 // This is an interpolating scheme, old vertices remain the same. │ │ │ │ +198 for ( auto vh : _m.vertices()) │ │ │ │ +199 _m.property( vp_pos_, vh ) = _m.point(vh); │ │ │ │ +200 │ │ │ │ +201 // Compute position for new vertices and store them in the edge property │ │ │ │ +202 for (auto eh : _m.edges()) │ │ │ │ +203 compute_midpoint( _m, eh); │ │ │ │ +204 │ │ │ │ +205 │ │ │ │ +206 // Split each edge at midpoint and store precomputed positions (stored in │ │ │ │ +207 // edge property ep_pos_) in the vertex property vp_pos_; │ │ │ │ +208 │ │ │ │ +209 // Attention! Creating new edges, hence make sure the loop ends correctly. │ │ │ │ +210 for (auto eh : _m.edges()) │ │ │ │ +211 split_edge(_m, eh ); │ │ │ │ +212 │ │ │ │ +213 │ │ │ │ +214 // Commit changes in topology and reconsitute consistency │ │ │ │ +215 │ │ │ │ +216 // Attention! Creating new faces, hence make sure the loop ends correctly. │ │ │ │ +217 for (auto fh : _m.faces()) │ │ │ │ +218 split_face(_m, fh ); │ │ │ │ +219 │ │ │ │ +220 │ │ │ │ +221 // Commit changes in geometry │ │ │ │ +222 for ( auto vh : _m.vertices()) │ │ │ │ +223 _m.set_point(vh, _m.property( vp_pos_, vh ) ); │ │ │ │ +224 │ │ │ │ +225#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ +226 // Now we have an consistent mesh! │ │ │ │ +227 assert( _O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_M_e_s_h_C_h_e_c_k_e_r_T_<_m_e_s_h___t_>(_m).check() ); │ │ │ │ +228#endif │ │ │ │ +229 } │ │ │ │ +230 │ │ │ │ +231 return true; │ │ │ │ 232 } │ │ │ │ -233 } │ │ │ │ -234 return bytes; │ │ │ │ -235 } │ │ │ │ -236 │ │ │ │ -237// │ │ │ │ -============================================================================= │ │ │ │ -238} // namespace IO │ │ │ │ -239} // namespace OpenMesh │ │ │ │ -240// │ │ │ │ -============================================================================= │ │ │ │ +233 │ │ │ │ +234private: // topological modifiers │ │ │ │ +235 │ │ │ │ +236 void split_face(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_F_a_c_e_H_a_n_d_l_e& _fh) │ │ │ │ +237 { │ │ │ │ +238 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +239 heh1(_m.halfedge_handle(_fh)), │ │ │ │ +240 heh2(_m.next_halfedge_handle(_m.next_halfedge_handle(heh1))), │ │ │ │ +241 heh3(_m.next_halfedge_handle(_m.next_halfedge_handle(heh2))); │ │ │ │ +242 │ │ │ │ +243 // Cutting off every corner of the 6_gon │ │ │ │ +244 corner_cutting( _m, heh1 ); │ │ │ │ +245 corner_cutting( _m, heh2 ); │ │ │ │ +246 corner_cutting( _m, heh3 ); │ │ │ │ +247 } │ │ │ │ +248 │ │ │ │ +249 │ │ │ │ +250 void corner_cutting(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& _he) │ │ │ │ +251 { │ │ │ │ +252 // Define Halfedge Handles │ │ │ │ +253 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +254 heh1(_he), │ │ │ │ +255 heh5(heh1), │ │ │ │ +256 heh6(_m.next_halfedge_handle(heh1)); │ │ │ │ +257 │ │ │ │ +258 // Cycle around the polygon to find correct Halfedge │ │ │ │ +259 for (; _m.next_halfedge_handle(_m.next_halfedge_handle(heh5)) != heh1; │ │ │ │ +260 heh5 = _m.next_halfedge_handle(heh5)) │ │ │ │ +261 {} │ │ │ │ +262 │ │ │ │ +263 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +264 vh1 = _m.to_vertex_handle(heh1), │ │ │ │ +265 vh2 = _m.to_vertex_handle(heh5); │ │ │ │ +266 │ │ │ │ +267 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +268 heh2(_m.next_halfedge_handle(heh5)), │ │ │ │ +269 heh3(_m.new_edge( vh1, vh2)), │ │ │ │ +270 heh4(_m.opposite_halfedge_handle(heh3)); │ │ │ │ +271 │ │ │ │ +272 /* Intermediate result │ │ │ │ +273 * │ │ │ │ +274 * * │ │ │ │ +275 * 5 /|\ │ │ │ │ +276 * /_ \ │ │ │ │ +277 * vh2> * * │ │ │ │ +278 * /|\3 |\ │ │ │ │ +279 * /_ \|4 \ │ │ │ │ +280 * *----\*----\* │ │ │ │ +281 * 1 ^ 6 │ │ │ │ +282 * vh1 (adjust_outgoing halfedge!) │ │ │ │ +283 */ │ │ │ │ +284 │ │ │ │ +285 // Old and new Face │ │ │ │ +286 typename _m_e_s_h___t_:_:_F_a_c_e_H_a_n_d_l_e fh_old(_m.face_handle(heh6)); │ │ │ │ +287 typename _m_e_s_h___t_:_:_F_a_c_e_H_a_n_d_l_e fh_new(_m.new_face()); │ │ │ │ +288 │ │ │ │ +289 │ │ │ │ +290 // Re-Set Handles around old Face │ │ │ │ +291 _m.set_next_halfedge_handle(heh4, heh6); │ │ │ │ +292 _m.set_next_halfedge_handle(heh5, heh4); │ │ │ │ +293 │ │ │ │ +294 _m.set_face_handle(heh4, fh_old); │ │ │ │ +295 _m.set_face_handle(heh5, fh_old); │ │ │ │ +296 _m.set_face_handle(heh6, fh_old); │ │ │ │ +297 _m.set_halfedge_handle(fh_old, heh4); │ │ │ │ +298 │ │ │ │ +299 // Re-Set Handles around new Face │ │ │ │ +300 _m.set_next_halfedge_handle(heh1, heh3); │ │ │ │ +301 _m.set_next_halfedge_handle(heh3, heh2); │ │ │ │ +302 │ │ │ │ +303 _m.set_face_handle(heh1, fh_new); │ │ │ │ +304 _m.set_face_handle(heh2, fh_new); │ │ │ │ +305 _m.set_face_handle(heh3, fh_new); │ │ │ │ +306 │ │ │ │ +307 _m.set_halfedge_handle(fh_new, heh1); │ │ │ │ +308 } │ │ │ │ +309 │ │ │ │ +310 │ │ │ │ +311 void split_edge(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_E_d_g_e_H_a_n_d_l_e& _eh) │ │ │ │ +312 { │ │ │ │ +313 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +314 heh = _m.halfedge_handle(_eh, 0), │ │ │ │ +315 opp_heh = _m.halfedge_handle(_eh, 1); │ │ │ │ +316 │ │ │ │ +317 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e new_heh, opp_new_heh, t_heh; │ │ │ │ +318 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e vh; │ │ │ │ +319 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e vh1(_m.to_vertex_handle(heh)); │ │ │ │ +320 typename _m_e_s_h___t_:_:_P_o_i_n_t zero(0,0,0); │ │ │ │ +321 │ │ │ │ +322 // new vertex │ │ │ │ +323 vh = _m._n_e_w___v_e_r_t_e_x( zero ); │ │ │ │ +324 │ │ │ │ +325 // memorize position, will be set later │ │ │ │ +326 _m.property( vp_pos_, vh ) = _m.property( ep_pos_, _eh ); │ │ │ │ +327 │ │ │ │ +328 │ │ │ │ +329 // Re-link mesh entities │ │ │ │ +330 if (_m.is_boundary(_eh)) │ │ │ │ +331 { │ │ │ │ +332 for (t_heh = heh; │ │ │ │ +333 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +334 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh))) │ │ │ │ +335 {} │ │ │ │ +336 } │ │ │ │ +337 else │ │ │ │ +338 { │ │ │ │ +339 for (t_heh = _m.next_halfedge_handle(opp_heh); │ │ │ │ +340 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +341 t_heh = _m.next_halfedge_handle(t_heh) ) │ │ │ │ +342 {} │ │ │ │ +343 } │ │ │ │ +344 │ │ │ │ +345 new_heh = _m.new_edge(vh, vh1); │ │ │ │ +346 opp_new_heh = _m.opposite_halfedge_handle(new_heh); │ │ │ │ +347 _m.set_vertex_handle( heh, vh ); │ │ │ │ +348 │ │ │ │ +349 _m.set_next_halfedge_handle(t_heh, opp_new_heh); │ │ │ │ +350 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh)); │ │ │ │ +351 _m.set_next_halfedge_handle(heh, new_heh); │ │ │ │ +352 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); │ │ │ │ +353 │ │ │ │ +354 if (_m.face_handle(opp_heh).is_valid()) │ │ │ │ +355 { │ │ │ │ +356 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh)); │ │ │ │ +357 _m.set_halfedge_handle(_m.face_handle(opp_new_heh), opp_new_heh); │ │ │ │ +358 } │ │ │ │ +359 │ │ │ │ +360 _m.set_face_handle( new_heh, _m.face_handle(heh) ); │ │ │ │ +361 _m.set_halfedge_handle( vh, new_heh); │ │ │ │ +362 │ │ │ │ +363 // We cant reconnect a non existing face, so we skip this here if necessary │ │ │ │ +364 if ( !_m.is_boundary(heh) ) │ │ │ │ +365 _m.set_halfedge_handle( _m.face_handle(heh), heh ); │ │ │ │ +366 │ │ │ │ +367 _m.set_halfedge_handle( vh1, opp_new_heh ); │ │ │ │ +368 │ │ │ │ +369 // Never forget this, when playing with the topology │ │ │ │ +370 _m.adjust_outgoing_halfedge( vh ); │ │ │ │ +371 _m.adjust_outgoing_halfedge( vh1 ); │ │ │ │ +372 } │ │ │ │ +373 │ │ │ │ +374private: // geometry helper │ │ │ │ +375 │ │ │ │ +376 void compute_midpoint(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_E_d_g_e_H_a_n_d_l_e& _eh) │ │ │ │ +377 { │ │ │ │ +378 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, opp_heh; │ │ │ │ +379 │ │ │ │ +380 heh = _m.halfedge_handle( _eh, 0); │ │ │ │ +381 opp_heh = _m.halfedge_handle( _eh, 1); │ │ │ │ +382 │ │ │ │ +383 typename _m_e_s_h___t_:_:_P_o_i_n_t pos(0,0,0); │ │ │ │ +384 │ │ │ │ +385 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e a_0(_m.to_vertex_handle(heh)); │ │ │ │ +386 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e a_1(_m.to_vertex_handle(opp_heh)); │ │ │ │ +387 │ │ │ │ +388 // boundary edge: 4-point scheme │ │ │ │ +389 if (_m.is_boundary(_eh) ) │ │ │ │ +390 { │ │ │ │ +391 pos = _m.point(a_0); │ │ │ │ +392 pos += _m.point(a_1); │ │ │ │ +393 pos *= static_cast(9.0/16.0); │ │ │ │ +394 typename _m_e_s_h___t_:_:_P_o_i_n_t tpos; │ │ │ │ +395 if(_m.is_boundary(heh)) │ │ │ │ +396 { │ │ │ │ +397 tpos = _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh))); │ │ │ │ +398 tpos += _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle │ │ │ │ +(_m.prev_halfedge_handle(heh)))); │ │ │ │ +399 } │ │ │ │ +400 else │ │ │ │ +401 { │ │ │ │ +402 assert(_m.is_boundary(opp_heh)); │ │ │ │ +403 tpos = _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(opp_heh))); │ │ │ │ +404 tpos += _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle │ │ │ │ +(_m.prev_halfedge_handle(opp_heh)))); │ │ │ │ +405 } │ │ │ │ +406 tpos *= static_cast(-1.0/16.0); │ │ │ │ +407 pos += tpos; │ │ │ │ +408 } │ │ │ │ +409 else │ │ │ │ +410 { │ │ │ │ +411 int valence_a_0 = _m.valence(a_0); │ │ │ │ +412 int valence_a_1 = _m.valence(a_1); │ │ │ │ +413 assert(valence_a_0>2); │ │ │ │ +414 assert(valence_a_1>2); │ │ │ │ +415 │ │ │ │ +416 if( (valence_a_0==6 && valence_a_1==6) || (_m.is_boundary(a_0) && │ │ │ │ +valence_a_1==6) || (_m.is_boundary(a_1) && valence_a_0==6) || (_m.is_boundary │ │ │ │ +(a_0) && _m.is_boundary(a_1)) )// use 8-point scheme │ │ │ │ +417 { │ │ │ │ +418 real_t alpha = real_t(1.0/2); │ │ │ │ +419 real_t beta = real_t(1.0/8); │ │ │ │ +420 real_t gamma = real_t(-1.0/16); │ │ │ │ +421 │ │ │ │ +422 //get points │ │ │ │ +423 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e b_0, b_1, c_0, c_1, c_2, c_3; │ │ │ │ +424 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e t_he; │ │ │ │ +425 │ │ │ │ +426 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(heh)); │ │ │ │ +427 b_0 = _m.to_vertex_handle(t_he); │ │ │ │ +428 if(!_m.is_boundary(_m.opposite_halfedge_handle(t_he))) │ │ │ │ +429 { │ │ │ │ +430 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(t_he)); │ │ │ │ +431 c_0 = _m.to_vertex_handle(t_he); │ │ │ │ +432 } │ │ │ │ +433 │ │ │ │ +434 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)); │ │ │ │ +435 b_1 = _m.to_vertex_handle(t_he); │ │ │ │ +436 if(!_m.is_boundary(t_he)) │ │ │ │ +437 { │ │ │ │ +438 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(t_he)); │ │ │ │ +439 c_1 = _m.to_vertex_handle(t_he); │ │ │ │ +440 } │ │ │ │ +441 │ │ │ │ +442 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(opp_heh)); │ │ │ │ +443 assert(b_1.idx()==_m.to_vertex_handle(t_he).idx()); │ │ │ │ +444 if(!_m.is_boundary(_m.opposite_halfedge_handle(t_he))) │ │ │ │ +445 { │ │ │ │ +446 t_he = _m.next_halfedge_handle(_m.opposite_halfedge_handle(t_he)); │ │ │ │ +447 c_2 = _m.to_vertex_handle(t_he); │ │ │ │ +448 } │ │ │ │ +449 │ │ │ │ +450 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(opp_heh)); │ │ │ │ +451 assert(b_0==_m.to_vertex_handle(t_he)); │ │ │ │ +452 if(!_m.is_boundary(t_he)) │ │ │ │ +453 { │ │ │ │ +454 t_he = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(t_he)); │ │ │ │ +455 c_3 = _m.to_vertex_handle(t_he); │ │ │ │ +456 } │ │ │ │ +457 │ │ │ │ +458 //compute position. │ │ │ │ +459 //a0,a1,b0,b1 must exist. │ │ │ │ +460 assert(a_0.is_valid()); │ │ │ │ +461 assert(a_1.is_valid()); │ │ │ │ +462 assert(b_0.is_valid()); │ │ │ │ +463 assert(b_1.is_valid()); │ │ │ │ +464 //The other vertices may be created from symmetry is they are on the other │ │ │ │ +side of the boundary. │ │ │ │ +465 │ │ │ │ +466 pos = _m.point(a_0); │ │ │ │ +467 pos += _m.point(a_1); │ │ │ │ +468 pos *= alpha; │ │ │ │ +469 │ │ │ │ +470 typename _m_e_s_h___t_:_:_P_o_i_n_t tpos ( _m.point(b_0) ); │ │ │ │ +471 tpos += _m.point(b_1); │ │ │ │ +472 tpos *= beta; │ │ │ │ +473 pos += tpos; │ │ │ │ +474 │ │ │ │ +475 typename _m_e_s_h___t_:_:_P_o_i_n_t pc_0, pc_1, pc_2, pc_3; │ │ │ │ +476 if(c_0.is_valid()) │ │ │ │ +477 pc_0 = _m.point(c_0); │ │ │ │ +478 else //create the point by symmetry │ │ │ │ +479 { │ │ │ │ +480 pc_0 = _m.point(a_1) + _m.point(b_0) - _m.point(a_0); │ │ │ │ +481 } │ │ │ │ +482 if(c_1.is_valid()) │ │ │ │ +483 pc_1 = _m.point(c_1); │ │ │ │ +484 else //create the point by symmetry │ │ │ │ +485 { │ │ │ │ +486 pc_1 = _m.point(a_1) + _m.point(b_1) - _m.point(a_0); │ │ │ │ +487 } │ │ │ │ +488 if(c_2.is_valid()) │ │ │ │ +489 pc_2 = _m.point(c_2); │ │ │ │ +490 else //create the point by symmetry │ │ │ │ +491 { │ │ │ │ +492 pc_2 = _m.point(a_0) + _m.point(b_1) - _m.point(a_1); │ │ │ │ +493 } │ │ │ │ +494 if(c_3.is_valid()) │ │ │ │ +495 pc_3 = _m.point(c_3); │ │ │ │ +496 else //create the point by symmetry │ │ │ │ +497 { │ │ │ │ +498 pc_3 = _m.point(a_0) + _m.point(b_0) - _m.point(a_1); │ │ │ │ +499 } │ │ │ │ +500 tpos = pc_0; │ │ │ │ +501 tpos += pc_1; │ │ │ │ +502 tpos += pc_2; │ │ │ │ +503 tpos += pc_3; │ │ │ │ +504 tpos *= gamma; │ │ │ │ +505 pos += tpos; │ │ │ │ +506 } │ │ │ │ +507 else //at least one endpoint is [irregular and not in boundary] │ │ │ │ +508 { │ │ │ │ +509 RealType normFactor = static_cast(0.0); │ │ │ │ +510 │ │ │ │ +511 if(valence_a_0!=6 && !_m.is_boundary(a_0)) │ │ │ │ +512 { │ │ │ │ +513 assert((int)weights[valence_a_0].size()==valence_a_0+1); │ │ │ │ +514 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e t_he = opp_heh; │ │ │ │ +515 for(int i = 0; i < valence_a_0 ; t_he=_m.next_halfedge_handle │ │ │ │ +(_m.opposite_halfedge_handle(t_he)), ++i) │ │ │ │ +516 { │ │ │ │ +517 pos += weights[valence_a_0][i] * _m.point(_m.to_vertex_handle(t_he)); │ │ │ │ +518 } │ │ │ │ +519 assert(t_he==opp_heh); │ │ │ │ +520 │ │ │ │ +521 //add irregular vertex: │ │ │ │ +522 pos += weights[valence_a_0][valence_a_0] * _m.point(a_0); │ │ │ │ +523 ++normFactor; │ │ │ │ +524 } │ │ │ │ +525 │ │ │ │ +526 if(valence_a_1!=6 && !_m.is_boundary(a_1)) │ │ │ │ +527 { │ │ │ │ +528 assert((int)weights[valence_a_1].size()==valence_a_1+1); │ │ │ │ +529 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e t_he = heh; │ │ │ │ +530 for(int i = 0; i < valence_a_1 ; t_he=_m.next_halfedge_handle │ │ │ │ +(_m.opposite_halfedge_handle(t_he)), ++i) │ │ │ │ +531 { │ │ │ │ +532 pos += weights[valence_a_1][i] * _m.point(_m.to_vertex_handle(t_he)); │ │ │ │ +533 } │ │ │ │ +534 assert(t_he==heh); │ │ │ │ +535 //add irregular vertex: │ │ │ │ +536 pos += weights[valence_a_1][valence_a_1] * _m.point(a_1); │ │ │ │ +537 ++normFactor; │ │ │ │ +538 } │ │ │ │ +539 │ │ │ │ +540 assert(normFactor>0.1); //normFactor should be 1 or 2 │ │ │ │ +541 │ │ │ │ +542 //if both vertices are irregular, average positions: │ │ │ │ +543 pos /= normFactor; │ │ │ │ +544 } │ │ │ │ +545 } │ │ │ │ +546 _m.property( ep_pos_, _eh ) = pos; │ │ │ │ +547 } │ │ │ │ +548 │ │ │ │ +549private: // data │ │ │ │ +550 │ │ │ │ +551 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> vp_pos_; │ │ │ │ +552 _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> ep_pos_; │ │ │ │ +553 │ │ │ │ +554 weights_t weights; │ │ │ │ +555 │ │ │ │ +556}; │ │ │ │ +557 │ │ │ │ +558} // END_NS_UNIFORM │ │ │ │ +559} // END_NS_SUBDIVIDER │ │ │ │ +560} // END_NS_OPENMESH │ │ │ │ +561#endif │ │ │ │ +562 │ │ │ │ +_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Triangle mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle new_vertex() │ │ │ │ +Uses default copy and assignment operator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:201 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T │ │ │ │ +Modified Butterfly subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn ModifiedButterFlyT.hh:93 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T_:_:_n_a_m_e │ │ │ │ +const char * name() const override │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn ModifiedButterFlyT.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T_:_:_s_u_b_d_i_v_i_d_e │ │ │ │ +bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true) │ │ │ │ +override │ │ │ │ +Subdivide mesh _m _n times. │ │ │ │ +DDeeffiinniittiioonn ModifiedButterFlyT.hh:177 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T_:_:_i_n_i_t___w_e_i_g_h_t_s │ │ │ │ +void init_weights(size_t _max_valence=30) │ │ │ │ +Pre-compute weights. │ │ │ │ +DDeeffiinniittiioonn ModifiedButterFlyT.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T_:_:_c_l_e_a_n_u_p │ │ │ │ +bool cleanup(mesh_t &_m) override │ │ │ │ +Cleanup mesh after usage, e.g. remove added properties. │ │ │ │ +DDeeffiinniittiioonn ModifiedButterFlyT.hh:169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_o_d_i_f_i_e_d_B_u_t_t_e_r_f_l_y_T_:_:_p_r_e_p_a_r_e │ │ │ │ +bool prepare(mesh_t &_m) override │ │ │ │ +Prepare mesh, e.g. │ │ │ │ +DDeeffiinniittiioonn ModifiedButterFlyT.hh:161 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_M_e_s_h_C_h_e_c_k_e_r_T │ │ │ │ +Check integrity of mesh. │ │ │ │ +DDeeffiinniittiioonn MeshCheckerT.hh:74 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00527_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/IOManager.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/CatmullClarkT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
IOManager.hh
│ │ │ +
CatmullClarkT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -136,195 +136,138 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44//=============================================================================
│ │ │ -
45//
│ │ │ -
46// Implements the OpenMesh IOManager singleton
│ │ │ -
47//
│ │ │ -
48//=============================================================================
│ │ │ -
49
│ │ │ -
50#ifndef __IOMANAGER_HH__
│ │ │ -
51#define __IOMANAGER_HH__
│ │ │ -
52
│ │ │ -
53
│ │ │ -
54//=== INCLUDES ================================================================
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// CLASS CatmullClarkT
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52#ifndef OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARKT_HH
│ │ │ +
53#define OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARKT_HH
│ │ │ +
54
│ │ │
55
│ │ │ -
56
│ │ │ -
57// STL
│ │ │ -
58#include <iosfwd>
│ │ │ -
59#include <sstream>
│ │ │ -
60#include <string>
│ │ │ -
61#include <set>
│ │ │ -
62
│ │ │ -
63// OpenMesh
│ │ │ -
64#include <OpenMesh/Core/System/config.h>
│ │ │ -
65#include <OpenMesh/Core/IO/Options.hh>
│ │ │ -
66#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ -
67#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ -
68#include <OpenMesh/Core/IO/importer/BaseImporter.hh>
│ │ │ -
69#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ -
70#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
71
│ │ │ -
72
│ │ │ -
73//== NAMESPACES ===============================================================
│ │ │ +
56//== INCLUDES =================================================================
│ │ │ +
57
│ │ │ + │ │ │ +
59
│ │ │ +
60// -------------------- STL
│ │ │ +
61#if defined(OM_CC_MIPS)
│ │ │ +
62# include <math.h>
│ │ │ +
63#else
│ │ │ +
64# include <cmath>
│ │ │ +
65#endif
│ │ │ +
66
│ │ │ +
67//== FORWARDDECLARATIONS ======================================================
│ │ │ +
68
│ │ │ +
69//== NAMESPACES ===============================================================
│ │ │ +
70
│ │ │ +
71namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
72namespace Subdivider { // BEGIN_NS_SUBVIDER
│ │ │ +
73namespace Uniform { // BEGIN_NS_UNIFORM
│ │ │
74
│ │ │ -
75
│ │ │ -
76namespace OpenMesh {
│ │ │ -
77namespace IO {
│ │ │ -
78
│ │ │ -
79
│ │ │ -
80//=== IMPLEMENTATION ==========================================================
│ │ │ -
81
│ │ │ -
82
│ │ │ -
│ │ │ -
102class OPENMESHDLLEXPORT _IOManager_
│ │ │ -
103{
│ │ │ -
104private:
│ │ │ -
105
│ │ │ -
107 _IOManager_() {}
│ │ │ -
108
│ │ │ -
110 ~_IOManager_() {};
│ │ │ -
111
│ │ │ -
115 friend OPENMESHDLLEXPORT _IOManager_& IOManager();
│ │ │ +
75//== CLASS DEFINITION =========================================================
│ │ │ +
76
│ │ │ +
77
│ │ │ +
84template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
85class CatmullClarkT : public SubdividerT< MeshType, RealType >
│ │ │ +
86{
│ │ │ +
87public:
│ │ │ +
88
│ │ │ +
89 typedef typename MeshType::FaceHandle FaceHandle;
│ │ │ +
90 typedef typename MeshType::VertexHandle VertexHandle;
│ │ │ +
91 typedef typename MeshType::EdgeHandle EdgeHandle;
│ │ │ +
92 typedef typename MeshType::HalfedgeHandle HalfedgeHandle;
│ │ │ +
93
│ │ │ +
94 typedef typename MeshType::Point Point;
│ │ │ +
95 typedef typename MeshType::Normal Normal;
│ │ │ +
96 typedef typename MeshType::FaceIter FaceIter;
│ │ │ +
97 typedef typename MeshType::EdgeIter EdgeIter;
│ │ │ +
98 typedef typename MeshType::VertexIter VertexIter;
│ │ │ +
99
│ │ │ +
100 typedef typename MeshType::VertexEdgeIter VertexEdgeIter;
│ │ │ +
101 typedef typename MeshType::VertexFaceIter VertexFaceIter;
│ │ │ +
102
│ │ │ +
103 typedef typename MeshType::VOHIter VOHIter;
│ │ │ +
104
│ │ │ + │ │ │ +
106
│ │ │ + │ │ │ +
109
│ │ │ +
111 explicit CatmullClarkT(MeshType &_m) : parent_t(_m) { }
│ │ │ +
112
│ │ │ +
113 virtual ~CatmullClarkT() {}
│ │ │ +
114
│ │ │ +
115public:
│ │ │
116
│ │ │ -
117public:
│ │ │ +
117 const char *name() const override { return "Uniform CatmullClark"; }
│ │ │
118
│ │ │ -
125 bool read(const std::string& _filename,
│ │ │ -
126 BaseImporter& _bi,
│ │ │ -
127 Options& _opt);
│ │ │ -
128
│ │ │ -
135 bool read(std::istream& _filename,
│ │ │ -
136 const std::string& _ext,
│ │ │ -
137 BaseImporter& _bi,
│ │ │ -
138 Options& _opt);
│ │ │ -
139
│ │ │ -
140
│ │ │ -
147 bool write(const std::string& _filename,
│ │ │ -
148 BaseExporter& _be,
│ │ │ -
149 Options _opt=Options::Default,
│ │ │ -
150 std::streamsize _precision = 6);
│ │ │ -
151
│ │ │ -
158 bool write(std::ostream& _filename,
│ │ │ -
159 const std::string& _ext,
│ │ │ -
160 BaseExporter& _be,
│ │ │ -
161 Options _opt=Options::Default,
│ │ │ -
162 std::streamsize _precision = 6);
│ │ │ -
163
│ │ │ -
164
│ │ │ -
166 bool can_read( const std::string& _format ) const;
│ │ │ -
167
│ │ │ -
169 bool can_write( const std::string& _format ) const;
│ │ │ -
170
│ │ │ -
171
│ │ │ -
172 size_t binary_size(const std::string& _format,
│ │ │ -
173 BaseExporter& _be,
│ │ │ -
174 Options _opt = Options::Default)
│ │ │ -
175 {
│ │ │ -
176 const BaseWriter *bw = find_writer(_format);
│ │ │ -
177 return bw ? bw->binary_size(_be,_opt) : 0;
│ │ │ -
178 }
│ │ │ -
179
│ │ │ -
180
│ │ │ -
181
│ │ │ -
182public: //-- QT convenience function ------------------------------------------
│ │ │ -
183
│ │ │ -
184
│ │ │ -
189 const std::string& qt_read_filters() const { return read_filters_; }
│ │ │ -
190
│ │ │ -
191
│ │ │ -
196 const std::string& qt_write_filters() const { return write_filters_; }
│ │ │ -
197
│ │ │ -
198
│ │ │ -
199
│ │ │ -
200private:
│ │ │ -
201
│ │ │ -
202 // collect all readable file extensions
│ │ │ -
203 void update_read_filters();
│ │ │ -
204
│ │ │ -
205
│ │ │ -
206 // collect all writeable file extensions
│ │ │ -
207 void update_write_filters();
│ │ │ -
208
│ │ │ -
209
│ │ │ -
210
│ │ │ -
211public: //-- SYSTEM PART------------------------------------------------------
│ │ │ -
212
│ │ │ -
213
│ │ │ -
│ │ │ - │ │ │ -
218 {
│ │ │ -
219 reader_modules_.insert(_bl);
│ │ │ -
220 update_read_filters();
│ │ │ -
221 return true;
│ │ │ -
222 }
│ │ │ +
119protected:
│ │ │ +
120
│ │ │ +
122 virtual bool prepare( MeshType& _m ) override;
│ │ │ +
123
│ │ │ +
125 virtual bool cleanup( MeshType& _m ) override;
│ │ │ +
126
│ │ │ +
134 virtual bool subdivide( MeshType& _m, size_t _n , const bool _update_points = true) override;
│ │ │ +
135
│ │ │ +
136private:
│ │ │ +
137
│ │ │ +
138 //===========================================================================
│ │ │ +
141 //===========================================================================
│ │ │ +
142
│ │ │ +
143 void split_edge( MeshType& _m, const EdgeHandle& _eh);
│ │ │ +
144
│ │ │ +
145 void split_face( MeshType& _m, const FaceHandle& _fh);
│ │ │ +
146
│ │ │ +
147 void compute_midpoint( MeshType& _m, const EdgeHandle& _eh, const bool _update_points);
│ │ │ +
148
│ │ │ +
149 void update_vertex(MeshType& _m, const VertexHandle& _vh);
│ │ │ +
150
│ │ │ +
154private:
│ │ │ +
155 OpenMesh::VPropHandleT< Point > vp_pos_; // next vertex pos
│ │ │ +
156 OpenMesh::EPropHandleT< Point > ep_pos_; // new edge pts
│ │ │ +
157 OpenMesh::FPropHandleT< Point > fp_pos_; // new face pts
│ │ │ +
158 OpenMesh::EPropHandleT<double> creaseWeights_;// crease weights
│ │ │ +
159
│ │ │ +
160};
│ │ │
│ │ │ -
223
│ │ │ -
224
│ │ │ -
225
│ │ │ -
│ │ │ - │ │ │ -
230 {
│ │ │ -
231 writer_modules_.insert(_bw);
│ │ │ -
232 update_write_filters();
│ │ │ -
233 return true;
│ │ │ -
234 }
│ │ │ -
│ │ │ -
235
│ │ │ -
236
│ │ │ -
237private:
│ │ │ -
238
│ │ │ -
239 const BaseWriter *find_writer(const std::string& _format);
│ │ │ -
240
│ │ │ -
241 // stores registered reader modules
│ │ │ -
242 std::set<BaseReader*> reader_modules_;
│ │ │ -
243
│ │ │ -
244 // stores registered writer modules
│ │ │ -
245 std::set<BaseWriter*> writer_modules_;
│ │ │ -
246
│ │ │ -
247 // input filters (e.g. for Qt file dialog)
│ │ │ -
248 std::string read_filters_;
│ │ │ -
249
│ │ │ -
250 // output filters (e.g. for Qt file dialog)
│ │ │ -
251 std::string write_filters_;
│ │ │ -
252};
│ │ │ -
│ │ │ -
253
│ │ │ -
254
│ │ │ -
255//=============================================================================
│ │ │ -
256
│ │ │ -
257
│ │ │ -
258//_IOManager_* __IOManager_instance; Causes memory leak, as destructor is never called
│ │ │ -
259
│ │ │ -
260OPENMESHDLLEXPORT _IOManager_& IOManager();
│ │ │ -
261
│ │ │ -
262//=============================================================================
│ │ │ -
263} // namespace IO
│ │ │ -
264} // namespace OpenMesh
│ │ │ -
265//=============================================================================
│ │ │ -
266#endif
│ │ │ -
267//=============================================================================
│ │ │ +
161
│ │ │ +
162
│ │ │ +
163//=============================================================================
│ │ │ +
164} // END_NS_UNIFORM
│ │ │ +
165} // END_NS_SUBDIVIDER
│ │ │ +
166} // END_NS_OPENMESH
│ │ │ +
167//=============================================================================
│ │ │ +
168#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARK_CC)
│ │ │ +
169# define OPENMESH_SUBDIVIDER_TEMPLATES
│ │ │ +
170# include "CatmullClarkT_impl.hh"
│ │ │ +
171#endif
│ │ │ +
172//=============================================================================
│ │ │ +
173#endif // OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARKT_HH defined
│ │ │ +
174//=============================================================================
│ │ │ +
175
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options _opt=Options::Default)
Get binary size of data.
Definition MeshIO.hh:251
│ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ -
This is the real IOManager class that is later encapsulated by SingletonT to enforce its uniqueness.
Definition IOManager.hh:103
│ │ │ -
const std::string & qt_read_filters() const
Returns all readable file extension + descriptions in one string.
Definition IOManager.hh:189
│ │ │ -
bool register_module(BaseWriter *_bw)
Registers a new writer module.
Definition IOManager.hh:229
│ │ │ -
const std::string & qt_write_filters() const
Returns all writeable file extension + descriptions in one string.
Definition IOManager.hh:196
│ │ │ -
bool register_module(BaseReader *_bl)
Registers a new reader module.
Definition IOManager.hh:217
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for reader modules.
Definition BaseReader.hh:87
│ │ │ -
Base class for all writer modules.
Definition BaseWriter.hh:84
│ │ │ -
virtual size_t binary_size(BaseExporter &, const Options &) const
Returns expected size of file if binary format is supported else 0.
Definition BaseWriter.hh:128
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
Based on code from Leon Kos, CAD lab, Mech.Eng., University of Ljubljana, Slovenia (http://www....
Definition CatmullClarkT.hh:86
│ │ │ +
const char * name() const override
Return name of subdivision algorithm.
Definition CatmullClarkT.hh:117
│ │ │ +
CatmullClarkT(MeshType &_m)
Constructor.
Definition CatmullClarkT.hh:111
│ │ │ +
CatmullClarkT()
Constructor.
Definition CatmullClarkT.hh:108
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -IOManager.hh │ │ │ │ +CatmullClarkT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,232 +46,170 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44// │ │ │ │ -============================================================================= │ │ │ │ 45// │ │ │ │ -46// Implements the OpenMesh IOManager singleton │ │ │ │ -47// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// CLASS CatmullClarkT │ │ │ │ 48// │ │ │ │ +49// │ │ │ │ ============================================================================= │ │ │ │ -49 │ │ │ │ -50#ifndef __IOMANAGER_HH__ │ │ │ │ -51#define __IOMANAGER_HH__ │ │ │ │ -52 │ │ │ │ -53 │ │ │ │ -54//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52#ifndef OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARKT_HH │ │ │ │ +53#define OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARKT_HH │ │ │ │ +54 │ │ │ │ 55 │ │ │ │ -56 │ │ │ │ -57// STL │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62 │ │ │ │ -63// OpenMesh │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66#include │ │ │ │ -67#include │ │ │ │ -68#include │ │ │ │ -69#include │ │ │ │ -70#include │ │ │ │ -71 │ │ │ │ -72 │ │ │ │ -73//== NAMESPACES │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +57 │ │ │ │ +58#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ +59 │ │ │ │ +60// -------------------- STL │ │ │ │ +61#if defined(OM_CC_MIPS) │ │ │ │ +62# include │ │ │ │ +63#else │ │ │ │ +64# include │ │ │ │ +65#endif │ │ │ │ +66 │ │ │ │ +67//== FORWARDDECLARATIONS │ │ │ │ +====================================================== │ │ │ │ +68 │ │ │ │ +69//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ +70 │ │ │ │ +71namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +72namespace Subdivider { // BEGIN_NS_SUBVIDER │ │ │ │ +73namespace Uniform { // BEGIN_NS_UNIFORM │ │ │ │ 74 │ │ │ │ -75 │ │ │ │ -76namespace _O_p_e_n_M_e_s_h { │ │ │ │ -77namespace IO { │ │ │ │ -78 │ │ │ │ -79 │ │ │ │ -80//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -81 │ │ │ │ -82 │ │ │ │ -_1_0_2class OPENMESHDLLEXPORT ___I_O_M_a_n_a_g_e_r__ │ │ │ │ -103{ │ │ │ │ -104private: │ │ │ │ -105 │ │ │ │ -107 ___I_O_M_a_n_a_g_e_r__() {} │ │ │ │ -108 │ │ │ │ -110 _~___I_O_M_a_n_a_g_e_r__() {}; │ │ │ │ -111 │ │ │ │ -115 friend OPENMESHDLLEXPORT ___I_O_M_a_n_a_g_e_r__& IOManager(); │ │ │ │ +75//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +76 │ │ │ │ +77 │ │ │ │ +84template │ │ │ │ +_8_5class _C_a_t_m_u_l_l_C_l_a_r_k_T : public _S_u_b_d_i_v_i_d_e_r_T< MeshType, RealType > │ │ │ │ +86{ │ │ │ │ +87public: │ │ │ │ +88 │ │ │ │ +89 typedef typename MeshType::FaceHandle FaceHandle; │ │ │ │ +90 typedef typename MeshType::VertexHandle VertexHandle; │ │ │ │ +91 typedef typename MeshType::EdgeHandle EdgeHandle; │ │ │ │ +92 typedef typename MeshType::HalfedgeHandle HalfedgeHandle; │ │ │ │ +93 │ │ │ │ +94 typedef typename MeshType::Point Point; │ │ │ │ +95 typedef typename MeshType::Normal Normal; │ │ │ │ +96 typedef typename MeshType::FaceIter FaceIter; │ │ │ │ +97 typedef typename MeshType::EdgeIter EdgeIter; │ │ │ │ +98 typedef typename MeshType::VertexIter VertexIter; │ │ │ │ +99 │ │ │ │ +100 typedef typename MeshType::VertexEdgeIter VertexEdgeIter; │ │ │ │ +101 typedef typename MeshType::VertexFaceIter VertexFaceIter; │ │ │ │ +102 │ │ │ │ +103 typedef typename MeshType::VOHIter VOHIter; │ │ │ │ +104 │ │ │ │ +105 typedef _S_u_b_d_i_v_i_d_e_r_T_<_ _M_e_s_h_T_y_p_e_,_ _R_e_a_l_T_y_p_e_ _> _p_a_r_e_n_t___t; │ │ │ │ +106 │ │ │ │ +_1_0_8 _C_a_t_m_u_l_l_C_l_a_r_k_T( ) : _p_a_r_e_n_t___t() { } │ │ │ │ +109 │ │ │ │ +_1_1_1 explicit _C_a_t_m_u_l_l_C_l_a_r_k_T(MeshType &_m) : _p_a_r_e_n_t___t(_m) { } │ │ │ │ +112 │ │ │ │ +113 virtual _~_C_a_t_m_u_l_l_C_l_a_r_k_T() {} │ │ │ │ +114 │ │ │ │ +115public: │ │ │ │ 116 │ │ │ │ -117public: │ │ │ │ +_1_1_7 const char *_n_a_m_e() const override { return "Uniform CatmullClark"; } │ │ │ │ 118 │ │ │ │ -125 bool read(const std::string& _filename, │ │ │ │ -126 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -127 _O_p_t_i_o_n_s& _opt); │ │ │ │ -128 │ │ │ │ -135 bool read(std::istream& _filename, │ │ │ │ -136 const std::string& _ext, │ │ │ │ -137 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -138 _O_p_t_i_o_n_s& _opt); │ │ │ │ -139 │ │ │ │ -140 │ │ │ │ -147 bool write(const std::string& _filename, │ │ │ │ -148 _B_a_s_e_E_x_p_o_r_t_e_r& _be, │ │ │ │ -149 _O_p_t_i_o_n_s _opt=Options::Default, │ │ │ │ -150 std::streamsize _precision = 6); │ │ │ │ -151 │ │ │ │ -158 bool write(std::ostream& _filename, │ │ │ │ -159 const std::string& _ext, │ │ │ │ -160 _B_a_s_e_E_x_p_o_r_t_e_r& _be, │ │ │ │ -161 _O_p_t_i_o_n_s _opt=Options::Default, │ │ │ │ -162 std::streamsize _precision = 6); │ │ │ │ -163 │ │ │ │ -164 │ │ │ │ -166 bool can_read( const std::string& _format ) const; │ │ │ │ -167 │ │ │ │ -169 bool can_write( const std::string& _format ) const; │ │ │ │ -170 │ │ │ │ -171 │ │ │ │ -172 size_t _b_i_n_a_r_y___s_i_z_e(const std::string& _format, │ │ │ │ -173 _B_a_s_e_E_x_p_o_r_t_e_r& _be, │ │ │ │ -174 _O_p_t_i_o_n_s _opt = Options::Default) │ │ │ │ -175 { │ │ │ │ -176 const _B_a_s_e_W_r_i_t_e_r *bw = find_writer(_format); │ │ │ │ -177 return bw ? bw->_b_i_n_a_r_y___s_i_z_e(_be,_opt) : 0; │ │ │ │ -178 } │ │ │ │ -179 │ │ │ │ -180 │ │ │ │ -181 │ │ │ │ -182public: //-- QT convenience function --------------------------------------- │ │ │ │ ---- │ │ │ │ -183 │ │ │ │ -184 │ │ │ │ -_1_8_9 const std::string& _q_t___r_e_a_d___f_i_l_t_e_r_s() const { return read_filters_; } │ │ │ │ -190 │ │ │ │ -191 │ │ │ │ -_1_9_6 const std::string& _q_t___w_r_i_t_e___f_i_l_t_e_r_s() const { return write_filters_; } │ │ │ │ -197 │ │ │ │ -198 │ │ │ │ -199 │ │ │ │ -200private: │ │ │ │ -201 │ │ │ │ -202 // collect all readable file extensions │ │ │ │ -203 void update_read_filters(); │ │ │ │ -204 │ │ │ │ -205 │ │ │ │ -206 // collect all writeable file extensions │ │ │ │ -207 void update_write_filters(); │ │ │ │ -208 │ │ │ │ -209 │ │ │ │ -210 │ │ │ │ -211public: //-- SYSTEM PART---------------------------------------------------- │ │ │ │ --- │ │ │ │ -212 │ │ │ │ -213 │ │ │ │ -_2_1_7 bool _r_e_g_i_s_t_e_r___m_o_d_u_l_e(_B_a_s_e_R_e_a_d_e_r* _bl) │ │ │ │ -218 { │ │ │ │ -219 reader_modules_.insert(_bl); │ │ │ │ -220 update_read_filters(); │ │ │ │ -221 return true; │ │ │ │ -222 } │ │ │ │ -223 │ │ │ │ -224 │ │ │ │ -225 │ │ │ │ -_2_2_9 bool _r_e_g_i_s_t_e_r___m_o_d_u_l_e(_B_a_s_e_W_r_i_t_e_r* _bw) │ │ │ │ -230 { │ │ │ │ -231 writer_modules_.insert(_bw); │ │ │ │ -232 update_write_filters(); │ │ │ │ -233 return true; │ │ │ │ -234 } │ │ │ │ -235 │ │ │ │ -236 │ │ │ │ -237private: │ │ │ │ -238 │ │ │ │ -239 const _B_a_s_e_W_r_i_t_e_r *find_writer(const std::string& _format); │ │ │ │ -240 │ │ │ │ -241 // stores registered reader modules │ │ │ │ -242 std::set reader_modules_; │ │ │ │ -243 │ │ │ │ -244 // stores registered writer modules │ │ │ │ -245 std::set writer_modules_; │ │ │ │ -246 │ │ │ │ -247 // input filters (e.g. for Qt file dialog) │ │ │ │ -248 std::string read_filters_; │ │ │ │ -249 │ │ │ │ -250 // output filters (e.g. for Qt file dialog) │ │ │ │ -251 std::string write_filters_; │ │ │ │ -252}; │ │ │ │ -253 │ │ │ │ -254 │ │ │ │ -255// │ │ │ │ -============================================================================= │ │ │ │ -256 │ │ │ │ -257 │ │ │ │ -258//_IOManager_* __IOManager_instance; Causes memory leak, as destructor is │ │ │ │ -never called │ │ │ │ -259 │ │ │ │ -260OPENMESHDLLEXPORT _IOManager_& IOManager(); │ │ │ │ -261 │ │ │ │ -262// │ │ │ │ -============================================================================= │ │ │ │ -263} // namespace IO │ │ │ │ -264} // namespace OpenMesh │ │ │ │ -265// │ │ │ │ +119protected: │ │ │ │ +120 │ │ │ │ +122 virtual bool prepare( MeshType& _m ) override; │ │ │ │ +123 │ │ │ │ +125 virtual bool cleanup( MeshType& _m ) override; │ │ │ │ +126 │ │ │ │ +134 virtual bool subdivide( MeshType& _m, size_t _n , const bool _update_points │ │ │ │ += true) override; │ │ │ │ +135 │ │ │ │ +136private: │ │ │ │ +137 │ │ │ │ +138 // │ │ │ │ +=========================================================================== │ │ │ │ +141 // │ │ │ │ +=========================================================================== │ │ │ │ +142 │ │ │ │ +143 void split_edge( MeshType& _m, const _E_d_g_e_H_a_n_d_l_e& _eh); │ │ │ │ +144 │ │ │ │ +145 void split_face( MeshType& _m, const _F_a_c_e_H_a_n_d_l_e& _fh); │ │ │ │ +146 │ │ │ │ +147 void compute_midpoint( MeshType& _m, const _E_d_g_e_H_a_n_d_l_e& _eh, const bool │ │ │ │ +_update_points); │ │ │ │ +148 │ │ │ │ +149 void update_vertex(MeshType& _m, const _V_e_r_t_e_x_H_a_n_d_l_e& _vh); │ │ │ │ +150 │ │ │ │ +154private: │ │ │ │ +155 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _P_o_i_n_t_ _> vp_pos_; // next vertex pos │ │ │ │ +156 _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_ _P_o_i_n_t_ _> ep_pos_; // new edge pts │ │ │ │ +157 _O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_ _P_o_i_n_t_ _> fp_pos_; // new face pts │ │ │ │ +158 _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_d_o_u_b_l_e_> creaseWeights_;// crease weights │ │ │ │ +159 │ │ │ │ +160}; │ │ │ │ +161 │ │ │ │ +162 │ │ │ │ +163// │ │ │ │ +============================================================================= │ │ │ │ +164} // END_NS_UNIFORM │ │ │ │ +165} // END_NS_SUBDIVIDER │ │ │ │ +166} // END_NS_OPENMESH │ │ │ │ +167// │ │ │ │ +============================================================================= │ │ │ │ +168#if defined(OM_INCLUDE_TEMPLATES) && !defined │ │ │ │ +(OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARK_CC) │ │ │ │ +169# define OPENMESH_SUBDIVIDER_TEMPLATES │ │ │ │ +170# include "CatmullClarkT_impl.hh" │ │ │ │ +171#endif │ │ │ │ +172// │ │ │ │ ============================================================================= │ │ │ │ -266#endif │ │ │ │ -267// │ │ │ │ +173#endif // OPENMESH_SUBDIVIDER_UNIFORM_CATMULLCLARKT_HH defined │ │ │ │ +174// │ │ │ │ ============================================================================= │ │ │ │ +175 │ │ │ │ +_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options │ │ │ │ -_opt=Options::Default) │ │ │ │ -Get binary size of data. │ │ │ │ -DDeeffiinniittiioonn MeshIO.hh:251 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r__ │ │ │ │ -This is the real IOManager class that is later encapsulated by SingletonT to │ │ │ │ -enforce its uniqueness. │ │ │ │ -DDeeffiinniittiioonn IOManager.hh:103 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_q_t___r_e_a_d___f_i_l_t_e_r_s │ │ │ │ -const std::string & qt_read_filters() const │ │ │ │ -Returns all readable file extension + descriptions in one string. │ │ │ │ -DDeeffiinniittiioonn IOManager.hh:189 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_r_e_g_i_s_t_e_r___m_o_d_u_l_e │ │ │ │ -bool register_module(BaseWriter *_bw) │ │ │ │ -Registers a new writer module. │ │ │ │ -DDeeffiinniittiioonn IOManager.hh:229 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_q_t___w_r_i_t_e___f_i_l_t_e_r_s │ │ │ │ -const std::string & qt_write_filters() const │ │ │ │ -Returns all writeable file extension + descriptions in one string. │ │ │ │ -DDeeffiinniittiioonn IOManager.hh:196 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_r_e_g_i_s_t_e_r___m_o_d_u_l_e │ │ │ │ -bool register_module(BaseReader *_bl) │ │ │ │ -Registers a new reader module. │ │ │ │ -DDeeffiinniittiioonn IOManager.hh:217 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_R_e_a_d_e_r │ │ │ │ -Base class for reader modules. │ │ │ │ -DDeeffiinniittiioonn BaseReader.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r │ │ │ │ -Base class for all writer modules. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -virtual size_t binary_size(BaseExporter &, const Options &) const │ │ │ │ -Returns expected size of file if binary format is supported else 0. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_ _P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_ _P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T │ │ │ │ +Based on code from Leon Kos, CAD lab, Mech.Eng., University of Ljubljana, │ │ │ │ +Slovenia (http://www.... │ │ │ │ +DDeeffiinniittiioonn CatmullClarkT.hh:86 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T_:_:_n_a_m_e │ │ │ │ +const char * name() const override │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn CatmullClarkT.hh:117 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T │ │ │ │ +CatmullClarkT(MeshType &_m) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn CatmullClarkT.hh:111 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T_:_:_C_a_t_m_u_l_l_C_l_a_r_k_T │ │ │ │ +CatmullClarkT() │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn CatmullClarkT.hh:108 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00530_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/importer/ImporterT.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/LoopT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
ImporterT.hh
│ │ │ +
LoopT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -138,483 +138,464 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Implements an importer module for arbitrary OpenMesh meshes
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#ifndef __IMPORTERT_HH__
│ │ │ -
53#define __IMPORTERT_HH__
│ │ │ -
54
│ │ │ -
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ +
48//=============================================================================
│ │ │ +
49//
│ │ │ +
50// CLASS LoopT
│ │ │ +
51//
│ │ │ +
52//=============================================================================
│ │ │ +
53
│ │ │ +
54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_LOOPT_HH
│ │ │ +
55#define OPENMESH_SUBDIVIDER_UNIFORM_LOOPT_HH
│ │ │ +
56
│ │ │
57
│ │ │ -
58
│ │ │ -
59#include <OpenMesh/Core/IO/importer/BaseImporter.hh>
│ │ │ -
60#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ -
61#include <OpenMesh/Core/Utils/color_cast.hh>
│ │ │ - │ │ │ - │ │ │ -
64
│ │ │ -
65
│ │ │ -
66//== NAMESPACES ===============================================================
│ │ │ -
67
│ │ │ -
68
│ │ │ -
69namespace OpenMesh {
│ │ │ -
70namespace IO {
│ │ │ +
58//== INCLUDES =================================================================
│ │ │ +
59
│ │ │ +
60#include <OpenMesh/Core/System/config.hh>
│ │ │ + │ │ │ +
62#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ +
63#include <OpenMesh/Core/Utils/Property.hh>
│ │ │ +
64// -------------------- STL
│ │ │ +
65#include <vector>
│ │ │ +
66#if defined(OM_CC_MIPS)
│ │ │ +
67# include <math.h>
│ │ │ +
68#else
│ │ │ +
69# include <cmath>
│ │ │ +
70#endif
│ │ │
71
│ │ │
72
│ │ │ -
73//=== IMPLEMENTATION ==========================================================
│ │ │ +
73//== NAMESPACE ================================================================
│ │ │
74
│ │ │ -
75
│ │ │ -
79template <class Mesh>
│ │ │ -
│ │ │ -
80class ImporterT : public BaseImporter
│ │ │ -
81{
│ │ │ -
82public:
│ │ │ -
83
│ │ │ -
84 typedef typename Mesh::Point Point;
│ │ │ -
85 typedef typename Mesh::Normal Normal;
│ │ │ -
86 typedef typename Mesh::Color Color;
│ │ │ -
87 typedef typename Mesh::TexCoord2D TexCoord2D;
│ │ │ -
88 typedef typename Mesh::TexCoord3D TexCoord3D;
│ │ │ -
89 typedef std::vector<VertexHandle> VHandles;
│ │ │ -
90
│ │ │ -
91
│ │ │ -
92 explicit ImporterT(Mesh& _mesh) : mesh_(_mesh), halfedgeNormals_() {}
│ │ │ -
93
│ │ │ +
75namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
76namespace Subdivider { // BEGIN_NS_DECIMATER
│ │ │ +
77namespace Uniform { // BEGIN_NS_DECIMATER
│ │ │ +
78
│ │ │ +
79
│ │ │ +
80//== CLASS DEFINITION =========================================================
│ │ │ +
81
│ │ │ +
90template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
91class LoopT : public SubdividerT<MeshType, RealType>
│ │ │ +
92{
│ │ │ +
93public:
│ │ │
94
│ │ │ -
95 virtual VertexHandle add_vertex(const Vec3f& _point) override
│ │ │ -
96 {
│ │ │ -
97 return mesh_.add_vertex(vector_cast<Point>(_point));
│ │ │ -
98 }
│ │ │ -
99
│ │ │ -
100 virtual VertexHandle add_vertex(const Vec3d& _point) override
│ │ │ -
101 {
│ │ │ -
102 return mesh_.add_vertex(vector_cast<Point>(_point));
│ │ │ -
103 }
│ │ │ +
95 typedef RealType real_t;
│ │ │ +
96 typedef MeshType mesh_t;
│ │ │ + │ │ │ +
98
│ │ │ +
99 typedef std::pair< real_t, real_t > weight_t;
│ │ │ +
100 typedef std::vector< std::pair<real_t,real_t> > weights_t;
│ │ │ +
101
│ │ │ +
102public:
│ │ │ +
103
│ │ │
104
│ │ │ -
105 virtual VertexHandle add_vertex() override
│ │ │ -
106 {
│ │ │ -
107 return mesh_.new_vertex();
│ │ │ -
108 }
│ │ │ -
109
│ │ │ -
110 virtual HalfedgeHandle add_edge(VertexHandle _vh0, VertexHandle _vh1) override
│ │ │ -
111 {
│ │ │ -
112 return mesh_.new_edge(_vh0, _vh1);
│ │ │ -
113 }
│ │ │ +
105 LoopT(void) : parent_t(), _1over8( 1.0/8.0 ), _3over8( 3.0/8.0 )
│ │ │ +
106 { init_weights(); }
│ │ │ +
107
│ │ │ +
108
│ │ │ +
109 explicit LoopT( mesh_t& _m ) : parent_t(_m), _1over8( 1.0/8.0 ), _3over8( 3.0/8.0 )
│ │ │ +
110 { init_weights(); }
│ │ │ +
111
│ │ │ +
112
│ │ │ +
113 ~LoopT() {}
│ │ │
114
│ │ │ -
115 virtual FaceHandle add_face(const VHandles& _indices) override
│ │ │ -
116 {
│ │ │ -
117 FaceHandle fh;
│ │ │ +
115
│ │ │ +
116public:
│ │ │ +
117
│ │ │
118
│ │ │ -
119 if (_indices.size() > 2)
│ │ │ -
120 {
│ │ │ -
121 VHandles::const_iterator it, it2, end(_indices.end());
│ │ │ -
122
│ │ │ -
123
│ │ │ -
124 // Test if all vertex handles are valid. If not, we throw an error.
│ │ │ -
125 if ( std::any_of(_indices.begin(),_indices.end(),[this](const VertexHandle& vh){ return !mesh_.is_valid_handle(vh); } ) )
│ │ │ -
126 {
│ │ │ -
127 omerr() << "ImporterT: Face contains invalid vertex index\n";
│ │ │ -
128 return fh;
│ │ │ -
129 }
│ │ │ -
130
│ │ │ -
131 // don't allow double vertices
│ │ │ -
132 for (it=_indices.begin(); it!=end; ++it)
│ │ │ -
133 for (it2=it+1; it2!=end; ++it2)
│ │ │ -
134 if (*it == *it2)
│ │ │ -
135 {
│ │ │ -
136 omerr() << "ImporterT: Face has equal vertices\n";
│ │ │ -
137 return fh;
│ │ │ -
138 }
│ │ │ +
119 const char *name() const override { return "Uniform Loop"; }
│ │ │ +
120
│ │ │ +
121
│ │ │ +
│ │ │ +
123 void init_weights(size_t _max_valence=50)
│ │ │ +
124 {
│ │ │ +
125 weights_.resize(_max_valence);
│ │ │ +
126 std::generate(weights_.begin(), weights_.end(), compute_weight());
│ │ │ +
127 }
│ │ │ +
│ │ │ +
128
│ │ │ +
129
│ │ │ +
130protected:
│ │ │ +
131
│ │ │ +
132
│ │ │ +
│ │ │ +
133 bool prepare( mesh_t& _m ) override
│ │ │ +
134 {
│ │ │ +
135 _m.add_property( vp_pos_ );
│ │ │ +
136 _m.add_property( ep_pos_ );
│ │ │ +
137 return true;
│ │ │ +
138 }
│ │ │ +
│ │ │
139
│ │ │
140
│ │ │ -
141 // try to add face
│ │ │ -
142 fh = mesh_.add_face(_indices);
│ │ │ -
143 // separate non-manifold faces and mark them
│ │ │ -
144 if (!fh.is_valid())
│ │ │ -
145 {
│ │ │ -
146 VHandles vhandles(_indices.size());
│ │ │ +
│ │ │ +
141 bool cleanup( mesh_t& _m ) override
│ │ │ +
142 {
│ │ │ +
143 _m.remove_property( vp_pos_ );
│ │ │ +
144 _m.remove_property( ep_pos_ );
│ │ │ +
145 return true;
│ │ │ +
146 }
│ │ │ +
│ │ │
147
│ │ │ -
148 // double vertices
│ │ │ -
149 for (unsigned int j=0; j<_indices.size(); ++j)
│ │ │ -
150 {
│ │ │ -
151 // DO STORE p, reference may not work since vertex array
│ │ │ -
152 // may be relocated after adding a new vertex !
│ │ │ -
153 Point p = mesh_.point(_indices[j]);
│ │ │ -
154 vhandles[j] = mesh_.add_vertex(p);
│ │ │ -
155
│ │ │ -
156 // Mark vertices of failed face as non-manifold
│ │ │ -
157 if (mesh_.has_vertex_status()) {
│ │ │ -
158 mesh_.status(vhandles[j]).set_fixed_nonmanifold(true);
│ │ │ -
159 }
│ │ │ -
160 }
│ │ │ +
148
│ │ │ +
│ │ │ +
149 bool subdivide( mesh_t& _m, size_t _n, const bool _update_points = true) override
│ │ │ +
150 {
│ │ │ +
151
│ │ │ +
153
│ │ │ +
154 typename mesh_t::FaceIter fit, f_end;
│ │ │ +
155 typename mesh_t::EdgeIter eit, e_end;
│ │ │ +
156 typename mesh_t::VertexIter vit;
│ │ │ +
157
│ │ │ +
158 // Do _n subdivisions
│ │ │ +
159 for (size_t i=0; i < _n; ++i)
│ │ │ +
160 {
│ │ │
161
│ │ │ -
162 // add face
│ │ │ -
163 fh = mesh_.add_face(vhandles);
│ │ │ -
164
│ │ │ -
165 // Mark failed face as non-manifold
│ │ │ -
166 if (mesh_.has_face_status())
│ │ │ -
167 mesh_.status(fh).set_fixed_nonmanifold(true);
│ │ │ +
162 if(_update_points) {
│ │ │ +
163 // compute new positions for old vertices
│ │ │ +
164 for (vit = _m.vertices_begin(); vit != _m.vertices_end(); ++vit) {
│ │ │ +
165 smooth(_m, *vit);
│ │ │ +
166 }
│ │ │ +
167 }
│ │ │
168
│ │ │ -
169 // Mark edges of failed face as non-two-manifold
│ │ │ -
170 if (mesh_.has_edge_status()) {
│ │ │ -
171 typename Mesh::FaceEdgeIter fe_it = mesh_.fe_iter(fh);
│ │ │ -
172 for(; fe_it.is_valid(); ++fe_it) {
│ │ │ -
173 mesh_.status(*fe_it).set_fixed_nonmanifold(true);
│ │ │ -
174 }
│ │ │ -
175 }
│ │ │ -
176 }
│ │ │ -
177
│ │ │ -
178 //write the half edge normals
│ │ │ -
179 if (mesh_.has_halfedge_normals())
│ │ │ -
180 {
│ │ │ -
181 //iterate over all incoming haldedges of the added face
│ │ │ -
182 for (typename Mesh::FaceHalfedgeIter fh_iter = mesh_.fh_begin(fh);
│ │ │ -
183 fh_iter != mesh_.fh_end(fh); ++fh_iter)
│ │ │ -
184 {
│ │ │ -
185 //and write the normals to it
│ │ │ -
186 typename Mesh::HalfedgeHandle heh = *fh_iter;
│ │ │ -
187 typename Mesh::VertexHandle vh = mesh_.to_vertex_handle(heh);
│ │ │ -
188 typename std::map<VertexHandle,Normal>::iterator it_heNs = halfedgeNormals_.find(vh);
│ │ │ -
189 if (it_heNs != halfedgeNormals_.end())
│ │ │ -
190 mesh_.set_normal(heh,it_heNs->second);
│ │ │ -
191 }
│ │ │ -
192 halfedgeNormals_.clear();
│ │ │ +
169 // Compute position for new vertices and store them in the edge property
│ │ │ +
170 for (eit=_m.edges_begin(); eit != _m.edges_end(); ++eit)
│ │ │ +
171 compute_midpoint( _m, *eit );
│ │ │ +
172
│ │ │ +
173 // Split each edge at midpoint and store precomputed positions (stored in
│ │ │ +
174 // edge property ep_pos_) in the vertex property vp_pos_;
│ │ │ +
175
│ │ │ +
176 // Attention! Creating new edges, hence make sure the loop ends correctly.
│ │ │ +
177 for (auto eh : _m.edges())
│ │ │ +
178 split_edge(_m, eh );
│ │ │ +
179
│ │ │ +
180
│ │ │ +
181 // Commit changes in topology and reconsitute consistency
│ │ │ +
182
│ │ │ +
183 // Attention! Creating new faces, hence make sure the loop ends correctly.
│ │ │ +
184 for (auto fh : _m.faces())
│ │ │ +
185 split_face(_m, fh );
│ │ │ +
186
│ │ │ +
187 if(_update_points) {
│ │ │ +
188 // Commit changes in geometry
│ │ │ +
189 for ( vit = _m.vertices_begin();
│ │ │ +
190 vit != _m.vertices_end(); ++vit) {
│ │ │ +
191 _m.set_point(*vit, _m.property( vp_pos_, *vit ) );
│ │ │ +
192 }
│ │ │
193 }
│ │ │ -
194 }
│ │ │ -
195 return fh;
│ │ │ -
196 }
│ │ │ -
197
│ │ │ -
198 virtual FaceHandle add_face(HalfedgeHandle _heh) override
│ │ │ -
199 {
│ │ │ -
200 auto fh = mesh_.new_face();
│ │ │ -
201 mesh_.set_halfedge_handle(fh, _heh);
│ │ │ -
202 return fh;
│ │ │ +
194
│ │ │ +
195
│ │ │ +
196#if defined(_DEBUG) || defined(DEBUG)
│ │ │ +
197 // Now we have an consistent mesh!
│ │ │ +
198 assert( OpenMesh::Utils::MeshCheckerT<mesh_t>(_m).check() );
│ │ │ +
199#endif
│ │ │ +
200 }
│ │ │ +
201
│ │ │ +
202 return true;
│ │ │
203 }
│ │ │ +
│ │ │
204
│ │ │ -
205 // vertex attributes
│ │ │ +
205private:
│ │ │
206
│ │ │ -
207 virtual void set_point(VertexHandle _vh, const Vec3f& _point) override
│ │ │ -
208 {
│ │ │ -
209 mesh_.set_point(_vh,vector_cast<Point>(_point));
│ │ │ -
210 }
│ │ │ -
211
│ │ │ -
212 virtual void set_halfedge(VertexHandle _vh, HalfedgeHandle _heh) override
│ │ │ -
213 {
│ │ │ -
214 mesh_.set_halfedge_handle(_vh, _heh);
│ │ │ -
215 }
│ │ │ -
216
│ │ │ -
217 virtual void set_normal(VertexHandle _vh, const Vec3f& _normal) override
│ │ │ -
218 {
│ │ │ -
219 if (mesh_.has_vertex_normals())
│ │ │ -
220 mesh_.set_normal(_vh, vector_cast<Normal>(_normal));
│ │ │ -
221
│ │ │ -
222 //saves normals for half edges.
│ │ │ -
223 //they will be written, when the face is added
│ │ │ -
224 if (mesh_.has_halfedge_normals())
│ │ │ -
225 halfedgeNormals_[_vh] = vector_cast<Normal>(_normal);
│ │ │ -
226 }
│ │ │ -
227
│ │ │ -
228 virtual void set_normal(VertexHandle _vh, const Vec3d& _normal) override
│ │ │ -
229 {
│ │ │ -
230 if (mesh_.has_vertex_normals())
│ │ │ -
231 mesh_.set_normal(_vh, vector_cast<Normal>(_normal));
│ │ │ -
232
│ │ │ -
233 //saves normals for half edges.
│ │ │ -
234 //they will be written, when the face is added
│ │ │ -
235 if (mesh_.has_halfedge_normals())
│ │ │ -
236 halfedgeNormals_[_vh] = vector_cast<Normal>(_normal);
│ │ │ -
237 }
│ │ │ -
238
│ │ │ -
239 virtual void set_color(VertexHandle _vh, const Vec4uc& _color) override
│ │ │ -
240 {
│ │ │ -
241 if (mesh_.has_vertex_colors())
│ │ │ -
242 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ -
243 }
│ │ │ -
244
│ │ │ -
245 virtual void set_color(VertexHandle _vh, const Vec3uc& _color) override
│ │ │ -
246 {
│ │ │ -
247 if (mesh_.has_vertex_colors())
│ │ │ -
248 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ -
249 }
│ │ │ -
250
│ │ │ -
251 virtual void set_color(VertexHandle _vh, const Vec4f& _color) override
│ │ │ -
252 {
│ │ │ -
253 if (mesh_.has_vertex_colors())
│ │ │ -
254 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ -
255 }
│ │ │ -
256
│ │ │ -
257 virtual void set_color(VertexHandle _vh, const Vec3f& _color) override
│ │ │ -
258 {
│ │ │ -
259 if (mesh_.has_vertex_colors())
│ │ │ -
260 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ -
261 }
│ │ │ +
209 struct compute_weight
│ │ │ +
210 {
│ │ │ +
211 compute_weight() : valence(-1) { }
│ │ │ +
212 weight_t operator() (void)
│ │ │ +
213 {
│ │ │ +
214#if !defined(OM_CC_MIPS)
│ │ │ +
215 using std::cos;
│ │ │ +
216#endif
│ │ │ +
217 // 1
│ │ │ +
218 // alpha(n) = ---- * (40 - ( 3 + 2 cos( 2 Pi / n ) )� )
│ │ │ +
219 // 64
│ │ │ +
220
│ │ │ +
221 if (++valence)
│ │ │ +
222 {
│ │ │ +
223 double inv_v = 1.0/double(valence);
│ │ │ +
224 double t = (3.0 + 2.0 * cos( 2.0 * M_PI * inv_v) );
│ │ │ +
225 double alpha = (40.0 - t * t)/64.0;
│ │ │ +
226
│ │ │ +
227 return weight_t( static_cast<real_t>(1.0-alpha), static_cast<real_t>(inv_v*alpha) );
│ │ │ +
228 }
│ │ │ +
229 return weight_t(static_cast<real_t>(0.0), static_cast<real_t>(0.0));
│ │ │ +
230 }
│ │ │ +
231 int valence;
│ │ │ +
232 };
│ │ │ +
233
│ │ │ +
234private: // topological modifiers
│ │ │ +
235
│ │ │ +
236 void split_face(mesh_t& _m, const typename mesh_t::FaceHandle& _fh)
│ │ │ +
237 {
│ │ │ + │ │ │ +
239 heh1(_m.halfedge_handle(_fh)),
│ │ │ +
240 heh2(_m.next_halfedge_handle(_m.next_halfedge_handle(heh1))),
│ │ │ +
241 heh3(_m.next_halfedge_handle(_m.next_halfedge_handle(heh2)));
│ │ │ +
242
│ │ │ +
243 // Cutting off every corner of the 6_gon
│ │ │ +
244 corner_cutting( _m, heh1 );
│ │ │ +
245 corner_cutting( _m, heh2 );
│ │ │ +
246 corner_cutting( _m, heh3 );
│ │ │ +
247 }
│ │ │ +
248
│ │ │ +
249
│ │ │ +
250 void corner_cutting(mesh_t& _m, const typename mesh_t::HalfedgeHandle& _he)
│ │ │ +
251 {
│ │ │ +
252 // Define Halfedge Handles
│ │ │ + │ │ │ +
254 heh1(_he),
│ │ │ +
255 heh5(heh1),
│ │ │ +
256 heh6(_m.next_halfedge_handle(heh1));
│ │ │ +
257
│ │ │ +
258 // Cycle around the polygon to find correct Halfedge
│ │ │ +
259 for (; _m.next_halfedge_handle(_m.next_halfedge_handle(heh5)) != heh1;
│ │ │ +
260 heh5 = _m.next_halfedge_handle(heh5))
│ │ │ +
261 {}
│ │ │
262
│ │ │ -
263 virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord) override
│ │ │ -
264 {
│ │ │ -
265 if (mesh_.has_vertex_texcoords2D())
│ │ │ -
266 mesh_.set_texcoord2D(_vh, vector_cast<TexCoord2D>(_texcoord));
│ │ │ -
267 }
│ │ │ -
268
│ │ │ -
269 virtual void set_status(VertexHandle _vh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ -
270 {
│ │ │ -
271 if (!mesh_.has_vertex_status())
│ │ │ -
272 mesh_.request_vertex_status();
│ │ │ -
273 mesh_.status(_vh) = _status;
│ │ │ -
274 }
│ │ │ -
275
│ │ │ -
276 virtual void set_next(HalfedgeHandle _heh, HalfedgeHandle _next) override
│ │ │ -
277 {
│ │ │ -
278 mesh_.set_next_halfedge_handle(_heh, _next);
│ │ │ -
279 }
│ │ │ -
280
│ │ │ -
281 virtual void set_face(HalfedgeHandle _heh, FaceHandle _fh) override
│ │ │ -
282 {
│ │ │ -
283 mesh_.set_face_handle(_heh, _fh);
│ │ │ -
284 }
│ │ │ -
285
│ │ │ -
286 virtual void request_face_texcoords2D() override
│ │ │ -
287 {
│ │ │ -
288 if(!mesh_.has_halfedge_texcoords2D())
│ │ │ -
289 mesh_.request_halfedge_texcoords2D();
│ │ │ -
290 }
│ │ │ -
291
│ │ │ -
292 virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) override
│ │ │ -
293 {
│ │ │ -
294 if (mesh_.has_halfedge_texcoords2D())
│ │ │ -
295 mesh_.set_texcoord2D(_heh, vector_cast<TexCoord2D>(_texcoord));
│ │ │ -
296 }
│ │ │ -
297
│ │ │ -
298 virtual void set_texcoord(VertexHandle _vh, const Vec3f& _texcoord) override
│ │ │ -
299 {
│ │ │ -
300 if (mesh_.has_vertex_texcoords3D())
│ │ │ -
301 mesh_.set_texcoord3D(_vh, vector_cast<TexCoord3D>(_texcoord));
│ │ │ -
302 }
│ │ │ -
303
│ │ │ -
304 virtual void set_texcoord(HalfedgeHandle _heh, const Vec3f& _texcoord) override
│ │ │ -
305 {
│ │ │ -
306 if (mesh_.has_halfedge_texcoords3D())
│ │ │ -
307 mesh_.set_texcoord3D(_heh, vector_cast<TexCoord3D>(_texcoord));
│ │ │ +
263 typename mesh_t::VertexHandle
│ │ │ +
264 vh1 = _m.to_vertex_handle(heh1),
│ │ │ +
265 vh2 = _m.to_vertex_handle(heh5);
│ │ │ +
266
│ │ │ + │ │ │ +
268 heh2(_m.next_halfedge_handle(heh5)),
│ │ │ +
269 heh3(_m.new_edge( vh1, vh2)),
│ │ │ +
270 heh4(_m.opposite_halfedge_handle(heh3));
│ │ │ +
271
│ │ │ +
272 /* Intermediate result
│ │ │ +
273 *
│ │ │ +
274 * *
│ │ │ +
275 * 5 /|\
│ │ │ +
276 * /_ \
│ │ │ +
277 * vh2> * *
│ │ │ +
278 * /|\3 |\
│ │ │ +
279 * /_ \|4 \
│ │ │ +
280 * *----\*----\*
│ │ │ +
281 * 1 ^ 6
│ │ │ +
282 * vh1 (adjust_outgoing halfedge!)
│ │ │ +
283 */
│ │ │ +
284
│ │ │ +
285 // Old and new Face
│ │ │ +
286 typename mesh_t::FaceHandle fh_old(_m.face_handle(heh6));
│ │ │ +
287 typename mesh_t::FaceHandle fh_new(_m.new_face());
│ │ │ +
288
│ │ │ +
289
│ │ │ +
290 // Re-Set Handles around old Face
│ │ │ +
291 _m.set_next_halfedge_handle(heh4, heh6);
│ │ │ +
292 _m.set_next_halfedge_handle(heh5, heh4);
│ │ │ +
293
│ │ │ +
294 _m.set_face_handle(heh4, fh_old);
│ │ │ +
295 _m.set_face_handle(heh5, fh_old);
│ │ │ +
296 _m.set_face_handle(heh6, fh_old);
│ │ │ +
297 _m.set_halfedge_handle(fh_old, heh4);
│ │ │ +
298
│ │ │ +
299 // Re-Set Handles around new Face
│ │ │ +
300 _m.set_next_halfedge_handle(heh1, heh3);
│ │ │ +
301 _m.set_next_halfedge_handle(heh3, heh2);
│ │ │ +
302
│ │ │ +
303 _m.set_face_handle(heh1, fh_new);
│ │ │ +
304 _m.set_face_handle(heh2, fh_new);
│ │ │ +
305 _m.set_face_handle(heh3, fh_new);
│ │ │ +
306
│ │ │ +
307 _m.set_halfedge_handle(fh_new, heh1);
│ │ │
308 }
│ │ │
309
│ │ │ -
310 virtual void set_status(HalfedgeHandle _heh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ -
311 {
│ │ │ -
312 if (!mesh_.has_halfedge_status())
│ │ │ -
313 mesh_.request_halfedge_status();
│ │ │ -
314 mesh_.status(_heh) = _status;
│ │ │ -
315 }
│ │ │ +
310
│ │ │ +
311 void split_edge(mesh_t& _m, const typename mesh_t::EdgeHandle& _eh)
│ │ │ +
312 {
│ │ │ + │ │ │ +
314 heh = _m.halfedge_handle(_eh, 0),
│ │ │ +
315 opp_heh = _m.halfedge_handle(_eh, 1);
│ │ │
316
│ │ │ -
317 // edge attributes
│ │ │ -
318
│ │ │ -
319 virtual void set_color(EdgeHandle _eh, const Vec4uc& _color) override
│ │ │ -
320 {
│ │ │ -
321 if (mesh_.has_edge_colors())
│ │ │ -
322 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ -
323 }
│ │ │ -
324
│ │ │ -
325 virtual void set_color(EdgeHandle _eh, const Vec3uc& _color) override
│ │ │ -
326 {
│ │ │ -
327 if (mesh_.has_edge_colors())
│ │ │ -
328 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ -
329 }
│ │ │ +
317 typename mesh_t::HalfedgeHandle new_heh, opp_new_heh, t_heh;
│ │ │ +
318 typename mesh_t::VertexHandle vh;
│ │ │ +
319 typename mesh_t::VertexHandle vh1(_m.to_vertex_handle(heh));
│ │ │ +
320 typename mesh_t::Point midP(_m.point(_m.to_vertex_handle(heh)));
│ │ │ +
321 midP += _m.point(_m.to_vertex_handle(opp_heh));
│ │ │ +
322 midP *= static_cast<RealType>(0.5);
│ │ │ +
323
│ │ │ +
324 // new vertex
│ │ │ +
325 vh = _m.new_vertex( midP );
│ │ │ +
326
│ │ │ +
327 // memorize position, will be set later
│ │ │ +
328 _m.property( vp_pos_, vh ) = _m.property( ep_pos_, _eh );
│ │ │ +
329
│ │ │
330
│ │ │ -
331 virtual void set_color(EdgeHandle _eh, const Vec4f& _color) override
│ │ │ -
332 {
│ │ │ -
333 if (mesh_.has_edge_colors())
│ │ │ -
334 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ -
335 }
│ │ │ -
336
│ │ │ -
337 virtual void set_color(EdgeHandle _eh, const Vec3f& _color) override
│ │ │ -
338 {
│ │ │ -
339 if (mesh_.has_edge_colors())
│ │ │ -
340 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ -
341 }
│ │ │ -
342
│ │ │ -
343 virtual void set_status(EdgeHandle _eh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ -
344 {
│ │ │ -
345 if (!mesh_.has_edge_status())
│ │ │ -
346 mesh_.request_edge_status();
│ │ │ -
347 mesh_.status(_eh) = _status;
│ │ │ -
348 }
│ │ │ -
349
│ │ │ -
350 // face attributes
│ │ │ -
351
│ │ │ -
352 virtual void set_normal(FaceHandle _fh, const Vec3f& _normal) override
│ │ │ -
353 {
│ │ │ -
354 if (mesh_.has_face_normals())
│ │ │ -
355 mesh_.set_normal(_fh, vector_cast<Normal>(_normal));
│ │ │ -
356 }
│ │ │ -
357
│ │ │ -
358 virtual void set_normal(FaceHandle _fh, const Vec3d& _normal) override
│ │ │ -
359 {
│ │ │ -
360 if (mesh_.has_face_normals())
│ │ │ -
361 mesh_.set_normal(_fh, vector_cast<Normal>(_normal));
│ │ │ -
362 }
│ │ │ -
363
│ │ │ -
364 virtual void set_color(FaceHandle _fh, const Vec3uc& _color) override
│ │ │ -
365 {
│ │ │ -
366 if (mesh_.has_face_colors())
│ │ │ -
367 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ -
368 }
│ │ │ -
369
│ │ │ -
370 virtual void set_color(FaceHandle _fh, const Vec4uc& _color) override
│ │ │ -
371 {
│ │ │ -
372 if (mesh_.has_face_colors())
│ │ │ -
373 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ +
331 // Re-link mesh entities
│ │ │ +
332 if (_m.is_boundary(_eh))
│ │ │ +
333 {
│ │ │ +
334 for (t_heh = heh;
│ │ │ +
335 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
336 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh)))
│ │ │ +
337 {}
│ │ │ +
338 }
│ │ │ +
339 else
│ │ │ +
340 {
│ │ │ +
341 for (t_heh = _m.next_halfedge_handle(opp_heh);
│ │ │ +
342 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
343 t_heh = _m.next_halfedge_handle(t_heh) )
│ │ │ +
344 {}
│ │ │ +
345 }
│ │ │ +
346
│ │ │ +
347 new_heh = _m.new_edge(vh, vh1);
│ │ │ +
348 opp_new_heh = _m.opposite_halfedge_handle(new_heh);
│ │ │ +
349 _m.set_vertex_handle( heh, vh );
│ │ │ +
350
│ │ │ +
351 _m.set_next_halfedge_handle(t_heh, opp_new_heh);
│ │ │ +
352 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh));
│ │ │ +
353 _m.set_next_halfedge_handle(heh, new_heh);
│ │ │ +
354 _m.set_next_halfedge_handle(opp_new_heh, opp_heh);
│ │ │ +
355
│ │ │ +
356 if (_m.face_handle(opp_heh).is_valid())
│ │ │ +
357 {
│ │ │ +
358 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh));
│ │ │ +
359 _m.set_halfedge_handle(_m.face_handle(opp_new_heh), opp_new_heh);
│ │ │ +
360 }
│ │ │ +
361
│ │ │ +
362 _m.set_face_handle( new_heh, _m.face_handle(heh) );
│ │ │ +
363 _m.set_halfedge_handle( vh, new_heh);
│ │ │ +
364
│ │ │ +
365 // We cant reconnect a non existing face, so we skip this here if necessary
│ │ │ +
366 if ( !_m.is_boundary(heh) )
│ │ │ +
367 _m.set_halfedge_handle( _m.face_handle(heh), heh );
│ │ │ +
368
│ │ │ +
369 _m.set_halfedge_handle( vh1, opp_new_heh );
│ │ │ +
370
│ │ │ +
371 // Never forget this, when playing with the topology
│ │ │ +
372 _m.adjust_outgoing_halfedge( vh );
│ │ │ +
373 _m.adjust_outgoing_halfedge( vh1 );
│ │ │
374 }
│ │ │
375
│ │ │ -
376 virtual void set_color(FaceHandle _fh, const Vec3f& _color) override
│ │ │ -
377 {
│ │ │ -
378 if (mesh_.has_face_colors())
│ │ │ -
379 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ -
380 }
│ │ │ -
381
│ │ │ -
382 virtual void set_color(FaceHandle _fh, const Vec4f& _color) override
│ │ │ -
383 {
│ │ │ -
384 if (mesh_.has_face_colors())
│ │ │ -
385 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ -
386 }
│ │ │ -
387
│ │ │ -
388 virtual void set_status(FaceHandle _fh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ -
389 {
│ │ │ -
390 if (!mesh_.has_face_status())
│ │ │ -
391 mesh_.request_face_status();
│ │ │ -
392 mesh_.status(_fh) = _status;
│ │ │ -
393 }
│ │ │ -
394
│ │ │ -
395 virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec2f>& _face_texcoords) override
│ │ │ -
396 {
│ │ │ -
397 // get first halfedge handle
│ │ │ -
398 HalfedgeHandle cur_heh = mesh_.halfedge_handle(_fh);
│ │ │ -
399 HalfedgeHandle end_heh = mesh_.prev_halfedge_handle(cur_heh);
│ │ │ -
400
│ │ │ -
401 // find start heh
│ │ │ -
402 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh )
│ │ │ -
403 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ -
404
│ │ │ -
405 for(unsigned int i=0; i<_face_texcoords.size(); ++i)
│ │ │ -
406 {
│ │ │ -
407 set_texcoord( cur_heh, _face_texcoords[i]);
│ │ │ -
408 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ -
409 }
│ │ │ -
410 }
│ │ │ -
411
│ │ │ -
412 virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec3f>& _face_texcoords) override
│ │ │ -
413 {
│ │ │ -
414 // get first halfedge handle
│ │ │ -
415 HalfedgeHandle cur_heh = mesh_.halfedge_handle(_fh);
│ │ │ -
416 HalfedgeHandle end_heh = mesh_.prev_halfedge_handle(cur_heh);
│ │ │ -
417
│ │ │ -
418 // find start heh
│ │ │ -
419 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh )
│ │ │ -
420 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ +
376private: // geometry helper
│ │ │ +
377
│ │ │ +
378 void compute_midpoint(mesh_t& _m, const typename mesh_t::EdgeHandle& _eh)
│ │ │ +
379 {
│ │ │ +
380#define V( X ) vector_cast< typename mesh_t::Normal >( X )
│ │ │ +
381 typename mesh_t::HalfedgeHandle heh, opp_heh;
│ │ │ +
382
│ │ │ +
383 heh = _m.halfedge_handle( _eh, 0);
│ │ │ +
384 opp_heh = _m.halfedge_handle( _eh, 1);
│ │ │ +
385
│ │ │ +
386 typename mesh_t::Point
│ │ │ +
387 pos(_m.point(_m.to_vertex_handle(heh)));
│ │ │ +
388
│ │ │ +
389 pos += V( _m.point(_m.to_vertex_handle(opp_heh)) );
│ │ │ +
390
│ │ │ +
391 // boundary edge: just average vertex positions
│ │ │ +
392 if (_m.is_boundary(_eh) )
│ │ │ +
393 {
│ │ │ +
394 pos *= static_cast<RealType>(0.5);
│ │ │ +
395 }
│ │ │ +
396 else // inner edge: add neighbouring Vertices to sum
│ │ │ +
397 {
│ │ │ +
398 pos *= real_t(3.0);
│ │ │ +
399 pos += V(_m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh))));
│ │ │ +
400 pos += V(_m.point(_m.to_vertex_handle(_m.next_halfedge_handle(opp_heh))));
│ │ │ +
401 pos *= _1over8;
│ │ │ +
402 }
│ │ │ +
403 _m.property( ep_pos_, _eh ) = pos;
│ │ │ +
404#undef V
│ │ │ +
405 }
│ │ │ +
406
│ │ │ +
407 void smooth(mesh_t& _m, const typename mesh_t::VertexHandle& _vh)
│ │ │ +
408 {
│ │ │ +
409 typename mesh_t::Point pos(0.0,0.0,0.0);
│ │ │ +
410
│ │ │ +
411 if (_m.is_boundary(_vh) ) // if boundary: Point 1-6-1
│ │ │ +
412 {
│ │ │ +
413 typename mesh_t::HalfedgeHandle heh, prev_heh;
│ │ │ +
414 heh = _m.halfedge_handle( _vh );
│ │ │ +
415
│ │ │ +
416 if ( heh.is_valid() )
│ │ │ +
417 {
│ │ │ +
418 assert( _m.is_boundary( _m.edge_handle( heh ) ) );
│ │ │ +
419
│ │ │ +
420 prev_heh = _m.prev_halfedge_handle( heh );
│ │ │
421
│ │ │ -
422 for(unsigned int i=0; i<_face_texcoords.size(); ++i)
│ │ │ -
423 {
│ │ │ -
424 set_texcoord( cur_heh, _face_texcoords[i]);
│ │ │ -
425 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ -
426 }
│ │ │ -
427 }
│ │ │ -
428
│ │ │ -
429 virtual void set_face_texindex( FaceHandle _fh, int _texId ) override
│ │ │ -
430 {
│ │ │ -
431 if ( mesh_.has_face_texture_index() ) {
│ │ │ -
432 mesh_.set_texture_index(_fh , _texId);
│ │ │ -
433 }
│ │ │ -
434 }
│ │ │ -
435
│ │ │ -
436 virtual void add_texture_information( int _id , std::string _name ) override
│ │ │ -
437 {
│ │ │ - │ │ │ -
439
│ │ │ -
440 if ( !mesh_.get_property_handle(property,"TextureMapping") ) {
│ │ │ -
441 mesh_.add_property(property,"TextureMapping");
│ │ │ -
442 }
│ │ │ -
443
│ │ │ -
444 if ( mesh_.property(property).find( _id ) == mesh_.property(property).end() ) {
│ │ │ -
445 mesh_.property(property)[_id] = _name;
│ │ │ -
446 }
│ │ │ -
447 }
│ │ │ -
448
│ │ │ -
449 // low-level access to mesh
│ │ │ -
450
│ │ │ -
451 virtual BaseKernel* kernel() override { return &mesh_; }
│ │ │ +
422 typename mesh_t::VertexHandle
│ │ │ +
423 to_vh = _m.to_vertex_handle( heh ),
│ │ │ +
424 from_vh = _m.from_vertex_handle( prev_heh );
│ │ │ +
425
│ │ │ +
426 // ( v_l + 6 v + v_r ) / 8
│ │ │ +
427 pos = _m.point( _vh );
│ │ │ +
428 pos *= real_t(6.0);
│ │ │ +
429 pos += vector_cast< typename mesh_t::Normal >( _m.point( to_vh ) );
│ │ │ +
430 pos += vector_cast< typename mesh_t::Normal >( _m.point( from_vh ) );
│ │ │ +
431 pos *= _1over8;
│ │ │ +
432
│ │ │ +
433 }
│ │ │ +
434 else
│ │ │ +
435 return;
│ │ │ +
436 }
│ │ │ +
437 else // inner vertex: (1-a) * p + a/n * Sum q, q in one-ring of p
│ │ │ +
438 {
│ │ │ +
439 typedef typename mesh_t::Normal Vec;
│ │ │ +
440 typename mesh_t::VertexVertexIter vvit;
│ │ │ +
441 size_t valence(0);
│ │ │ +
442
│ │ │ +
443 // Calculate Valence and sum up neighbour points
│ │ │ +
444 for (vvit=_m.vv_iter(_vh); vvit.is_valid(); ++vvit) {
│ │ │ +
445 ++valence;
│ │ │ +
446 pos += vector_cast< Vec >( _m.point(*vvit) );
│ │ │ +
447 }
│ │ │ +
448 pos *= weights_[valence].second; // alpha(n)/n * Sum q, q in one-ring of p
│ │ │ +
449 pos += weights_[valence].first
│ │ │ +
450 * vector_cast<Vec>(_m.point(_vh)); // + (1-a)*p
│ │ │ +
451 }
│ │ │
452
│ │ │ -
453 bool is_triangle_mesh() const override
│ │ │ -
454 { return Mesh::is_triangles(); }
│ │ │ +
453 _m.property( vp_pos_, _vh ) = pos;
│ │ │ +
454 }
│ │ │
455
│ │ │ -
456 void reserve(unsigned int nV, unsigned int nE, unsigned int nF) override
│ │ │ -
457 {
│ │ │ -
458 mesh_.reserve(nV, nE, nF);
│ │ │ -
459 }
│ │ │ +
456private: // data
│ │ │ +
457
│ │ │ + │ │ │ + │ │ │
460
│ │ │ -
461 // query number of faces, vertices, normals, texcoords
│ │ │ -
462 size_t n_vertices() const override { return mesh_.n_vertices(); }
│ │ │ -
463 size_t n_faces() const override { return mesh_.n_faces(); }
│ │ │ -
464 size_t n_edges() const override { return mesh_.n_edges(); }
│ │ │ +
461 weights_t weights_;
│ │ │ +
462
│ │ │ +
463 const real_t _1over8;
│ │ │ +
464 const real_t _3over8;
│ │ │
465
│ │ │ -
466
│ │ │ -
467 void prepare() override{ }
│ │ │ +
466};
│ │ │ +
│ │ │ +
467
│ │ │
468
│ │ │ -
469
│ │ │ -
470 void finish() override { }
│ │ │ -
471
│ │ │ -
472
│ │ │ -
473private:
│ │ │ -
474
│ │ │ -
475 Mesh& mesh_;
│ │ │ -
476 // stores normals for halfedges of the next face
│ │ │ -
477 std::map<VertexHandle,Normal> halfedgeNormals_;
│ │ │ -
478};
│ │ │ -
│ │ │ -
479
│ │ │ -
480
│ │ │ -
481//=============================================================================
│ │ │ -
482} // namespace IO
│ │ │ -
483} // namespace OpenMesh
│ │ │ -
484//=============================================================================
│ │ │ -
485#endif
│ │ │ -
486//=============================================================================
│ │ │ -
This file provides some macros containing attribute usage.
│ │ │ -
This file provides the streams omlog, omout, and omerr.
│ │ │ +
469//=============================================================================
│ │ │ +
470} // END_NS_UNIFORM
│ │ │ +
471} // END_NS_SUBDIVIDER
│ │ │ +
472} // END_NS_OPENMESH
│ │ │ +
473//=============================================================================
│ │ │ +
474#endif // OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITELOOPT_HH defined
│ │ │ +
475//=============================================================================
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ - │ │ │ - │ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ -
This class template provides an importer module for OpenMesh meshes.
Definition ImporterT.hh:81
│ │ │ -
This class provides low-level property management like adding/removing properties and access to prope...
Definition BaseKernel.hh:98
│ │ │ -
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition PolyMeshT.hh:169
│ │ │ +
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │
SmartVertexHandle new_vertex()
Uses default copy and assignment operator.
Definition PolyMeshT.hh:201
│ │ │ -
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition PolyMeshT.hh:120
│ │ │ -
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition PolyMeshT.hh:122
│ │ │ -
SmartVertexHandle add_vertex(const Point _p)
Alias for new_vertex(const Point&).
Definition PolyMeshT.hh:238
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ -
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:168
│ │ │ +
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ +
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition PolyMeshT.hh:162
│ │ │
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ -
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │ -
Add status information to a base class.
Definition Status.hh:95
│ │ │ -
Handle representing a mesh property.
Definition Property.hh:477
│ │ │ +
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ + │ │ │ + │ │ │ +
Uniform Loop subdivision algorithm.
Definition LoopT.hh:92
│ │ │ +
bool cleanup(mesh_t &_m) override
Cleanup mesh after usage, e.g. remove added properties.
Definition LoopT.hh:141
│ │ │ +
const char * name() const override
Return name of subdivision algorithm.
Definition LoopT.hh:119
│ │ │ +
void init_weights(size_t _max_valence=50)
Pre-compute weights.
Definition LoopT.hh:123
│ │ │ +
bool prepare(mesh_t &_m) override
Prepare mesh, e.g.
Definition LoopT.hh:133
│ │ │ +
bool subdivide(mesh_t &_m, size_t _n, const bool _update_points=true) override
Subdivide mesh _m _n times.
Definition LoopT.hh:149
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │ +
Check integrity of mesh.
Definition MeshCheckerT.hh:74
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ @@ -1 +1 @@ │ │ │ │ -us-ascii │ │ │ │ +utf-8 │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -ImporterT.hh │ │ │ │ +LoopT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,562 +48,520 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Implements an importer module for arbitrary OpenMesh meshes │ │ │ │ 48// │ │ │ │ +============================================================================= │ │ │ │ 49// │ │ │ │ +50// CLASS LoopT │ │ │ │ +51// │ │ │ │ +52// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef __IMPORTERT_HH__ │ │ │ │ -53#define __IMPORTERT_HH__ │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +53 │ │ │ │ +54#ifndef OPENMESH_SUBDIVIDER_UNIFORM_LOOPT_HH │ │ │ │ +55#define OPENMESH_SUBDIVIDER_UNIFORM_LOOPT_HH │ │ │ │ +56 │ │ │ │ 57 │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_A_t_t_r_i_b_u_t_e_s_._h_h> │ │ │ │ -63#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -69namespace _O_p_e_n_M_e_s_h { │ │ │ │ -70namespace IO { │ │ │ │ +58//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +59 │ │ │ │ +60#include │ │ │ │ +61#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ +62#include │ │ │ │ +63#include │ │ │ │ +64// -------------------- STL │ │ │ │ +65#include │ │ │ │ +66#if defined(OM_CC_MIPS) │ │ │ │ +67# include │ │ │ │ +68#else │ │ │ │ +69# include │ │ │ │ +70#endif │ │ │ │ 71 │ │ │ │ 72 │ │ │ │ -73//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ +73//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ 74 │ │ │ │ -75 │ │ │ │ -79template │ │ │ │ -_8_0class _I_m_p_o_r_t_e_r_T : public _B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -81{ │ │ │ │ -82public: │ │ │ │ -83 │ │ │ │ -84 typedef typename _M_e_s_h_:_:_P_o_i_n_t Point; │ │ │ │ -85 typedef typename _M_e_s_h_:_:_N_o_r_m_a_l Normal; │ │ │ │ -86 typedef typename _M_e_s_h_:_:_C_o_l_o_r Color; │ │ │ │ -87 typedef typename _M_e_s_h_:_:_T_e_x_C_o_o_r_d_2_D TexCoord2D; │ │ │ │ -88 typedef typename _M_e_s_h_:_:_T_e_x_C_o_o_r_d_3_D TexCoord3D; │ │ │ │ -89 typedef std::vector VHandles; │ │ │ │ -90 │ │ │ │ -91 │ │ │ │ -92 explicit _I_m_p_o_r_t_e_r_T(_M_e_s_h& _mesh) : mesh_(_mesh), halfedgeNormals_() {} │ │ │ │ -93 │ │ │ │ +75namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +76namespace Subdivider { // BEGIN_NS_DECIMATER │ │ │ │ +77namespace Uniform { // BEGIN_NS_DECIMATER │ │ │ │ +78 │ │ │ │ +79 │ │ │ │ +80//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +81 │ │ │ │ +90template │ │ │ │ +_9_1class _L_o_o_p_T : public _S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +92{ │ │ │ │ +93public: │ │ │ │ 94 │ │ │ │ -95 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex(const _V_e_c_3_f& _point) override │ │ │ │ -96 { │ │ │ │ -97 return mesh_._a_d_d___v_e_r_t_e_x(vector_cast(_point)); │ │ │ │ -98 } │ │ │ │ -99 │ │ │ │ -100 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex(const _V_e_c_3_d& _point) override │ │ │ │ -101 { │ │ │ │ -102 return mesh_._a_d_d___v_e_r_t_e_x(vector_cast(_point)); │ │ │ │ -103 } │ │ │ │ +95 typedef RealType real_t; │ │ │ │ +96 typedef MeshType mesh_t; │ │ │ │ +97 typedef _S_u_b_d_i_v_i_d_e_r_T_<_ _m_e_s_h___t_,_ _r_e_a_l___t_ _> _p_a_r_e_n_t___t; │ │ │ │ +98 │ │ │ │ +99 typedef std::pair< real_t, real_t > weight_t; │ │ │ │ +100 typedef std::vector< std::pair > weights_t; │ │ │ │ +101 │ │ │ │ +102public: │ │ │ │ +103 │ │ │ │ 104 │ │ │ │ -105 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex() override │ │ │ │ -106 { │ │ │ │ -107 return mesh_._n_e_w___v_e_r_t_e_x(); │ │ │ │ -108 } │ │ │ │ -109 │ │ │ │ -110 virtual _H_a_l_f_e_d_g_e_H_a_n_d_l_e add_edge(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1) │ │ │ │ -override │ │ │ │ -111 { │ │ │ │ -112 return mesh_.new_edge(_vh0, _vh1); │ │ │ │ -113 } │ │ │ │ +105 _L_o_o_p_T(void) : _p_a_r_e_n_t___t(), _1over8( 1.0/8.0 ), _3over8( 3.0/8.0 ) │ │ │ │ +106 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +107 │ │ │ │ +108 │ │ │ │ +109 explicit _L_o_o_p_T( mesh_t& _m ) : _p_a_r_e_n_t___t(_m), _1over8( 1.0/8.0 ), _3over8 │ │ │ │ +( 3.0/8.0 ) │ │ │ │ +110 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +111 │ │ │ │ +112 │ │ │ │ +113 _~_L_o_o_p_T() {} │ │ │ │ 114 │ │ │ │ -115 virtual _F_a_c_e_H_a_n_d_l_e add_face(const VHandles& _indices) override │ │ │ │ -116 { │ │ │ │ -117 _F_a_c_e_H_a_n_d_l_e fh; │ │ │ │ +115 │ │ │ │ +116public: │ │ │ │ +117 │ │ │ │ 118 │ │ │ │ -119 if (_indices.size() > 2) │ │ │ │ -120 { │ │ │ │ -121 VHandles::const_iterator it, it2, end(_indices.end()); │ │ │ │ -122 │ │ │ │ -123 │ │ │ │ -124 // Test if all vertex handles are valid. If not, we throw an error. │ │ │ │ -125 if ( std::any_of(_indices.begin(),_indices.end(),[this](const _V_e_r_t_e_x_H_a_n_d_l_e& │ │ │ │ -vh){ return !mesh_.is_valid_handle(vh); } ) ) │ │ │ │ -126 { │ │ │ │ -127 omerr() << "ImporterT: Face contains invalid vertex index\n"; │ │ │ │ -128 return fh; │ │ │ │ -129 } │ │ │ │ -130 │ │ │ │ -131 // don't allow double vertices │ │ │ │ -132 for (it=_indices.begin(); it!=end; ++it) │ │ │ │ -133 for (it2=it+1; it2!=end; ++it2) │ │ │ │ -134 if (*it == *it2) │ │ │ │ -135 { │ │ │ │ -136 omerr() << "ImporterT: Face has equal vertices\n"; │ │ │ │ -137 return fh; │ │ │ │ +_1_1_9 const char *_n_a_m_e() const override { return "Uniform Loop"; } │ │ │ │ +120 │ │ │ │ +121 │ │ │ │ +_1_2_3 void _i_n_i_t___w_e_i_g_h_t_s(size_t _max_valence=50) │ │ │ │ +124 { │ │ │ │ +125 weights_.resize(_max_valence); │ │ │ │ +126 std::generate(weights_.begin(), weights_.end(), compute_weight()); │ │ │ │ +127 } │ │ │ │ +128 │ │ │ │ +129 │ │ │ │ +130protected: │ │ │ │ +131 │ │ │ │ +132 │ │ │ │ +_1_3_3 bool _p_r_e_p_a_r_e( mesh_t& _m ) override │ │ │ │ +134 { │ │ │ │ +135 _m.add_property( vp_pos_ ); │ │ │ │ +136 _m.add_property( ep_pos_ ); │ │ │ │ +137 return true; │ │ │ │ 138 } │ │ │ │ 139 │ │ │ │ 140 │ │ │ │ -141 // try to add face │ │ │ │ -142 fh = mesh_.add_face(_indices); │ │ │ │ -143 // separate non-manifold faces and mark them │ │ │ │ -144 if (!fh._i_s___v_a_l_i_d()) │ │ │ │ -145 { │ │ │ │ -146 VHandles vhandles(_indices.size()); │ │ │ │ +_1_4_1 bool _c_l_e_a_n_u_p( mesh_t& _m ) override │ │ │ │ +142 { │ │ │ │ +143 _m.remove_property( vp_pos_ ); │ │ │ │ +144 _m.remove_property( ep_pos_ ); │ │ │ │ +145 return true; │ │ │ │ +146 } │ │ │ │ 147 │ │ │ │ -148 // double vertices │ │ │ │ -149 for (unsigned int j=0; j<_indices.size(); ++j) │ │ │ │ +148 │ │ │ │ +_1_4_9 bool _s_u_b_d_i_v_i_d_e( mesh_t& _m, size_t _n, const bool _update_points = true) │ │ │ │ +override │ │ │ │ 150 { │ │ │ │ -151 // DO STORE p, reference may not work since vertex array │ │ │ │ -152 // may be relocated after adding a new vertex ! │ │ │ │ -153 Point p = mesh_.point(_indices[j]); │ │ │ │ -154 vhandles[j] = mesh_._a_d_d___v_e_r_t_e_x(p); │ │ │ │ -155 │ │ │ │ -156 // Mark vertices of failed face as non-manifold │ │ │ │ -157 if (mesh_.has_vertex_status()) { │ │ │ │ -158 mesh_.status(vhandles[j]).set_fixed_nonmanifold(true); │ │ │ │ -159 } │ │ │ │ -160 } │ │ │ │ +151 │ │ │ │ +153 │ │ │ │ +154 typename _m_e_s_h___t_:_:_F_a_c_e_I_t_e_r fit, f_end; │ │ │ │ +155 typename _m_e_s_h___t_:_:_E_d_g_e_I_t_e_r eit, e_end; │ │ │ │ +156 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_I_t_e_r vit; │ │ │ │ +157 │ │ │ │ +158 // Do _n subdivisions │ │ │ │ +159 for (size_t i=0; i < _n; ++i) │ │ │ │ +160 { │ │ │ │ 161 │ │ │ │ -162 // add face │ │ │ │ -163 fh = mesh_.add_face(vhandles); │ │ │ │ -164 │ │ │ │ -165 // Mark failed face as non-manifold │ │ │ │ -166 if (mesh_.has_face_status()) │ │ │ │ -167 mesh_.status(fh).set_fixed_nonmanifold(true); │ │ │ │ +162 if(_update_points) { │ │ │ │ +163 // compute new positions for old vertices │ │ │ │ +164 for (vit = _m.vertices_begin(); vit != _m.vertices_end(); ++vit) { │ │ │ │ +165 smooth(_m, *vit); │ │ │ │ +166 } │ │ │ │ +167 } │ │ │ │ 168 │ │ │ │ -169 // Mark edges of failed face as non-two-manifold │ │ │ │ -170 if (mesh_.has_edge_status()) { │ │ │ │ -171 typename _M_e_s_h_:_:_F_a_c_e_E_d_g_e_I_t_e_r fe_it = mesh_.fe_iter(fh); │ │ │ │ -172 for(; fe_it.is_valid(); ++fe_it) { │ │ │ │ -173 mesh_.status(*fe_it).set_fixed_nonmanifold(true); │ │ │ │ -174 } │ │ │ │ -175 } │ │ │ │ -176 } │ │ │ │ -177 │ │ │ │ -178 //write the half edge normals │ │ │ │ -179 if (mesh_.has_halfedge_normals()) │ │ │ │ -180 { │ │ │ │ -181 //iterate over all incoming haldedges of the added face │ │ │ │ -182 for (typename _M_e_s_h_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r fh_iter = mesh_.fh_begin(fh); │ │ │ │ -183 fh_iter != mesh_.fh_end(fh); ++fh_iter) │ │ │ │ -184 { │ │ │ │ -185 //and write the normals to it │ │ │ │ -186 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh = *fh_iter; │ │ │ │ -187 typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e vh = mesh_.to_vertex_handle(heh); │ │ │ │ -188 typename std::map::iterator it_heNs = │ │ │ │ -halfedgeNormals_.find(vh); │ │ │ │ -189 if (it_heNs != halfedgeNormals_.end()) │ │ │ │ -190 mesh_.set_normal(heh,it_heNs->second); │ │ │ │ -191 } │ │ │ │ -192 halfedgeNormals_.clear(); │ │ │ │ +169 // Compute position for new vertices and store them in the edge property │ │ │ │ +170 for (eit=_m.edges_begin(); eit != _m.edges_end(); ++eit) │ │ │ │ +171 compute_midpoint( _m, *eit ); │ │ │ │ +172 │ │ │ │ +173 // Split each edge at midpoint and store precomputed positions (stored in │ │ │ │ +174 // edge property ep_pos_) in the vertex property vp_pos_; │ │ │ │ +175 │ │ │ │ +176 // Attention! Creating new edges, hence make sure the loop ends correctly. │ │ │ │ +177 for (auto eh : _m.edges()) │ │ │ │ +178 split_edge(_m, eh ); │ │ │ │ +179 │ │ │ │ +180 │ │ │ │ +181 // Commit changes in topology and reconsitute consistency │ │ │ │ +182 │ │ │ │ +183 // Attention! Creating new faces, hence make sure the loop ends correctly. │ │ │ │ +184 for (auto fh : _m.faces()) │ │ │ │ +185 split_face(_m, fh ); │ │ │ │ +186 │ │ │ │ +187 if(_update_points) { │ │ │ │ +188 // Commit changes in geometry │ │ │ │ +189 for ( vit = _m.vertices_begin(); │ │ │ │ +190 vit != _m.vertices_end(); ++vit) { │ │ │ │ +191 _m.set_point(*vit, _m.property( vp_pos_, *vit ) ); │ │ │ │ +192 } │ │ │ │ 193 } │ │ │ │ -194 } │ │ │ │ -195 return fh; │ │ │ │ -196 } │ │ │ │ -197 │ │ │ │ -198 virtual _F_a_c_e_H_a_n_d_l_e add_face(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ -199 { │ │ │ │ -200 auto fh = mesh_.new_face(); │ │ │ │ -201 mesh_.set_halfedge_handle(fh, _heh); │ │ │ │ -202 return fh; │ │ │ │ +194 │ │ │ │ +195 │ │ │ │ +196#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ +197 // Now we have an consistent mesh! │ │ │ │ +198 assert( _O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_M_e_s_h_C_h_e_c_k_e_r_T_<_m_e_s_h___t_>(_m).check() ); │ │ │ │ +199#endif │ │ │ │ +200 } │ │ │ │ +201 │ │ │ │ +202 return true; │ │ │ │ 203 } │ │ │ │ 204 │ │ │ │ -205 // vertex attributes │ │ │ │ +205private: │ │ │ │ 206 │ │ │ │ -207 virtual void set_point(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _point) override │ │ │ │ -208 { │ │ │ │ -209 mesh_.set_point(_vh,vector_cast(_point)); │ │ │ │ -210 } │ │ │ │ -211 │ │ │ │ -212 virtual void set_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ +209 struct compute_weight │ │ │ │ +210 { │ │ │ │ +211 compute_weight() : valence(-1) { } │ │ │ │ +212 weight_t operator() (void) │ │ │ │ 213 { │ │ │ │ -214 mesh_.set_halfedge_handle(_vh, _heh); │ │ │ │ -215 } │ │ │ │ -216 │ │ │ │ -217 virtual void set_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _normal) override │ │ │ │ -218 { │ │ │ │ -219 if (mesh_.has_vertex_normals()) │ │ │ │ -220 mesh_.set_normal(_vh, vector_cast(_normal)); │ │ │ │ -221 │ │ │ │ -222 //saves normals for half edges. │ │ │ │ -223 //they will be written, when the face is added │ │ │ │ -224 if (mesh_.has_halfedge_normals()) │ │ │ │ -225 halfedgeNormals_[_vh] = vector_cast(_normal); │ │ │ │ -226 } │ │ │ │ -227 │ │ │ │ -228 virtual void set_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_d& _normal) override │ │ │ │ -229 { │ │ │ │ -230 if (mesh_.has_vertex_normals()) │ │ │ │ -231 mesh_.set_normal(_vh, vector_cast(_normal)); │ │ │ │ -232 │ │ │ │ -233 //saves normals for half edges. │ │ │ │ -234 //they will be written, when the face is added │ │ │ │ -235 if (mesh_.has_halfedge_normals()) │ │ │ │ -236 halfedgeNormals_[_vh] = vector_cast(_normal); │ │ │ │ -237 } │ │ │ │ -238 │ │ │ │ -239 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_4_u_c& _color) override │ │ │ │ -240 { │ │ │ │ -241 if (mesh_.has_vertex_colors()) │ │ │ │ -242 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ -243 } │ │ │ │ -244 │ │ │ │ -245 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_u_c& _color) override │ │ │ │ -246 { │ │ │ │ -247 if (mesh_.has_vertex_colors()) │ │ │ │ -248 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ -249 } │ │ │ │ -250 │ │ │ │ -251 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_4_f& _color) override │ │ │ │ -252 { │ │ │ │ -253 if (mesh_.has_vertex_colors()) │ │ │ │ -254 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ -255 } │ │ │ │ -256 │ │ │ │ -257 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _color) override │ │ │ │ -258 { │ │ │ │ -259 if (mesh_.has_vertex_colors()) │ │ │ │ -260 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ -261 } │ │ │ │ +214#if !defined(OM_CC_MIPS) │ │ │ │ +215 using std::cos; │ │ │ │ +216#endif │ │ │ │ +217 // 1 │ │ │ │ +218 // alpha(n) = ---- * (40 - ( 3 + 2 cos( 2 Pi / n ) )� ) │ │ │ │ +219 // 64 │ │ │ │ +220 │ │ │ │ +221 if (++valence) │ │ │ │ +222 { │ │ │ │ +223 double inv_v = 1.0/double(valence); │ │ │ │ +224 double t = (3.0 + 2.0 * cos( 2.0 * M_PI * inv_v) ); │ │ │ │ +225 double alpha = (40.0 - t * t)/64.0; │ │ │ │ +226 │ │ │ │ +227 return weight_t( static_cast(1.0-alpha), static_cast │ │ │ │ +(inv_v*alpha) ); │ │ │ │ +228 } │ │ │ │ +229 return weight_t(static_cast(0.0), static_cast(0.0)); │ │ │ │ +230 } │ │ │ │ +231 int valence; │ │ │ │ +232 }; │ │ │ │ +233 │ │ │ │ +234private: // topological modifiers │ │ │ │ +235 │ │ │ │ +236 void split_face(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_F_a_c_e_H_a_n_d_l_e& _fh) │ │ │ │ +237 { │ │ │ │ +238 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +239 heh1(_m.halfedge_handle(_fh)), │ │ │ │ +240 heh2(_m.next_halfedge_handle(_m.next_halfedge_handle(heh1))), │ │ │ │ +241 heh3(_m.next_halfedge_handle(_m.next_halfedge_handle(heh2))); │ │ │ │ +242 │ │ │ │ +243 // Cutting off every corner of the 6_gon │ │ │ │ +244 corner_cutting( _m, heh1 ); │ │ │ │ +245 corner_cutting( _m, heh2 ); │ │ │ │ +246 corner_cutting( _m, heh3 ); │ │ │ │ +247 } │ │ │ │ +248 │ │ │ │ +249 │ │ │ │ +250 void corner_cutting(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& _he) │ │ │ │ +251 { │ │ │ │ +252 // Define Halfedge Handles │ │ │ │ +253 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +254 heh1(_he), │ │ │ │ +255 heh5(heh1), │ │ │ │ +256 heh6(_m.next_halfedge_handle(heh1)); │ │ │ │ +257 │ │ │ │ +258 // Cycle around the polygon to find correct Halfedge │ │ │ │ +259 for (; _m.next_halfedge_handle(_m.next_halfedge_handle(heh5)) != heh1; │ │ │ │ +260 heh5 = _m.next_halfedge_handle(heh5)) │ │ │ │ +261 {} │ │ │ │ 262 │ │ │ │ -263 virtual void set_texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_2_f& _texcoord) │ │ │ │ -override │ │ │ │ -264 { │ │ │ │ -265 if (mesh_.has_vertex_texcoords2D()) │ │ │ │ -266 mesh_.set_texcoord2D(_vh, vector_cast(_texcoord)); │ │ │ │ -267 } │ │ │ │ -268 │ │ │ │ -269 virtual void set_status(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ -270 { │ │ │ │ -271 if (!mesh_.has_vertex_status()) │ │ │ │ -272 mesh_.request_vertex_status(); │ │ │ │ -273 mesh_.status(_vh) = _status; │ │ │ │ -274 } │ │ │ │ -275 │ │ │ │ -276 virtual void set_next(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _next) override │ │ │ │ -277 { │ │ │ │ -278 mesh_.set_next_halfedge_handle(_heh, _next); │ │ │ │ -279 } │ │ │ │ -280 │ │ │ │ -281 virtual void set_face(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _F_a_c_e_H_a_n_d_l_e _fh) override │ │ │ │ -282 { │ │ │ │ -283 mesh_.set_face_handle(_heh, _fh); │ │ │ │ -284 } │ │ │ │ -285 │ │ │ │ -286 virtual void request_face_texcoords2D() override │ │ │ │ -287 { │ │ │ │ -288 if(!mesh_.has_halfedge_texcoords2D()) │ │ │ │ -289 mesh_.request_halfedge_texcoords2D(); │ │ │ │ -290 } │ │ │ │ -291 │ │ │ │ -292 virtual void set_texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _V_e_c_2_f& _texcoord) │ │ │ │ -override │ │ │ │ -293 { │ │ │ │ -294 if (mesh_.has_halfedge_texcoords2D()) │ │ │ │ -295 mesh_.set_texcoord2D(_heh, vector_cast(_texcoord)); │ │ │ │ -296 } │ │ │ │ -297 │ │ │ │ -298 virtual void set_texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _texcoord) │ │ │ │ -override │ │ │ │ -299 { │ │ │ │ -300 if (mesh_.has_vertex_texcoords3D()) │ │ │ │ -301 mesh_.set_texcoord3D(_vh, vector_cast(_texcoord)); │ │ │ │ -302 } │ │ │ │ -303 │ │ │ │ -304 virtual void set_texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _V_e_c_3_f& _texcoord) │ │ │ │ -override │ │ │ │ -305 { │ │ │ │ -306 if (mesh_.has_halfedge_texcoords3D()) │ │ │ │ -307 mesh_.set_texcoord3D(_heh, vector_cast(_texcoord)); │ │ │ │ +263 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +264 vh1 = _m.to_vertex_handle(heh1), │ │ │ │ +265 vh2 = _m.to_vertex_handle(heh5); │ │ │ │ +266 │ │ │ │ +267 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +268 heh2(_m.next_halfedge_handle(heh5)), │ │ │ │ +269 heh3(_m.new_edge( vh1, vh2)), │ │ │ │ +270 heh4(_m.opposite_halfedge_handle(heh3)); │ │ │ │ +271 │ │ │ │ +272 /* Intermediate result │ │ │ │ +273 * │ │ │ │ +274 * * │ │ │ │ +275 * 5 /|\ │ │ │ │ +276 * /_ \ │ │ │ │ +277 * vh2> * * │ │ │ │ +278 * /|\3 |\ │ │ │ │ +279 * /_ \|4 \ │ │ │ │ +280 * *----\*----\* │ │ │ │ +281 * 1 ^ 6 │ │ │ │ +282 * vh1 (adjust_outgoing halfedge!) │ │ │ │ +283 */ │ │ │ │ +284 │ │ │ │ +285 // Old and new Face │ │ │ │ +286 typename _m_e_s_h___t_:_:_F_a_c_e_H_a_n_d_l_e fh_old(_m.face_handle(heh6)); │ │ │ │ +287 typename _m_e_s_h___t_:_:_F_a_c_e_H_a_n_d_l_e fh_new(_m.new_face()); │ │ │ │ +288 │ │ │ │ +289 │ │ │ │ +290 // Re-Set Handles around old Face │ │ │ │ +291 _m.set_next_halfedge_handle(heh4, heh6); │ │ │ │ +292 _m.set_next_halfedge_handle(heh5, heh4); │ │ │ │ +293 │ │ │ │ +294 _m.set_face_handle(heh4, fh_old); │ │ │ │ +295 _m.set_face_handle(heh5, fh_old); │ │ │ │ +296 _m.set_face_handle(heh6, fh_old); │ │ │ │ +297 _m.set_halfedge_handle(fh_old, heh4); │ │ │ │ +298 │ │ │ │ +299 // Re-Set Handles around new Face │ │ │ │ +300 _m.set_next_halfedge_handle(heh1, heh3); │ │ │ │ +301 _m.set_next_halfedge_handle(heh3, heh2); │ │ │ │ +302 │ │ │ │ +303 _m.set_face_handle(heh1, fh_new); │ │ │ │ +304 _m.set_face_handle(heh2, fh_new); │ │ │ │ +305 _m.set_face_handle(heh3, fh_new); │ │ │ │ +306 │ │ │ │ +307 _m.set_halfedge_handle(fh_new, heh1); │ │ │ │ 308 } │ │ │ │ 309 │ │ │ │ -310 virtual void set_status(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ -311 { │ │ │ │ -312 if (!mesh_.has_halfedge_status()) │ │ │ │ -313 mesh_.request_halfedge_status(); │ │ │ │ -314 mesh_.status(_heh) = _status; │ │ │ │ -315 } │ │ │ │ +310 │ │ │ │ +311 void split_edge(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_E_d_g_e_H_a_n_d_l_e& _eh) │ │ │ │ +312 { │ │ │ │ +313 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +314 heh = _m.halfedge_handle(_eh, 0), │ │ │ │ +315 opp_heh = _m.halfedge_handle(_eh, 1); │ │ │ │ 316 │ │ │ │ -317 // edge attributes │ │ │ │ -318 │ │ │ │ -319 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_4_u_c& _color) override │ │ │ │ -320 { │ │ │ │ -321 if (mesh_.has_edge_colors()) │ │ │ │ -322 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ -323 } │ │ │ │ -324 │ │ │ │ -325 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_3_u_c& _color) override │ │ │ │ -326 { │ │ │ │ -327 if (mesh_.has_edge_colors()) │ │ │ │ -328 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ -329 } │ │ │ │ +317 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e new_heh, opp_new_heh, t_heh; │ │ │ │ +318 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e vh; │ │ │ │ +319 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e vh1(_m.to_vertex_handle(heh)); │ │ │ │ +320 typename _m_e_s_h___t_:_:_P_o_i_n_t midP(_m.point(_m.to_vertex_handle(heh))); │ │ │ │ +321 midP += _m.point(_m.to_vertex_handle(opp_heh)); │ │ │ │ +322 midP *= static_cast(0.5); │ │ │ │ +323 │ │ │ │ +324 // new vertex │ │ │ │ +325 vh = _m._n_e_w___v_e_r_t_e_x( midP ); │ │ │ │ +326 │ │ │ │ +327 // memorize position, will be set later │ │ │ │ +328 _m.property( vp_pos_, vh ) = _m.property( ep_pos_, _eh ); │ │ │ │ +329 │ │ │ │ 330 │ │ │ │ -331 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_4_f& _color) override │ │ │ │ -332 { │ │ │ │ -333 if (mesh_.has_edge_colors()) │ │ │ │ -334 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ -335 } │ │ │ │ -336 │ │ │ │ -337 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_3_f& _color) override │ │ │ │ -338 { │ │ │ │ -339 if (mesh_.has_edge_colors()) │ │ │ │ -340 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ -341 } │ │ │ │ -342 │ │ │ │ -343 virtual void set_status(_E_d_g_e_H_a_n_d_l_e _eh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ -344 { │ │ │ │ -345 if (!mesh_.has_edge_status()) │ │ │ │ -346 mesh_.request_edge_status(); │ │ │ │ -347 mesh_.status(_eh) = _status; │ │ │ │ -348 } │ │ │ │ -349 │ │ │ │ -350 // face attributes │ │ │ │ -351 │ │ │ │ -352 virtual void set_normal(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_f& _normal) override │ │ │ │ -353 { │ │ │ │ -354 if (mesh_.has_face_normals()) │ │ │ │ -355 mesh_.set_normal(_fh, vector_cast(_normal)); │ │ │ │ -356 } │ │ │ │ -357 │ │ │ │ -358 virtual void set_normal(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_d& _normal) override │ │ │ │ -359 { │ │ │ │ -360 if (mesh_.has_face_normals()) │ │ │ │ -361 mesh_.set_normal(_fh, vector_cast(_normal)); │ │ │ │ -362 } │ │ │ │ -363 │ │ │ │ -364 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_u_c& _color) override │ │ │ │ -365 { │ │ │ │ -366 if (mesh_.has_face_colors()) │ │ │ │ -367 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ -368 } │ │ │ │ -369 │ │ │ │ -370 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_4_u_c& _color) override │ │ │ │ -371 { │ │ │ │ -372 if (mesh_.has_face_colors()) │ │ │ │ -373 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ +331 // Re-link mesh entities │ │ │ │ +332 if (_m.is_boundary(_eh)) │ │ │ │ +333 { │ │ │ │ +334 for (t_heh = heh; │ │ │ │ +335 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +336 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh))) │ │ │ │ +337 {} │ │ │ │ +338 } │ │ │ │ +339 else │ │ │ │ +340 { │ │ │ │ +341 for (t_heh = _m.next_halfedge_handle(opp_heh); │ │ │ │ +342 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +343 t_heh = _m.next_halfedge_handle(t_heh) ) │ │ │ │ +344 {} │ │ │ │ +345 } │ │ │ │ +346 │ │ │ │ +347 new_heh = _m.new_edge(vh, vh1); │ │ │ │ +348 opp_new_heh = _m.opposite_halfedge_handle(new_heh); │ │ │ │ +349 _m.set_vertex_handle( heh, vh ); │ │ │ │ +350 │ │ │ │ +351 _m.set_next_halfedge_handle(t_heh, opp_new_heh); │ │ │ │ +352 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh)); │ │ │ │ +353 _m.set_next_halfedge_handle(heh, new_heh); │ │ │ │ +354 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); │ │ │ │ +355 │ │ │ │ +356 if (_m.face_handle(opp_heh).is_valid()) │ │ │ │ +357 { │ │ │ │ +358 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh)); │ │ │ │ +359 _m.set_halfedge_handle(_m.face_handle(opp_new_heh), opp_new_heh); │ │ │ │ +360 } │ │ │ │ +361 │ │ │ │ +362 _m.set_face_handle( new_heh, _m.face_handle(heh) ); │ │ │ │ +363 _m.set_halfedge_handle( vh, new_heh); │ │ │ │ +364 │ │ │ │ +365 // We cant reconnect a non existing face, so we skip this here if necessary │ │ │ │ +366 if ( !_m.is_boundary(heh) ) │ │ │ │ +367 _m.set_halfedge_handle( _m.face_handle(heh), heh ); │ │ │ │ +368 │ │ │ │ +369 _m.set_halfedge_handle( vh1, opp_new_heh ); │ │ │ │ +370 │ │ │ │ +371 // Never forget this, when playing with the topology │ │ │ │ +372 _m.adjust_outgoing_halfedge( vh ); │ │ │ │ +373 _m.adjust_outgoing_halfedge( vh1 ); │ │ │ │ 374 } │ │ │ │ 375 │ │ │ │ -376 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_f& _color) override │ │ │ │ -377 { │ │ │ │ -378 if (mesh_.has_face_colors()) │ │ │ │ -379 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ -380 } │ │ │ │ -381 │ │ │ │ -382 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_4_f& _color) override │ │ │ │ -383 { │ │ │ │ -384 if (mesh_.has_face_colors()) │ │ │ │ -385 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ -386 } │ │ │ │ -387 │ │ │ │ -388 virtual void set_status(_F_a_c_e_H_a_n_d_l_e _fh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ -_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ -389 { │ │ │ │ -390 if (!mesh_.has_face_status()) │ │ │ │ -391 mesh_.request_face_status(); │ │ │ │ -392 mesh_.status(_fh) = _status; │ │ │ │ -393 } │ │ │ │ -394 │ │ │ │ -395 virtual void add_face_texcoords( _F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ -std::vector& _face_texcoords) override │ │ │ │ -396 { │ │ │ │ -397 // get first halfedge handle │ │ │ │ -398 _H_a_l_f_e_d_g_e_H_a_n_d_l_e cur_heh = mesh_.halfedge_handle(_fh); │ │ │ │ -399 _H_a_l_f_e_d_g_e_H_a_n_d_l_e end_heh = mesh_.prev_halfedge_handle(cur_heh); │ │ │ │ -400 │ │ │ │ -401 // find start heh │ │ │ │ -402 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh ) │ │ │ │ -403 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ -404 │ │ │ │ -405 for(unsigned int i=0; i<_face_texcoords.size(); ++i) │ │ │ │ -406 { │ │ │ │ -407 set_texcoord( cur_heh, _face_texcoords[i]); │ │ │ │ -408 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ -409 } │ │ │ │ -410 } │ │ │ │ -411 │ │ │ │ -412 virtual void add_face_texcoords( _F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ -std::vector& _face_texcoords) override │ │ │ │ -413 { │ │ │ │ -414 // get first halfedge handle │ │ │ │ -415 _H_a_l_f_e_d_g_e_H_a_n_d_l_e cur_heh = mesh_.halfedge_handle(_fh); │ │ │ │ -416 _H_a_l_f_e_d_g_e_H_a_n_d_l_e end_heh = mesh_.prev_halfedge_handle(cur_heh); │ │ │ │ -417 │ │ │ │ -418 // find start heh │ │ │ │ -419 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh ) │ │ │ │ -420 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ +376private: // geometry helper │ │ │ │ +377 │ │ │ │ +378 void compute_midpoint(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_E_d_g_e_H_a_n_d_l_e& _eh) │ │ │ │ +379 { │ │ │ │ +380#define V( X ) vector_cast< typename mesh_t::Normal >( X ) │ │ │ │ +381 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, opp_heh; │ │ │ │ +382 │ │ │ │ +383 heh = _m.halfedge_handle( _eh, 0); │ │ │ │ +384 opp_heh = _m.halfedge_handle( _eh, 1); │ │ │ │ +385 │ │ │ │ +386 typename _m_e_s_h___t_:_:_P_o_i_n_t │ │ │ │ +387 pos(_m.point(_m.to_vertex_handle(heh))); │ │ │ │ +388 │ │ │ │ +389 pos += V( _m.point(_m.to_vertex_handle(opp_heh)) ); │ │ │ │ +390 │ │ │ │ +391 // boundary edge: just average vertex positions │ │ │ │ +392 if (_m.is_boundary(_eh) ) │ │ │ │ +393 { │ │ │ │ +394 pos *= static_cast(0.5); │ │ │ │ +395 } │ │ │ │ +396 else // inner edge: add neighbouring Vertices to sum │ │ │ │ +397 { │ │ │ │ +398 pos *= real_t(3.0); │ │ │ │ +399 pos += V(_m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)))); │ │ │ │ +400 pos += V(_m.point(_m.to_vertex_handle(_m.next_halfedge_handle(opp_heh)))); │ │ │ │ +401 pos *= _1over8; │ │ │ │ +402 } │ │ │ │ +403 _m.property( ep_pos_, _eh ) = pos; │ │ │ │ +404#undef V │ │ │ │ +405 } │ │ │ │ +406 │ │ │ │ +407 void smooth(_m_e_s_h___t& _m, const typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e& _vh) │ │ │ │ +408 { │ │ │ │ +409 typename _m_e_s_h___t_:_:_P_o_i_n_t pos(0.0,0.0,0.0); │ │ │ │ +410 │ │ │ │ +411 if (_m.is_boundary(_vh) ) // if boundary: Point 1-6-1 │ │ │ │ +412 { │ │ │ │ +413 typename _m_e_s_h___t_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, prev_heh; │ │ │ │ +414 heh = _m.halfedge_handle( _vh ); │ │ │ │ +415 │ │ │ │ +416 if ( heh.is_valid() ) │ │ │ │ +417 { │ │ │ │ +418 assert( _m.is_boundary( _m.edge_handle( heh ) ) ); │ │ │ │ +419 │ │ │ │ +420 prev_heh = _m.prev_halfedge_handle( heh ); │ │ │ │ 421 │ │ │ │ -422 for(unsigned int i=0; i<_face_texcoords.size(); ++i) │ │ │ │ -423 { │ │ │ │ -424 set_texcoord( cur_heh, _face_texcoords[i]); │ │ │ │ -425 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ -426 } │ │ │ │ -427 } │ │ │ │ -428 │ │ │ │ -429 virtual void set_face_texindex( _F_a_c_e_H_a_n_d_l_e _fh, int _texId ) override │ │ │ │ -430 { │ │ │ │ -431 if ( mesh_.has_face_texture_index() ) { │ │ │ │ -432 mesh_.set_texture_index(_fh , _texId); │ │ │ │ +422 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +423 to_vh = _m.to_vertex_handle( heh ), │ │ │ │ +424 from_vh = _m.from_vertex_handle( prev_heh ); │ │ │ │ +425 │ │ │ │ +426 // ( v_l + 6 v + v_r ) / 8 │ │ │ │ +427 pos = _m.point( _vh ); │ │ │ │ +428 pos *= real_t(6.0); │ │ │ │ +429 pos += vector_cast< typename mesh_t::Normal >( _m.point( to_vh ) ); │ │ │ │ +430 pos += vector_cast< typename mesh_t::Normal >( _m.point( from_vh ) ); │ │ │ │ +431 pos *= _1over8; │ │ │ │ +432 │ │ │ │ 433 } │ │ │ │ -434 } │ │ │ │ -435 │ │ │ │ -436 virtual void add_texture_information( int _id , std::string _name ) │ │ │ │ -override │ │ │ │ -437 { │ │ │ │ -438 _O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_ _s_t_d_:_:_m_a_p_<_ _i_n_t_,_ _s_t_d_:_:_s_t_r_i_n_g_ _> > property; │ │ │ │ -439 │ │ │ │ -440 if ( !mesh_.get_property_handle(property,"TextureMapping") ) { │ │ │ │ -441 mesh_.add_property(property,"TextureMapping"); │ │ │ │ -442 } │ │ │ │ -443 │ │ │ │ -444 if ( mesh_.property(property).find( _id ) == mesh_.property(property).end() │ │ │ │ -) { │ │ │ │ -445 mesh_.property(property)[_id] = _name; │ │ │ │ -446 } │ │ │ │ +434 else │ │ │ │ +435 return; │ │ │ │ +436 } │ │ │ │ +437 else // inner vertex: (1-a) * p + a/n * Sum q, q in one-ring of p │ │ │ │ +438 { │ │ │ │ +439 typedef typename _m_e_s_h___t_:_:_N_o_r_m_a_l Vec; │ │ │ │ +440 typename _m_e_s_h___t_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r vvit; │ │ │ │ +441 size_t valence(0); │ │ │ │ +442 │ │ │ │ +443 // Calculate Valence and sum up neighbour points │ │ │ │ +444 for (vvit=_m.vv_iter(_vh); vvit.is_valid(); ++vvit) { │ │ │ │ +445 ++valence; │ │ │ │ +446 pos += vector_cast< Vec >( _m.point(*vvit) ); │ │ │ │ 447 } │ │ │ │ -448 │ │ │ │ -449 // low-level access to mesh │ │ │ │ -450 │ │ │ │ -451 virtual _B_a_s_e_K_e_r_n_e_l* kernel() override { return &mesh_; } │ │ │ │ +448 pos *= weights_[valence].second; // alpha(n)/n * Sum q, q in one-ring of p │ │ │ │ +449 pos += weights_[valence].first │ │ │ │ +450 * vector_cast(_m.point(_vh)); // + (1-a)*p │ │ │ │ +451 } │ │ │ │ 452 │ │ │ │ -453 bool is_triangle_mesh() const override │ │ │ │ -454 { return Mesh::is_triangles(); } │ │ │ │ +453 _m.property( vp_pos_, _vh ) = pos; │ │ │ │ +454 } │ │ │ │ 455 │ │ │ │ -456 void reserve(unsigned int nV, unsigned int nE, unsigned int nF) override │ │ │ │ -457 { │ │ │ │ -458 mesh_.reserve(nV, nE, nF); │ │ │ │ -459 } │ │ │ │ +456private: // data │ │ │ │ +457 │ │ │ │ +458 _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> vp_pos_; │ │ │ │ +459 _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> ep_pos_; │ │ │ │ 460 │ │ │ │ -461 // query number of faces, vertices, normals, texcoords │ │ │ │ -462 size_t n_vertices() const override { return mesh_.n_vertices(); } │ │ │ │ -463 size_t n_faces() const override { return mesh_.n_faces(); } │ │ │ │ -464 size_t n_edges() const override { return mesh_.n_edges(); } │ │ │ │ +461 weights_t weights_; │ │ │ │ +462 │ │ │ │ +463 const real_t _1over8; │ │ │ │ +464 const real_t _3over8; │ │ │ │ 465 │ │ │ │ -466 │ │ │ │ -467 void prepare() override{ } │ │ │ │ +466}; │ │ │ │ +467 │ │ │ │ 468 │ │ │ │ -469 │ │ │ │ -470 void finish() override { } │ │ │ │ -471 │ │ │ │ -472 │ │ │ │ -473private: │ │ │ │ -474 │ │ │ │ -475 _M_e_s_h& mesh_; │ │ │ │ -476 // stores normals for halfedges of the next face │ │ │ │ -477 std::map halfedgeNormals_; │ │ │ │ -478}; │ │ │ │ -479 │ │ │ │ -480 │ │ │ │ -481// │ │ │ │ +469// │ │ │ │ ============================================================================= │ │ │ │ -482} // namespace IO │ │ │ │ -483} // namespace OpenMesh │ │ │ │ -484// │ │ │ │ +470} // END_NS_UNIFORM │ │ │ │ +471} // END_NS_SUBDIVIDER │ │ │ │ +472} // END_NS_OPENMESH │ │ │ │ +473// │ │ │ │ ============================================================================= │ │ │ │ -485#endif │ │ │ │ -486// │ │ │ │ +474#endif // OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITELOOPT_HH defined │ │ │ │ +475// │ │ │ │ ============================================================================= │ │ │ │ -_A_t_t_r_i_b_u_t_e_s_._h_h │ │ │ │ -This file provides some macros containing attribute usage. │ │ │ │ -_o_m_s_t_r_e_a_m_._h_h │ │ │ │ -This file provides the streams omlog, omout, and omerr. │ │ │ │ +_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ -_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _4_ _> │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_I_m_p_o_r_t_e_r_T │ │ │ │ -This class template provides an importer module for OpenMesh meshes. │ │ │ │ -DDeeffiinniittiioonn ImporterT.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l │ │ │ │ -This class provides low-level property management like adding/removing │ │ │ │ -properties and access to prope... │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:98 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ -bool is_valid() const │ │ │ │ -The handle is valid iff the index is not negative. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::FaceEdgeIter FaceEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Triangle mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Kernel::VertexHandle VertexHandle │ │ │ │ Handle for referencing the corresponding item. │ │ │ │ DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::FaceIter FaceIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ Kernel::Normal Normal │ │ │ │ Normal type. │ │ │ │ DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ SmartVertexHandle new_vertex() │ │ │ │ Uses default copy and assignment operator. │ │ │ │ DDeeffiinniittiioonn PolyMeshT.hh:201 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ -Kernel::TexCoord2D TexCoord2D │ │ │ │ -TexCoord2D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:120 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ -Kernel::TexCoord3D TexCoord3D │ │ │ │ -TexCoord3D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ -SmartVertexHandle add_vertex(const Point _p) │ │ │ │ -Alias for new_vertex(const Point&). │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:238 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ Scalar type. │ │ │ │ DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::FaceHalfedgeIter FaceHalfedgeIter │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::EdgeIter EdgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexVertexIter VertexVertexIter │ │ │ │ Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:168 │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:162 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ Kernel::Point Point │ │ │ │ Coordinate type. │ │ │ │ DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ -Kernel::Color Color │ │ │ │ -Color type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ -Add status information to a base class. │ │ │ │ -DDeeffiinniittiioonn Status.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ -Handle representing a mesh property. │ │ │ │ -DDeeffiinniittiioonn Property.hh:477 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexIter VertexIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_P_o_i_n_t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_L_o_o_p_T │ │ │ │ +Uniform Loop subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn LoopT.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_L_o_o_p_T_:_:_c_l_e_a_n_u_p │ │ │ │ +bool cleanup(mesh_t &_m) override │ │ │ │ +Cleanup mesh after usage, e.g. remove added properties. │ │ │ │ +DDeeffiinniittiioonn LoopT.hh:141 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_L_o_o_p_T_:_:_n_a_m_e │ │ │ │ +const char * name() const override │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn LoopT.hh:119 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_L_o_o_p_T_:_:_i_n_i_t___w_e_i_g_h_t_s │ │ │ │ +void init_weights(size_t _max_valence=50) │ │ │ │ +Pre-compute weights. │ │ │ │ +DDeeffiinniittiioonn LoopT.hh:123 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_L_o_o_p_T_:_:_p_r_e_p_a_r_e │ │ │ │ +bool prepare(mesh_t &_m) override │ │ │ │ +Prepare mesh, e.g. │ │ │ │ +DDeeffiinniittiioonn LoopT.hh:133 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_L_o_o_p_T_:_:_s_u_b_d_i_v_i_d_e │ │ │ │ +bool subdivide(mesh_t &_m, size_t _n, const bool _update_points=true) override │ │ │ │ +Subdivide mesh _m _n times. │ │ │ │ +DDeeffiinniittiioonn LoopT.hh:149 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_M_e_s_h_C_h_e_c_k_e_r_T │ │ │ │ +Check integrity of mesh. │ │ │ │ +DDeeffiinniittiioonn MeshCheckerT.hh:74 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00533_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/SR_binary_spec.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/MidpointT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,472 +92,125 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SR_binary_spec.hh
│ │ │ +
MidpointT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ -
2 * *
│ │ │ -
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ -
5 * Department of Computer Graphics and Multimedia *
│ │ │ -
6 * All rights reserved. *
│ │ │ -
7 * www.openmesh.org *
│ │ │ -
8 * *
│ │ │ -
9 *---------------------------------------------------------------------------*
│ │ │ -
10 * This file is part of OpenMesh. *
│ │ │ -
11 *---------------------------------------------------------------------------*
│ │ │ -
12 * *
│ │ │ -
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ -
14 * modification, are permitted provided that the following conditions *
│ │ │ -
15 * are met: *
│ │ │ -
16 * *
│ │ │ -
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ -
18 * this list of conditions and the following disclaimer. *
│ │ │ -
19 * *
│ │ │ -
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ -
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ -
22 * documentation and/or other materials provided with the distribution. *
│ │ │ -
23 * *
│ │ │ -
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ -
25 * contributors may be used to endorse or promote products derived from *
│ │ │ -
26 * this software without specific prior written permission. *
│ │ │ -
27 * *
│ │ │ -
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ -
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ -
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ -
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ -
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ -
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ -
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ -
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ -
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ -
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ -
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ -
39 * *
│ │ │ -
40 * ========================================================================= */
│ │ │ -
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51#ifndef OPENMESH_SR_BINARY_SPEC_HH
│ │ │ -
52#define OPENMESH_SR_BINARY_SPEC_HH
│ │ │ -
53
│ │ │ -
54//== INCLUDES =================================================================
│ │ │ -
55
│ │ │ -
56#include <OpenMesh/Core/System/config.h>
│ │ │ -
57// -------------------- STL
│ │ │ -
58#include <iterator>
│ │ │ -
59#include <string>
│ │ │ -
60#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000)
│ │ │ - │ │ │ -
62#else
│ │ │ -
63# include <limits>
│ │ │ -
64#endif
│ │ │ -
65#include <vector>
│ │ │ -
66#include <stdexcept> // logic_error
│ │ │ -
67#include <numeric> // accumulate
│ │ │ -
68// -------------------- OpenMesh
│ │ │ -
69#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ -
70#include <OpenMesh/Core/Mesh/Status.hh>
│ │ │ -
71#include <OpenMesh/Core/IO/SR_types.hh>
│ │ │ -
72#include <OpenMesh/Core/IO/SR_rbo.hh>
│ │ │ -
73#include <OpenMesh/Core/IO/SR_binary.hh>
│ │ │ -
74
│ │ │ -
75
│ │ │ -
76#include <OpenMesh/Core/Utils/typename.hh>
│ │ │ -
77
│ │ │ -
78#include <iostream>
│ │ │ -
79
│ │ │ -
80//== NAMESPACES ===============================================================
│ │ │ -
81
│ │ │ -
82namespace OpenMesh {
│ │ │ -
83namespace IO {
│ │ │ -
84
│ │ │ -
85
│ │ │ -
86//=============================================================================
│ │ │ -
87
│ │ │ -
88#ifndef DOXY_IGNORE_THIS
│ │ │ -
89
│ │ │ -
90//-----------------------------------------------------------------------------
│ │ │ -
91// struct binary, helper for storing/restoring
│ │ │ -
92
│ │ │ -
93#define SIMPLE_BINARY( T ) \
│ │ │ -
94 template <> struct binary< T > { \
│ │ │ -
95 typedef T value_type; \
│ │ │ -
96 static const bool is_streamable = true; \
│ │ │ -
97 static size_t size_of(const value_type&) { return sizeof(value_type); } \
│ │ │ -
98 static size_t size_of(void) { return sizeof(value_type); } \
│ │ │ -
99 static std::string type_identifier(void) { return #T; } \
│ │ │ -
100 static size_t store( std::ostream& _os, const value_type& _val, \
│ │ │ -
101 bool _swap=false) { \
│ │ │ -
102 value_type tmp = _val; \
│ │ │ -
103 if (_swap) reverse_byte_order(tmp); \
│ │ │ -
104 _os.write( (const char*)&tmp, sizeof(value_type) ); \
│ │ │ -
105 return _os.good() ? sizeof(value_type) : 0; \
│ │ │ -
106 } \
│ │ │ -
107 \
│ │ │ -
108 static size_t restore( std::istream& _is, value_type& _val, \
│ │ │ -
109 bool _swap=false) { \
│ │ │ -
110 _is.read( (char*)&_val, sizeof(value_type) ); \
│ │ │ -
111 if (_swap) reverse_byte_order(_val); \
│ │ │ -
112 return _is.good() ? sizeof(value_type) : 0; \
│ │ │ -
113 } \
│ │ │ -
114 }
│ │ │ -
115
│ │ │ -
116SIMPLE_BINARY(bool);
│ │ │ -
117//SIMPLE_BINARY(int);
│ │ │ -
118
│ │ │ -
119// Why is this needed? Should not be used as not 32 bit compatible
│ │ │ -
120//SIMPLE_BINARY(unsigned long);
│ │ │ -
121SIMPLE_BINARY(float);
│ │ │ -
122SIMPLE_BINARY(double);
│ │ │ -
123SIMPLE_BINARY(long double);
│ │ │ -
124SIMPLE_BINARY(char);
│ │ │ -
125
│ │ │ -
126SIMPLE_BINARY(int8_t);
│ │ │ -
127SIMPLE_BINARY(int16_t);
│ │ │ -
128SIMPLE_BINARY(int32_t);
│ │ │ -
129//SIMPLE_BINARY(int64_t); // TODO: This does not work. Find out why.
│ │ │ -
130SIMPLE_BINARY(uint8_t);
│ │ │ -
131SIMPLE_BINARY(uint16_t);
│ │ │ -
132SIMPLE_BINARY(uint32_t);
│ │ │ -
133SIMPLE_BINARY(uint64_t);
│ │ │ -
134
│ │ │ -
135//handles
│ │ │ -
136SIMPLE_BINARY(FaceHandle);
│ │ │ -
137SIMPLE_BINARY(EdgeHandle);
│ │ │ -
138SIMPLE_BINARY(HalfedgeHandle);
│ │ │ -
139SIMPLE_BINARY(VertexHandle);
│ │ │ -
140SIMPLE_BINARY(MeshHandle);
│ │ │ -
141
│ │ │ -
142#undef SIMPLE_BINARY
│ │ │ -
143
│ │ │ -
144// For unsigned long which is of size 64 bit on 64 bit
│ │ │ -
145// architectures: convert into 32 bit unsigned integer value
│ │ │ -
146// in order to stay compatible between 32/64 bit architectures.
│ │ │ -
147// This allows cross reading BUT forbids storing unsigned longs
│ │ │ -
148// as data type since higher order word (4 bytes) will be truncated.
│ │ │ -
149// Does not work in case the data type that is to be stored
│ │ │ -
150// exceeds the value range of unsigned int in size, which is improbable...
│ │ │ -
151
│ │ │ -
152#define SIMPLE_BINARY( T ) \
│ │ │ -
153 template <> struct binary< T > { \
│ │ │ -
154 typedef T value_type; \
│ │ │ -
155 static const bool is_streamable = true; \
│ │ │ -
156 static size_t size_of(const value_type&) { return sizeof(value_type); } \
│ │ │ -
157 static size_t size_of(void) { return sizeof(value_type); } \
│ │ │ -
158 static std::string type_identifier(void) { return #T; } \
│ │ │ -
159 static size_t store( std::ostream& _os, const value_type& _val, \
│ │ │ -
160 bool _swap=false) { \
│ │ │ -
161 value_type tmp = _val; \
│ │ │ -
162 if (_swap) reverse_byte_order(tmp); \
│ │ │ -
163 /* Convert unsigned long to unsigned int for compatibility reasons */ \
│ │ │ -
164 unsigned int t1 = static_cast<unsigned int>(tmp); \
│ │ │ -
165 _os.write( (const char*)&t1, sizeof(unsigned int) ); \
│ │ │ -
166 return _os.good() ? sizeof(unsigned int) : 0; \
│ │ │ -
167 } \
│ │ │ -
168 \
│ │ │ -
169 static size_t restore( std::istream& _is, value_type& _val, \
│ │ │ -
170 bool _swap=false) { \
│ │ │ -
171 unsigned int t1; \
│ │ │ -
172 _is.read( (char*)&t1, sizeof(unsigned int) ); \
│ │ │ -
173 _val = t1; \
│ │ │ -
174 if (_swap) reverse_byte_order(_val); \
│ │ │ -
175 return _is.good() ? sizeof(unsigned int) : 0; \
│ │ │ -
176 } \
│ │ │ -
177 }
│ │ │ -
178
│ │ │ -
179SIMPLE_BINARY(unsigned long);
│ │ │ -
180
│ │ │ -
181#undef SIMPLE_BINARY
│ │ │ -
182
│ │ │ -
183#define VECTORT_BINARY( T ) \
│ │ │ -
184 template <> struct binary< T > { \
│ │ │ -
185 typedef T value_type; \
│ │ │ -
186 static const bool is_streamable = true; \
│ │ │ -
187 static size_t size_of(void) { return sizeof(value_type); } \
│ │ │ -
188 static size_t size_of(const value_type&) { return size_of(); } \
│ │ │ -
189 static std::string type_identifier(void) { return #T; } \
│ │ │ -
190 static size_t store( std::ostream& _os, const value_type& _val, \
│ │ │ -
191 bool _swap=false) { \
│ │ │ -
192 value_type tmp = _val; \
│ │ │ -
193 size_t b = size_of(_val), N = value_type::size_; \
│ │ │ -
194 if (_swap) \
│ │ │ -
195 for (size_t i=0; i<N; ++i) \
│ │ │ -
196 reverse_byte_order( tmp[i] ); \
│ │ │ -
197 _os.write( (const char*)&tmp[0], b ); \
│ │ │ -
198 return _os.good() ? b : 0; \
│ │ │ -
199 } \
│ │ │ -
200 \
│ │ │ -
201 static size_t restore( std::istream& _is, value_type& _val, \
│ │ │ -
202 bool _swap=false) { \
│ │ │ -
203 size_t N=value_type::size_; \
│ │ │ -
204 size_t b = N * sizeof(value_type::value_type); \
│ │ │ -
205 _is.read( (char*)&_val[0], b ); \
│ │ │ -
206 if (_swap) for (size_t i=0; i<N; ++i) \
│ │ │ -
207 reverse_byte_order( _val[i] ); \
│ │ │ -
208 return _is.good() ? b : 0; \
│ │ │ -
209 } \
│ │ │ -
210 }
│ │ │ -
211
│ │ │ -
212#define VECTORTS_BINARY( N ) \
│ │ │ -
213 VECTORT_BINARY( Vec##N##c ); \
│ │ │ -
214 VECTORT_BINARY( Vec##N##uc ); \
│ │ │ -
215 VECTORT_BINARY( Vec##N##s ); \
│ │ │ -
216 VECTORT_BINARY( Vec##N##us ); \
│ │ │ -
217 VECTORT_BINARY( Vec##N##i ); \
│ │ │ -
218 VECTORT_BINARY( Vec##N##ui ); \
│ │ │ -
219 VECTORT_BINARY( Vec##N##f ); \
│ │ │ -
220 VECTORT_BINARY( Vec##N##d );
│ │ │ -
221
│ │ │ -
222VECTORTS_BINARY( 1 )
│ │ │ -
223VECTORTS_BINARY( 2 )
│ │ │ -
224VECTORTS_BINARY( 3 )
│ │ │ -
225VECTORTS_BINARY( 4 )
│ │ │ -
226VECTORTS_BINARY( 5 )
│ │ │ -
227VECTORTS_BINARY( 6 )
│ │ │ -
228
│ │ │ -
229#undef VECTORTS_BINARY
│ │ │ -
230#undef VECTORT_BINARY
│ │ │ -
231
│ │ │ -
232template <> struct binary< std::string > {
│ │ │ -
233 typedef std::string value_type;
│ │ │ -
234 typedef uint16_t length_t;
│ │ │ -
235
│ │ │ -
236 static const bool is_streamable = true;
│ │ │ -
237
│ │ │ -
238 static size_t size_of() { return UnknownSize; }
│ │ │ -
239 static size_t size_of(const value_type &_v)
│ │ │ -
240 { return sizeof(length_t) + _v.size(); }
│ │ │ -
241 static std::string type_identifier(void) { return "std::string"; }
│ │ │ -
242 static
│ │ │ -
243 size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)
│ │ │ -
244 {
│ │ │ -
245#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000)
│ │ │ -
246 if (_v.size() < Utils::NumLimitsT<length_t>::max() )
│ │ │ -
247#else
│ │ │ -
248 if (_v.size() < std::numeric_limits<length_t>::max() )
│ │ │ -
249#endif
│ │ │ -
250 {
│ │ │ -
251 length_t len = length_t(_v.size());
│ │ │ -
252
│ │ │ -
253 size_t bytes = binary<length_t>::store( _os, len, _swap );
│ │ │ -
254 _os.write( _v.data(), len );
│ │ │ -
255 return _os.good() ? len+bytes : 0;
│ │ │ -
256 }
│ │ │ -
257 throw std::runtime_error("Cannot store string longer than 64Kb");
│ │ │ -
258 }
│ │ │ -
259
│ │ │ -
260 static
│ │ │ -
261 size_t restore(std::istream& _is, value_type& _val, bool _swap=false)
│ │ │ -
262 {
│ │ │ -
263 length_t len;
│ │ │ -
264 size_t bytes = binary<length_t>::restore( _is, len, _swap );
│ │ │ -
265 _val.resize(len);
│ │ │ -
266 _is.read( const_cast<char*>(_val.data()), len );
│ │ │ -
267
│ │ │ -
268 return _is.good() ? (len+bytes) : 0;
│ │ │ -
269 }
│ │ │ -
270};
│ │ │ -
271
│ │ │ -
272template <> struct binary<OpenMesh::Attributes::StatusInfo>
│ │ │ -
273{
│ │ │ -
274 typedef OpenMesh::Attributes::StatusInfo value_type;
│ │ │ -
275 typedef value_type::value_type status_t;
│ │ │ -
276
│ │ │ -
277 static const bool is_streamable = true;
│ │ │ -
278
│ │ │ -
279 static size_t size_of() { return sizeof(status_t); }
│ │ │ -
280 static size_t size_of(const value_type&) { return size_of(); }
│ │ │ -
281
│ │ │ -
282 static std::string type_identifier(void) { return "StatusInfo";}
│ │ │ -
283 static size_t n_bytes(size_t _n_elem)
│ │ │ -
284 { return _n_elem*sizeof(status_t); }
│ │ │ -
285
│ │ │ -
286 static
│ │ │ -
287 size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)
│ │ │ -
288 {
│ │ │ -
289 status_t v=_v.bits();
│ │ │ -
290 return binary<status_t>::store(_os, v, _swap);
│ │ │ -
291 }
│ │ │ -
292
│ │ │ -
293 static
│ │ │ -
294 size_t restore( std::istream& _os, value_type& _v, bool _swap=false)
│ │ │ -
295 {
│ │ │ -
296 status_t v;
│ │ │ -
297 size_t b = binary<status_t>::restore(_os, v, _swap);
│ │ │ -
298 _v.set_bits(v);
│ │ │ -
299 return b;
│ │ │ -
300 }
│ │ │ -
301};
│ │ │ -
302
│ │ │ -
303
│ │ │ -
304//-----------------------------------------------------------------------------
│ │ │ -
305// std::vector<T> specializations for struct binary<>
│ │ │ -
306
│ │ │ -
307template <typename T>
│ │ │ -
308struct FunctorStore {
│ │ │ -
309 FunctorStore( std::ostream& _os, bool _swap) : os_(_os), swap_(_swap) { }
│ │ │ -
310 size_t operator () ( size_t _v1, const T& _s2 )
│ │ │ -
311 { return _v1+binary<T>::store(os_, _s2, swap_ ); }
│ │ │ -
312
│ │ │ -
313 std::ostream& os_;
│ │ │ -
314 bool swap_;
│ │ │ -
315};
│ │ │ -
316
│ │ │ -
317
│ │ │ -
318template <typename T>
│ │ │ -
319struct FunctorRestore {
│ │ │ -
320 FunctorRestore( std::istream& _is, bool _swap) : is_(_is), swap_(_swap) { }
│ │ │ -
321 size_t operator () ( size_t _v1, T& _s2 )
│ │ │ -
322 { return _v1+binary<T>::restore(is_, _s2, swap_ ); }
│ │ │ -
323 std::istream& is_;
│ │ │ -
324 bool swap_;
│ │ │ -
325};
│ │ │ -
326
│ │ │ -
327template <typename T>
│ │ │ -
328struct binary< std::vector< T >, typename std::enable_if<std::is_default_constructible<T>::value>::type > {
│ │ │ -
329 typedef std::vector< T > value_type;
│ │ │ -
330 typedef typename value_type::value_type elem_type;
│ │ │ -
331
│ │ │ -
332 static const bool is_streamable = binary<T>::is_streamable;
│ │ │ -
333 static size_t size_of(bool /*_store_size*/ = true)
│ │ │ -
334 { return IO::UnknownSize; }
│ │ │ -
335
│ │ │ -
336 static size_t size_of(const value_type& _v, bool _store_size = true)
│ │ │ -
337 {
│ │ │ -
338 if(binary<T>::size_of() != IO::UnknownSize)
│ │ │ -
339 {
│ │ │ -
340 unsigned int N = static_cast<unsigned int>(_v.size());
│ │ │ -
341 auto res = binary<T>::size_of()*_v.size() + (_store_size? sizeof(decltype(N)) : 0);
│ │ │ -
342 return res;
│ │ │ -
343 }
│ │ │ -
344 else
│ │ │ -
345 {
│ │ │ -
346 size_t size = 0;
│ │ │ -
347 for(auto v : _v)
│ │ │ -
348 size += binary<T>::size_of(v);
│ │ │ -
349 if(_store_size)
│ │ │ - │ │ │ -
351
│ │ │ -
352 return size;
│ │ │ -
353 }
│ │ │ -
354 }
│ │ │ -
355
│ │ │ -
356 static std::string type_identifier(void) { return "std::vector<" + binary<T>::type_identifier() + ">"; }
│ │ │ -
357 static
│ │ │ -
358 size_t store(std::ostream& _os, const value_type& _v, bool _swap=false, bool _store_size = true) {
│ │ │ -
359 size_t bytes=0;
│ │ │ -
360 if(_store_size)
│ │ │ -
361 {
│ │ │ -
362 unsigned int N = static_cast<unsigned int>(_v.size());
│ │ │ -
363 bytes += binary<unsigned int>::store( _os, N, _swap );
│ │ │ -
364 }
│ │ │ -
365 if (_swap)
│ │ │ -
366 bytes += std::accumulate( _v.begin(), _v.end(), static_cast<size_t>(0),
│ │ │ -
367 FunctorStore<elem_type>(_os,_swap) );
│ │ │ -
368 else
│ │ │ -
369 {
│ │ │ -
370 auto elem_size = binary<elem_type>::size_of();
│ │ │ -
371 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type))
│ │ │ -
372 {
│ │ │ -
373 // size of all elements is known, equal, and densely packed in vector.
│ │ │ -
374 // Just store vector data
│ │ │ -
375 auto bytes_of_vec = size_of(_v, false);
│ │ │ -
376 bytes += bytes_of_vec;
│ │ │ -
377 if (_v.size() > 0)
│ │ │ -
378 _os.write( reinterpret_cast<const char*>(&_v[0]), bytes_of_vec);
│ │ │ -
379 }
│ │ │ -
380 else
│ │ │ -
381 {
│ │ │ -
382 // store individual elements
│ │ │ -
383 for (const auto& v : _v)
│ │ │ -
384 bytes += binary<elem_type>::store(_os, v, _swap);
│ │ │ -
385 }
│ │ │ -
386 }
│ │ │ -
387 return _os.good() ? bytes : 0;
│ │ │ -
388 }
│ │ │ -
389
│ │ │ -
390 static size_t restore(std::istream& _is, value_type& _v, bool _swap=false, bool _restore_size = true) {
│ │ │ -
391
│ │ │ -
392 size_t bytes=0;
│ │ │ -
393
│ │ │ -
394 if(_restore_size)
│ │ │ -
395 {
│ │ │ -
396 unsigned int size_of_vec;
│ │ │ -
397 bytes += binary<unsigned int>::restore(_is, size_of_vec, _swap);
│ │ │ -
398 _v.resize(size_of_vec);
│ │ │ -
399 }
│ │ │ -
400
│ │ │ -
401 if ( _swap)
│ │ │ -
402 bytes += std::accumulate( _v.begin(), _v.end(), size_t(0),
│ │ │ -
403 FunctorRestore<elem_type>(_is, _swap) );
│ │ │ -
404 else
│ │ │ -
405 {
│ │ │ -
406 auto elem_size = binary<elem_type>::size_of();
│ │ │ -
407 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type))
│ │ │ -
408 {
│ │ │ -
409 // size of all elements is known, equal, and densely packed in vector.
│ │ │ -
410 // Just restore vector data
│ │ │ -
411 auto bytes_of_vec = size_of(_v, false);
│ │ │ -
412 bytes += bytes_of_vec;
│ │ │ -
413 if (_v.size() > 0)
│ │ │ -
414 _is.read( reinterpret_cast<char*>(&_v[0]), bytes_of_vec );
│ │ │ -
415 }
│ │ │ -
416 else
│ │ │ -
417 {
│ │ │ -
418 // restore individual elements
│ │ │ -
419 for (auto& v : _v)
│ │ │ -
420 bytes += binary<elem_type>::restore(_is, v, _swap);
│ │ │ -
421 }
│ │ │ -
422 }
│ │ │ -
423 return _is.good() ? bytes : 0;
│ │ │ -
424 }
│ │ │ -
425};
│ │ │ -
426
│ │ │ -
427#include <OpenMesh/Core/IO/SR_binary_vector_of_bool.hh>
│ │ │ -
428
│ │ │ -
429// ----------------------------------------------------------------------------
│ │ │ -
430
│ │ │ -
431#endif // DOXY_IGNORE_THIS
│ │ │ -
432
│ │ │ -
433//=============================================================================
│ │ │ -
434} // namespace IO
│ │ │ -
435} // namespace OpenMesh
│ │ │ -
436//=============================================================================
│ │ │ -
437#endif // OPENMESH_SR_BINARY_SPEC_HH defined
│ │ │ -
438//=============================================================================
│ │ │ -
439
│ │ │ -
Temporary solution until std::numeric_limits is standard.
│ │ │ +
1#pragma once
│ │ │ +
2
│ │ │ +
3#include <OpenMesh/Core/Mesh/BaseKernel.hh>
│ │ │ + │ │ │ +
5#include <OpenMesh/Core/Utils/PropertyManager.hh>
│ │ │ +
6
│ │ │ +
7#include <algorithm>
│ │ │ +
8
│ │ │ +
9namespace OpenMesh {
│ │ │ +
10namespace Subdivider {
│ │ │ +
11namespace Uniform {
│ │ │ +
12
│ │ │ +
26template<typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
27class MidpointT : public SubdividerT<MeshType, RealType>
│ │ │ +
28{
│ │ │ +
29public:
│ │ │ +
30 typedef RealType real_t;
│ │ │ +
31 typedef MeshType mesh_t;
│ │ │ + │ │ │ +
33
│ │ │ +
34 // Inherited constructors
│ │ │ +
35 MidpointT() : parent_t() {}
│ │ │ +
36 MidpointT(mesh_t& _m) : parent_t(_m) {}
│ │ │ +
37
│ │ │ +
38 const char* name() const { return "midpoint"; }
│ │ │ +
39
│ │ │ +
40protected: // SubdividerT interface
│ │ │ +
│ │ │ +
41 bool prepare(mesh_t& _m)
│ │ │ +
42 {
│ │ │ +
43 return true;
│ │ │ +
44 }
│ │ │ +
│ │ │ +
45
│ │ │ +
│ │ │ +
48 bool subdivide(mesh_t& _m, size_t _n, const bool _update_points = true)
│ │ │ +
49 {
│ │ │ +
50 _m.request_halfedge_status();
│ │ │ +
51 _m.request_edge_status();
│ │ │ +
52 _m.request_vertex_status();
│ │ │ +
53 _m.request_face_status();
│ │ │ +
54 PropertyManager<EPropHandleT<typename mesh_t::VertexHandle>> edge_midpoint(_m, "edge_midpoint");
│ │ │ +
55 PropertyManager<VPropHandleT<bool>> is_original_vertex(_m, "is_original_vertex");
│ │ │ +
56
│ │ │ +
57 for (size_t iteration = 0; iteration < _n; ++iteration) {
│ │ │ +
58 is_original_vertex.set_range(_m.vertices_begin(), _m.vertices_end(), true);
│ │ │ +
59 // Create vertices on edge midpoints
│ │ │ +
60 for (auto eh : _m.edges()) {
│ │ │ +
61 VertexHandle new_vh = _m.new_vertex(_m.calc_edge_midpoint(eh));
│ │ │ +
62 edge_midpoint[eh] = new_vh;
│ │ │ +
63 is_original_vertex[new_vh] = false;
│ │ │ +
64 }
│ │ │ +
65 // Create new faces from original faces
│ │ │ +
66 for (auto fh : _m.faces()) {
│ │ │ +
67 std::vector<typename mesh_t::VertexHandle> new_corners;
│ │ │ +
68 for (auto eh : _m.fe_range(fh))
│ │ │ +
69 new_corners.push_back(edge_midpoint[eh]);
│ │ │ +
70 _m.add_face(new_corners);
│ │ │ +
71 }
│ │ │ +
72 // Create new faces from original vertices
│ │ │ +
73 for (auto vh : _m.vertices()) {
│ │ │ +
74 if (is_original_vertex[vh]) {
│ │ │ +
75 if (!_m.is_boundary(vh)) {
│ │ │ +
76 std::vector<typename mesh_t::VertexHandle> new_corners;
│ │ │ +
77 for (auto eh : _m.ve_range(vh))
│ │ │ +
78 new_corners.push_back(edge_midpoint[eh]);
│ │ │ +
79 std::reverse(new_corners.begin(), new_corners.end());
│ │ │ +
80 _m.add_face(new_corners);
│ │ │ +
81 }
│ │ │ +
82 }
│ │ │ +
83 }
│ │ │ +
84 for (auto vh : _m.vertices())
│ │ │ +
85 if (is_original_vertex[vh])
│ │ │ +
86 _m.delete_vertex(vh);
│ │ │ +
87 _m.garbage_collection();
│ │ │ +
88 }
│ │ │ +
89 _m.release_face_status();
│ │ │ +
90 _m.release_vertex_status();
│ │ │ +
91 _m.release_edge_status();
│ │ │ +
92 _m.release_halfedge_status();
│ │ │ +
93 return true;
│ │ │ +
94 }
│ │ │ +
│ │ │ +
95
│ │ │ +
│ │ │ +
96 bool cleanup(mesh_t& _m)
│ │ │ +
97 {
│ │ │ +
98 return true;
│ │ │ +
99 }
│ │ │ +
│ │ │ +
100};
│ │ │ +
│ │ │ +
101
│ │ │ +
102} // namespace Uniform
│ │ │ +
103} // namespace Subdivider
│ │ │ +
104} // namespace OpenMesh
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
signed char int8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ -
short int16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
unsigned long long uint64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
unsigned int uint32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
unsigned short uint16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
int int32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
unsigned char uint8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ -
static size_t restore(std::istream &, value_type &, bool=false, bool=true)
Restore a value of T and return the number of bytes read.
Definition SR_binary.hh:125
│ │ │ -
static const bool is_streamable
Can we store T? Set this to true in your specialization.
Definition SR_binary.hh:101
│ │ │ -
static size_t store(std::ostream &, const value_type &, bool=false, bool=true)
Store a value of T and return the number of bytes written.
Definition SR_binary.hh:113
│ │ │ -
static std::string type_identifier(void)
A string that identifies the type of T.
Definition SR_binary.hh:109
│ │ │ -
static size_t size_of(void)
What's the size of T? If it depends on the actual value (e.g. for vectors) return UnknownSize.
Definition SR_binary.hh:104
│ │ │ -
Add status information to a base class.
Definition Status.hh:95
│ │ │ -
static Scalar max()
Return the maximum absolte value a scalar type can store.
Definition NumLimitsT.hh:97
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
This class is intended to manage the lifecycle of properties.
Definition PropertyManager.hh:76
│ │ │ +
void set_range(HandleTypeIterator begin, HandleTypeIterator end, const PROP_VALUE &value)
Conveniently set the property for an entire range of values.
Definition PropertyManager.hh:519
│ │ │ +
Midpoint subdivision algorithm.
Definition MidpointT.hh:28
│ │ │ +
bool cleanup(mesh_t &_m)
Cleanup mesh after usage, e.g. remove added properties.
Definition MidpointT.hh:96
│ │ │ +
bool subdivide(mesh_t &_m, size_t _n, const bool _update_points=true)
Performs one step of Midpoint subdivision.
Definition MidpointT.hh:48
│ │ │ +
bool prepare(mesh_t &_m)
Prepare mesh, e.g.
Definition MidpointT.hh:41
│ │ │ +
const char * name() const
Return name of subdivision algorithm.
Definition MidpointT.hh:38
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,530 +1,137 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SR_binary_spec.hh │ │ │ │ -1/* ========================================================================= * │ │ │ │ -2 * * │ │ │ │ -3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ -5 * Department of Computer Graphics and Multimedia * │ │ │ │ -6 * All rights reserved. * │ │ │ │ -7 * www.openmesh.org * │ │ │ │ -8 * * │ │ │ │ -9 *---------------------------------------------------------------------------* │ │ │ │ -10 * This file is part of OpenMesh. * │ │ │ │ -11 *--------------------------------------------------------------------------- │ │ │ │ -* │ │ │ │ -12 * * │ │ │ │ -13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ -14 * modification, are permitted provided that the following conditions * │ │ │ │ -15 * are met: * │ │ │ │ -16 * * │ │ │ │ -17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ -* │ │ │ │ -18 * this list of conditions and the following disclaimer. * │ │ │ │ -19 * * │ │ │ │ -20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ -21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ -22 * documentation and/or other materials provided with the distribution. * │ │ │ │ -23 * * │ │ │ │ -24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ -25 * contributors may be used to endorse or promote products derived from * │ │ │ │ -26 * this software without specific prior written permission. * │ │ │ │ -27 * * │ │ │ │ -28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ -29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ -* │ │ │ │ -30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ -31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ -* │ │ │ │ -32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ -33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ -34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ -35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ -36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ -37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ -38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ -39 * * │ │ │ │ -40 * ========================================================================= │ │ │ │ -*/ │ │ │ │ -41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_SR_BINARY_SPEC_HH │ │ │ │ -52#define OPENMESH_SR_BINARY_SPEC_HH │ │ │ │ -53 │ │ │ │ -54//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -55 │ │ │ │ -56#include │ │ │ │ -57// -------------------- STL │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) │ │ │ │ -61# include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_U_t_i_l_s_/_N_u_m_L_i_m_i_t_s_T_._h_h> │ │ │ │ -62#else │ │ │ │ -63# include │ │ │ │ -64#endif │ │ │ │ -65#include │ │ │ │ -66#include // logic_error │ │ │ │ -67#include // accumulate │ │ │ │ -68// -------------------- OpenMesh │ │ │ │ -69#include │ │ │ │ -70#include │ │ │ │ -71#include │ │ │ │ -72#include │ │ │ │ -73#include │ │ │ │ -74 │ │ │ │ -75 │ │ │ │ -76#include │ │ │ │ -77 │ │ │ │ -78#include │ │ │ │ -79 │ │ │ │ -80//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -81 │ │ │ │ -82namespace _O_p_e_n_M_e_s_h { │ │ │ │ -83namespace IO { │ │ │ │ -84 │ │ │ │ -85 │ │ │ │ -86// │ │ │ │ -============================================================================= │ │ │ │ -87 │ │ │ │ -88#ifndef DOXY_IGNORE_THIS │ │ │ │ -89 │ │ │ │ -90//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -91// struct binary, helper for storing/restoring │ │ │ │ -92 │ │ │ │ -93#define SIMPLE_BINARY( T ) \ │ │ │ │ -94 template <> struct binary< T > { \ │ │ │ │ -95 typedef T value_type; \ │ │ │ │ -96 static const bool is_streamable = true; \ │ │ │ │ -97 static size_t size_of(const value_type&) { return sizeof(value_type); } \ │ │ │ │ -98 static size_t size_of(void) { return sizeof(value_type); } \ │ │ │ │ -99 static std::string type_identifier(void) { return #T; } \ │ │ │ │ -100 static size_t store( std::ostream& _os, const value_type& _val, \ │ │ │ │ -101 bool _swap=false) { \ │ │ │ │ -102 value_type tmp = _val; \ │ │ │ │ -103 if (_swap) reverse_byte_order(tmp); \ │ │ │ │ -104 _os.write( (const char*)&tmp, sizeof(value_type) ); \ │ │ │ │ -105 return _os.good() ? sizeof(value_type) : 0; \ │ │ │ │ -106 } \ │ │ │ │ -107 \ │ │ │ │ -108 static size_t restore( std::istream& _is, value_type& _val, \ │ │ │ │ -109 bool _swap=false) { \ │ │ │ │ -110 _is.read( (char*)&_val, sizeof(value_type) ); \ │ │ │ │ -111 if (_swap) reverse_byte_order(_val); \ │ │ │ │ -112 return _is.good() ? sizeof(value_type) : 0; \ │ │ │ │ -113 } \ │ │ │ │ -114 } │ │ │ │ -115 │ │ │ │ -116SIMPLE_BINARY(bool); │ │ │ │ -117//SIMPLE_BINARY(int); │ │ │ │ -118 │ │ │ │ -119// Why is this needed? Should not be used as not 32 bit compatible │ │ │ │ -120//SIMPLE_BINARY(unsigned long); │ │ │ │ -121SIMPLE_BINARY(float); │ │ │ │ -122SIMPLE_BINARY(double); │ │ │ │ -123SIMPLE_BINARY(long double); │ │ │ │ -124SIMPLE_BINARY(char); │ │ │ │ -125 │ │ │ │ -126SIMPLE_BINARY(_i_n_t_8___t); │ │ │ │ -127SIMPLE_BINARY(_i_n_t_1_6___t); │ │ │ │ -128SIMPLE_BINARY(_i_n_t_3_2___t); │ │ │ │ -129//SIMPLE_BINARY(int64_t); // TODO: This does not work. Find out why. │ │ │ │ -130SIMPLE_BINARY(_u_i_n_t_8___t); │ │ │ │ -131SIMPLE_BINARY(_u_i_n_t_1_6___t); │ │ │ │ -132SIMPLE_BINARY(_u_i_n_t_3_2___t); │ │ │ │ -133SIMPLE_BINARY(_u_i_n_t_6_4___t); │ │ │ │ -134 │ │ │ │ -135//handles │ │ │ │ -136SIMPLE_BINARY(FaceHandle); │ │ │ │ -137SIMPLE_BINARY(EdgeHandle); │ │ │ │ -138SIMPLE_BINARY(HalfedgeHandle); │ │ │ │ -139SIMPLE_BINARY(VertexHandle); │ │ │ │ -140SIMPLE_BINARY(MeshHandle); │ │ │ │ -141 │ │ │ │ -142#undef SIMPLE_BINARY │ │ │ │ -143 │ │ │ │ -144// For unsigned long which is of size 64 bit on 64 bit │ │ │ │ -145// architectures: convert into 32 bit unsigned integer value │ │ │ │ -146// in order to stay compatible between 32/64 bit architectures. │ │ │ │ -147// This allows cross reading BUT forbids storing unsigned longs │ │ │ │ -148// as data type since higher order word (4 bytes) will be truncated. │ │ │ │ -149// Does not work in case the data type that is to be stored │ │ │ │ -150// exceeds the value range of unsigned int in size, which is improbable... │ │ │ │ -151 │ │ │ │ -152#define SIMPLE_BINARY( T ) \ │ │ │ │ -153 template <> struct binary< T > { \ │ │ │ │ -154 typedef T value_type; \ │ │ │ │ -155 static const bool is_streamable = true; \ │ │ │ │ -156 static size_t size_of(const value_type&) { return sizeof(value_type); } \ │ │ │ │ -157 static size_t size_of(void) { return sizeof(value_type); } \ │ │ │ │ -158 static std::string type_identifier(void) { return #T; } \ │ │ │ │ -159 static size_t store( std::ostream& _os, const value_type& _val, \ │ │ │ │ -160 bool _swap=false) { \ │ │ │ │ -161 value_type tmp = _val; \ │ │ │ │ -162 if (_swap) reverse_byte_order(tmp); \ │ │ │ │ -163 /* Convert unsigned long to unsigned int for compatibility reasons */ \ │ │ │ │ -164 unsigned int t1 = static_cast(tmp); \ │ │ │ │ -165 _os.write( (const char*)&t1, sizeof(unsigned int) ); \ │ │ │ │ -166 return _os.good() ? sizeof(unsigned int) : 0; \ │ │ │ │ -167 } \ │ │ │ │ -168 \ │ │ │ │ -169 static size_t restore( std::istream& _is, value_type& _val, \ │ │ │ │ -170 bool _swap=false) { \ │ │ │ │ -171 unsigned int t1; \ │ │ │ │ -172 _is.read( (char*)&t1, sizeof(unsigned int) ); \ │ │ │ │ -173 _val = t1; \ │ │ │ │ -174 if (_swap) reverse_byte_order(_val); \ │ │ │ │ -175 return _is.good() ? sizeof(unsigned int) : 0; \ │ │ │ │ -176 } \ │ │ │ │ -177 } │ │ │ │ -178 │ │ │ │ -179SIMPLE_BINARY(unsigned long); │ │ │ │ -180 │ │ │ │ -181#undef SIMPLE_BINARY │ │ │ │ -182 │ │ │ │ -183#define VECTORT_BINARY( T ) \ │ │ │ │ -184 template <> struct binary< T > { \ │ │ │ │ -185 typedef T value_type; \ │ │ │ │ -186 static const bool is_streamable = true; \ │ │ │ │ -187 static size_t size_of(void) { return sizeof(value_type); } \ │ │ │ │ -188 static size_t size_of(const value_type&) { return size_of(); } \ │ │ │ │ -189 static std::string type_identifier(void) { return #T; } \ │ │ │ │ -190 static size_t store( std::ostream& _os, const value_type& _val, \ │ │ │ │ -191 bool _swap=false) { \ │ │ │ │ -192 value_type tmp = _val; \ │ │ │ │ -193 size_t b = size_of(_val), N = value_type::size_; \ │ │ │ │ -194 if (_swap) \ │ │ │ │ -195 for (size_t i=0; i struct binary< std::string > { │ │ │ │ -233 typedef std::string value_type; │ │ │ │ -234 typedef _u_i_n_t_1_6___t length_t; │ │ │ │ -235 │ │ │ │ -236 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = true; │ │ │ │ -237 │ │ │ │ -238 static size_t _s_i_z_e___o_f() { return UnknownSize; } │ │ │ │ -239 static size_t _s_i_z_e___o_f(const value_type &_v) │ │ │ │ -240 { return sizeof(length_t) + _v.size(); } │ │ │ │ -241 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r(void) { return "std::string"; } │ │ │ │ -242 static │ │ │ │ -243 size_t _s_t_o_r_e(std::ostream& _os, const value_type& _v, bool _swap=false) │ │ │ │ -244 { │ │ │ │ -245#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) │ │ │ │ -246 if (_v.size() < _U_t_i_l_s_:_:_N_u_m_L_i_m_i_t_s_T_<_l_e_n_g_t_h___t_>_:_:_m_a_x() ) │ │ │ │ -247#else │ │ │ │ -248 if (_v.size() < std::numeric_limits::max() ) │ │ │ │ -249#endif │ │ │ │ -250 { │ │ │ │ -251 length_t len = length_t(_v.size()); │ │ │ │ -252 │ │ │ │ -253 size_t bytes = _b_i_n_a_r_y_<_l_e_n_g_t_h___t_>_:_:_s_t_o_r_e( _os, len, _swap ); │ │ │ │ -254 _os.write( _v.data(), len ); │ │ │ │ -255 return _os.good() ? len+bytes : 0; │ │ │ │ -256 } │ │ │ │ -257 throw std::runtime_error("Cannot store string longer than 64Kb"); │ │ │ │ -258 } │ │ │ │ -259 │ │ │ │ -260 static │ │ │ │ -261 size_t _r_e_s_t_o_r_e(std::istream& _is, value_type& _val, bool _swap=false) │ │ │ │ -262 { │ │ │ │ -263 length_t len; │ │ │ │ -264 size_t bytes = _b_i_n_a_r_y_<_l_e_n_g_t_h___t_>_:_:_r_e_s_t_o_r_e( _is, len, _swap ); │ │ │ │ -265 _val.resize(len); │ │ │ │ -266 _is.read( const_cast(_val.data()), len ); │ │ │ │ -267 │ │ │ │ -268 return _is.good() ? (len+bytes) : 0; │ │ │ │ -269 } │ │ │ │ -270}; │ │ │ │ -271 │ │ │ │ -272template <> struct binary<_O_p_e_n_M_e_s_h::Attributes::StatusInfo> │ │ │ │ -273{ │ │ │ │ -274 typedef _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o value_type; │ │ │ │ -275 typedef value_type::value_type status_t; │ │ │ │ -276 │ │ │ │ -277 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = true; │ │ │ │ -278 │ │ │ │ -279 static size_t _s_i_z_e___o_f() { return sizeof(status_t); } │ │ │ │ -280 static size_t _s_i_z_e___o_f(const value_type&) { return _s_i_z_e___o_f(); } │ │ │ │ -281 │ │ │ │ -282 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r(void) { return "StatusInfo";} │ │ │ │ -283 static size_t n_bytes(size_t _n_elem) │ │ │ │ -284 { return _n_elem*sizeof(status_t); } │ │ │ │ -285 │ │ │ │ -286 static │ │ │ │ -287 size_t _s_t_o_r_e(std::ostream& _os, const value_type& _v, bool _swap=false) │ │ │ │ -288 { │ │ │ │ -289 status_t v=_v.bits(); │ │ │ │ -290 return _b_i_n_a_r_y_<_s_t_a_t_u_s___t_>_:_:_s_t_o_r_e(_os, v, _swap); │ │ │ │ -291 } │ │ │ │ -292 │ │ │ │ -293 static │ │ │ │ -294 size_t _r_e_s_t_o_r_e( std::istream& _os, value_type& _v, bool _swap=false) │ │ │ │ -295 { │ │ │ │ -296 status_t v; │ │ │ │ -297 size_t b = _b_i_n_a_r_y_<_s_t_a_t_u_s___t_>_:_:_r_e_s_t_o_r_e(_os, v, _swap); │ │ │ │ -298 _v.set_bits(v); │ │ │ │ -299 return b; │ │ │ │ -300 } │ │ │ │ -301}; │ │ │ │ -302 │ │ │ │ -303 │ │ │ │ -304//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -305// std::vector specializations for struct binary<> │ │ │ │ -306 │ │ │ │ -307template │ │ │ │ -308struct FunctorStore { │ │ │ │ -309 FunctorStore( std::ostream& _os, bool _swap) : os_(_os), swap_(_swap) { } │ │ │ │ -310 size_t operator () ( size_t _v1, const T& _s2 ) │ │ │ │ -311 { return _v1+binary::store(os_, _s2, swap_ ); } │ │ │ │ -312 │ │ │ │ -313 std::ostream& os_; │ │ │ │ -314 bool swap_; │ │ │ │ -315}; │ │ │ │ -316 │ │ │ │ -317 │ │ │ │ -318template │ │ │ │ -319struct FunctorRestore { │ │ │ │ -320 FunctorRestore( std::istream& _is, bool _swap) : is_(_is), swap_(_swap) { } │ │ │ │ -321 size_t operator () ( size_t _v1, T& _s2 ) │ │ │ │ -322 { return _v1+binary::restore(is_, _s2, swap_ ); } │ │ │ │ -323 std::istream& is_; │ │ │ │ -324 bool swap_; │ │ │ │ -325}; │ │ │ │ -326 │ │ │ │ -327template │ │ │ │ -328struct binary< std::vector< T >, typename std::enable_if::value>::type > { │ │ │ │ -329 typedef std::vector< T > value_type; │ │ │ │ -330 typedef typename value_type::value_type elem_type; │ │ │ │ -331 │ │ │ │ -332 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = _b_i_n_a_r_y_<_T_>_:_:_i_s___s_t_r_e_a_m_a_b_l_e; │ │ │ │ -333 static size_t _s_i_z_e___o_f(bool /*_store_size*/ = true) │ │ │ │ -334 { return IO::UnknownSize; } │ │ │ │ -335 │ │ │ │ -336 static size_t _s_i_z_e___o_f(const value_type& _v, bool _store_size = true) │ │ │ │ -337 { │ │ │ │ -338 if(_b_i_n_a_r_y_<_T_>_:_:_s_i_z_e___o_f() != IO::UnknownSize) │ │ │ │ -339 { │ │ │ │ -340 unsigned int N = static_cast(_v.size()); │ │ │ │ -341 auto res = _b_i_n_a_r_y_<_T_>_:_:_s_i_z_e___o_f()*_v.size() + (_store_size? sizeof(decltype │ │ │ │ -(N)) : 0); │ │ │ │ -342 return res; │ │ │ │ -343 } │ │ │ │ -344 else │ │ │ │ -345 { │ │ │ │ -346 size_t size = 0; │ │ │ │ -347 for(auto v : _v) │ │ │ │ -348 size += binary::_s_i_z_e___o_f(v); │ │ │ │ -349 if(_store_size) │ │ │ │ -350 size += _b_i_n_a_r_y_<_u_n_s_i_g_n_e_d_ _i_n_t_>_:_:_s_i_z_e___o_f(); │ │ │ │ -351 │ │ │ │ -352 return size; │ │ │ │ -353 } │ │ │ │ -354 } │ │ │ │ -355 │ │ │ │ -356 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r(void) { return "std::vector<" + │ │ │ │ -_b_i_n_a_r_y_<_T_>_:_:_t_y_p_e___i_d_e_n_t_i_f_i_e_r() + ">"; } │ │ │ │ -357 static │ │ │ │ -358 size_t _s_t_o_r_e(std::ostream& _os, const value_type& _v, bool _swap=false, │ │ │ │ -bool _store_size = true) { │ │ │ │ -359 size_t bytes=0; │ │ │ │ -360 if(_store_size) │ │ │ │ -361 { │ │ │ │ -362 unsigned int N = static_cast(_v.size()); │ │ │ │ -363 bytes += _b_i_n_a_r_y_<_u_n_s_i_g_n_e_d_ _i_n_t_>_:_:_s_t_o_r_e( _os, N, _swap ); │ │ │ │ -364 } │ │ │ │ -365 if (_swap) │ │ │ │ -366 bytes += std::accumulate( _v.begin(), _v.end(), static_cast(0), │ │ │ │ -367 FunctorStore(_os,_swap) ); │ │ │ │ -368 else │ │ │ │ -369 { │ │ │ │ -370 auto elem_size = _b_i_n_a_r_y_<_e_l_e_m___t_y_p_e_>_:_:_s_i_z_e___o_f(); │ │ │ │ -371 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type)) │ │ │ │ -372 { │ │ │ │ -373 // size of all elements is known, equal, and densely packed in vector. │ │ │ │ -374 // Just store vector data │ │ │ │ -375 auto bytes_of_vec = _s_i_z_e___o_f(_v, false); │ │ │ │ -376 bytes += bytes_of_vec; │ │ │ │ -377 if (_v.size() > 0) │ │ │ │ -378 _os.write( reinterpret_cast(&_v[0]), bytes_of_vec); │ │ │ │ -379 } │ │ │ │ -380 else │ │ │ │ -381 { │ │ │ │ -382 // store individual elements │ │ │ │ -383 for (const auto& v : _v) │ │ │ │ -384 bytes += binary::_s_t_o_r_e(_os, v, _swap); │ │ │ │ -385 } │ │ │ │ -386 } │ │ │ │ -387 return _os.good() ? bytes : 0; │ │ │ │ -388 } │ │ │ │ -389 │ │ │ │ -390 static size_t _r_e_s_t_o_r_e(std::istream& _is, value_type& _v, bool _swap=false, │ │ │ │ -bool _restore_size = true) { │ │ │ │ -391 │ │ │ │ -392 size_t bytes=0; │ │ │ │ -393 │ │ │ │ -394 if(_restore_size) │ │ │ │ -395 { │ │ │ │ -396 unsigned int size_of_vec; │ │ │ │ -397 bytes += _b_i_n_a_r_y_<_u_n_s_i_g_n_e_d_ _i_n_t_>_:_:_r_e_s_t_o_r_e(_is, size_of_vec, _swap); │ │ │ │ -398 _v.resize(size_of_vec); │ │ │ │ -399 } │ │ │ │ -400 │ │ │ │ -401 if ( _swap) │ │ │ │ -402 bytes += std::accumulate( _v.begin(), _v.end(), size_t(0), │ │ │ │ -403 FunctorRestore(_is, _swap) ); │ │ │ │ -404 else │ │ │ │ -405 { │ │ │ │ -406 auto elem_size = _b_i_n_a_r_y_<_e_l_e_m___t_y_p_e_>_:_:_s_i_z_e___o_f(); │ │ │ │ -407 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type)) │ │ │ │ -408 { │ │ │ │ -409 // size of all elements is known, equal, and densely packed in vector. │ │ │ │ -410 // Just restore vector data │ │ │ │ -411 auto bytes_of_vec = _s_i_z_e___o_f(_v, false); │ │ │ │ -412 bytes += bytes_of_vec; │ │ │ │ -413 if (_v.size() > 0) │ │ │ │ -414 _is.read( reinterpret_cast(&_v[0]), bytes_of_vec ); │ │ │ │ -415 } │ │ │ │ -416 else │ │ │ │ -417 { │ │ │ │ -418 // restore individual elements │ │ │ │ -419 for (auto& v : _v) │ │ │ │ -420 bytes += binary::_r_e_s_t_o_r_e(_is, v, _swap); │ │ │ │ -421 } │ │ │ │ -422 } │ │ │ │ -423 return _is.good() ? bytes : 0; │ │ │ │ -424 } │ │ │ │ -425}; │ │ │ │ -426 │ │ │ │ -427#include │ │ │ │ -428 │ │ │ │ -429// ------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -430 │ │ │ │ -431#endif // DOXY_IGNORE_THIS │ │ │ │ -432 │ │ │ │ -433// │ │ │ │ -============================================================================= │ │ │ │ -434} // namespace IO │ │ │ │ -435} // namespace OpenMesh │ │ │ │ -436// │ │ │ │ -============================================================================= │ │ │ │ -437#endif // OPENMESH_SR_BINARY_SPEC_HH defined │ │ │ │ -438// │ │ │ │ -============================================================================= │ │ │ │ -439 │ │ │ │ -_N_u_m_L_i_m_i_t_s_T_._h_h │ │ │ │ -Temporary solution until std::numeric_limits is standard. │ │ │ │ +MidpointT.hh │ │ │ │ +1#pragma once │ │ │ │ +2 │ │ │ │ +3#include │ │ │ │ +4#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ +5#include │ │ │ │ +6 │ │ │ │ +7#include │ │ │ │ +8 │ │ │ │ +9namespace _O_p_e_n_M_e_s_h { │ │ │ │ +10namespace Subdivider { │ │ │ │ +11namespace Uniform { │ │ │ │ +12 │ │ │ │ +26template │ │ │ │ +_2_7class _M_i_d_p_o_i_n_t_T : public _S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +28{ │ │ │ │ +29public: │ │ │ │ +30 typedef RealType real_t; │ │ │ │ +31 typedef MeshType mesh_t; │ │ │ │ +32 typedef _S_u_b_d_i_v_i_d_e_r_T_<_M_e_s_h_T_y_p_e_,_ _R_e_a_l_T_y_p_e_> _p_a_r_e_n_t___t; │ │ │ │ +33 │ │ │ │ +34 // Inherited constructors │ │ │ │ +35 _M_i_d_p_o_i_n_t_T() : _p_a_r_e_n_t___t() {} │ │ │ │ +36 _M_i_d_p_o_i_n_t_T(mesh_t& _m) : _p_a_r_e_n_t___t(_m) {} │ │ │ │ +37 │ │ │ │ +_3_8 const char* _n_a_m_e() const { return "midpoint"; } │ │ │ │ +39 │ │ │ │ +40protected: // SubdividerT interface │ │ │ │ +_4_1 bool _p_r_e_p_a_r_e(mesh_t& _m) │ │ │ │ +42 { │ │ │ │ +43 return true; │ │ │ │ +44 } │ │ │ │ +45 │ │ │ │ +_4_8 bool _s_u_b_d_i_v_i_d_e(mesh_t& _m, size_t _n, const bool _update_points = true) │ │ │ │ +49 { │ │ │ │ +50 _m.request_halfedge_status(); │ │ │ │ +51 _m.request_edge_status(); │ │ │ │ +52 _m.request_vertex_status(); │ │ │ │ +53 _m.request_face_status(); │ │ │ │ +54 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_E_P_r_o_p_H_a_n_d_l_e_T_<_t_y_p_e_n_a_m_e_ _m_e_s_h___t_:_:_V_e_r_t_e_x_H_a_n_d_l_e_>> edge_midpoint │ │ │ │ +(_m, "edge_midpoint"); │ │ │ │ +55 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_V_P_r_o_p_H_a_n_d_l_e_T_<_b_o_o_l_>> is_original_vertex(_m, │ │ │ │ +"is_original_vertex"); │ │ │ │ +56 │ │ │ │ +57 for (size_t iteration = 0; iteration < _n; ++iteration) { │ │ │ │ +58 is_original_vertex._s_e_t___r_a_n_g_e(_m.vertices_begin(), _m.vertices_end(), true); │ │ │ │ +59 // Create vertices on edge midpoints │ │ │ │ +60 for (auto eh : _m.edges()) { │ │ │ │ +61 _V_e_r_t_e_x_H_a_n_d_l_e new_vh = _m.new_vertex(_m.calc_edge_midpoint(eh)); │ │ │ │ +62 edge_midpoint[eh] = new_vh; │ │ │ │ +63 is_original_vertex[new_vh] = false; │ │ │ │ +64 } │ │ │ │ +65 // Create new faces from original faces │ │ │ │ +66 for (auto fh : _m.faces()) { │ │ │ │ +67 std::vector new_corners; │ │ │ │ +68 for (auto eh : _m.fe_range(fh)) │ │ │ │ +69 new_corners.push_back(edge_midpoint[eh]); │ │ │ │ +70 _m.add_face(new_corners); │ │ │ │ +71 } │ │ │ │ +72 // Create new faces from original vertices │ │ │ │ +73 for (auto vh : _m.vertices()) { │ │ │ │ +74 if (is_original_vertex[vh]) { │ │ │ │ +75 if (!_m.is_boundary(vh)) { │ │ │ │ +76 std::vector new_corners; │ │ │ │ +77 for (auto eh : _m.ve_range(vh)) │ │ │ │ +78 new_corners.push_back(edge_midpoint[eh]); │ │ │ │ +79 std::reverse(new_corners.begin(), new_corners.end()); │ │ │ │ +80 _m.add_face(new_corners); │ │ │ │ +81 } │ │ │ │ +82 } │ │ │ │ +83 } │ │ │ │ +84 for (auto vh : _m.vertices()) │ │ │ │ +85 if (is_original_vertex[vh]) │ │ │ │ +86 _m.delete_vertex(vh); │ │ │ │ +87 _m.garbage_collection(); │ │ │ │ +88 } │ │ │ │ +89 _m.release_face_status(); │ │ │ │ +90 _m.release_vertex_status(); │ │ │ │ +91 _m.release_edge_status(); │ │ │ │ +92 _m.release_halfedge_status(); │ │ │ │ +93 return true; │ │ │ │ +94 } │ │ │ │ +95 │ │ │ │ +_9_6 bool _c_l_e_a_n_u_p(mesh_t& _m) │ │ │ │ +97 { │ │ │ │ +98 return true; │ │ │ │ +99 } │ │ │ │ +100}; │ │ │ │ +101 │ │ │ │ +102} // namespace Uniform │ │ │ │ +103} // namespace Subdivider │ │ │ │ +104} // namespace OpenMesh │ │ │ │ +_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_8___t │ │ │ │ -signed char int8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_1_6___t │ │ │ │ -short int16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_6_4___t │ │ │ │ -unsigned long long uint64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_3_2___t │ │ │ │ -unsigned int uint32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_1_6___t │ │ │ │ -unsigned short uint16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_3_2___t │ │ │ │ -int int32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_8___t │ │ │ │ -unsigned char uint8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_r_e_s_t_o_r_e │ │ │ │ -static size_t restore(std::istream &, value_type &, bool=false, bool=true) │ │ │ │ -Restore a value of T and return the number of bytes read. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:125 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_i_s___s_t_r_e_a_m_a_b_l_e │ │ │ │ -static const bool is_streamable │ │ │ │ -Can we store T? Set this to true in your specialization. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:101 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_t_o_r_e │ │ │ │ -static size_t store(std::ostream &, const value_type &, bool=false, bool=true) │ │ │ │ -Store a value of T and return the number of bytes written. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:113 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_t_y_p_e___i_d_e_n_t_i_f_i_e_r │ │ │ │ -static std::string type_identifier(void) │ │ │ │ -A string that identifies the type of T. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:109 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_i_z_e___o_f │ │ │ │ -static size_t size_of(void) │ │ │ │ -What's the size of T? If it depends on the actual value (e.g. for vectors) │ │ │ │ -return UnknownSize. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:104 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ -Add status information to a base class. │ │ │ │ -DDeeffiinniittiioonn Status.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_N_u_m_L_i_m_i_t_s_T_:_:_m_a_x │ │ │ │ -static Scalar max() │ │ │ │ -Return the maximum absolte value a scalar type can store. │ │ │ │ -DDeeffiinniittiioonn NumLimitsT.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +This class is intended to manage the lifecycle of properties. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_s_e_t___r_a_n_g_e │ │ │ │ +void set_range(HandleTypeIterator begin, HandleTypeIterator end, const │ │ │ │ +PROP_VALUE &value) │ │ │ │ +Conveniently set the property for an entire range of values. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:519 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_i_d_p_o_i_n_t_T │ │ │ │ +Midpoint subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn MidpointT.hh:28 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_i_d_p_o_i_n_t_T_:_:_c_l_e_a_n_u_p │ │ │ │ +bool cleanup(mesh_t &_m) │ │ │ │ +Cleanup mesh after usage, e.g. remove added properties. │ │ │ │ +DDeeffiinniittiioonn MidpointT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_i_d_p_o_i_n_t_T_:_:_s_u_b_d_i_v_i_d_e │ │ │ │ +bool subdivide(mesh_t &_m, size_t _n, const bool _update_points=true) │ │ │ │ +Performs one step of Midpoint subdivision. │ │ │ │ +DDeeffiinniittiioonn MidpointT.hh:48 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_i_d_p_o_i_n_t_T_:_:_p_r_e_p_a_r_e │ │ │ │ +bool prepare(mesh_t &_m) │ │ │ │ +Prepare mesh, e.g. │ │ │ │ +DDeeffiinniittiioonn MidpointT.hh:41 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_M_i_d_p_o_i_n_t_T_:_:_n_a_m_e │ │ │ │ +const char * name() const │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn MidpointT.hh:38 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00539_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/OFFFormat.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Subdivider/Uniform/Sqrt3InterpolatingSubdividerLabsikGreinerT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OFFFormat.hh
│ │ │ +
Sqrt3InterpolatingSubdividerLabsikGreinerT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -136,63 +136,591 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45#ifndef OPENMESH_IO_OFFFORMAT_HH
│ │ │ -
46#define OPENMESH_IO_OFFFORMAT_HH
│ │ │ -
47
│ │ │ -
48
│ │ │ -
49//=== INCLUDES ================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52// OpenMesh
│ │ │ -
53#include <OpenMesh/Core/System/config.h>
│ │ │ -
54
│ │ │ -
55
│ │ │ -
56//== NAMESPACES ==============================================================
│ │ │ -
57
│ │ │ -
58
│ │ │ -
59namespace OpenMesh {
│ │ │ -
60namespace IO {
│ │ │ -
61
│ │ │ +
51//=============================================================================
│ │ │ +
52//
│ │ │ +
53// CLASS InterpolatingSqrt3LGT
│ │ │ +
54//
│ │ │ +
55//=============================================================================
│ │ │ +
56
│ │ │ +
57#ifndef OPENMESH_SUBDIVIDER_UNIFORM_INTERP_SQRT3T_LABSIK_GREINER_HH
│ │ │ +
58#define OPENMESH_SUBDIVIDER_UNIFORM_INTERP_SQRT3T_LABSIK_GREINER_HH
│ │ │ +
59
│ │ │ +
60
│ │ │ +
61//== INCLUDES =================================================================
│ │ │
62
│ │ │ -
63//=== IMPLEMENTATION ==========================================================
│ │ │ -
64
│ │ │ -
65
│ │ │ -
70
│ │ │ -
71
│ │ │ -
72//-----------------------------------------------------------------------------
│ │ │ -
73
│ │ │ -
74#ifndef DOXY_IGNORE_THIS
│ │ │ -
75
│ │ │ -
76struct OPENMESHDLLEXPORT OFFFormat
│ │ │ -
77{
│ │ │ -
78 typedef int integer_type;
│ │ │ -
79 typedef float float_type;
│ │ │ -
80};
│ │ │ -
81
│ │ │ +
63#include <OpenMesh/Core/Mesh/Handles.hh>
│ │ │ +
64#include <OpenMesh/Core/System/config.hh>
│ │ │ + │ │ │ +
66
│ │ │ +
67#if defined(_DEBUG) || defined(DEBUG)
│ │ │ +
68// Makes life lot easier, when playing/messing around with low-level topology
│ │ │ +
69// changing methods of OpenMesh
│ │ │ +
70# include <OpenMesh/Tools/Utils/MeshCheckerT.hh>
│ │ │ +
71# define ASSERT_CONSISTENCY( T, m ) \
│ │ │ +
72 assert(OpenMesh::Utils::MeshCheckerT<T>(m).check())
│ │ │ +
73#else
│ │ │ +
74# define ASSERT_CONSISTENCY( T, m )
│ │ │ +
75#endif
│ │ │ +
76// -------------------- STL
│ │ │ +
77#include <vector>
│ │ │ +
78#if defined(OM_CC_MIPS)
│ │ │ +
79# include <math.h>
│ │ │ +
80#else
│ │ │ +
81# include <cmath>
│ │ │
82#endif
│ │ │
83
│ │ │ -
84
│ │ │ -
85
│ │ │ -
87
│ │ │ +
84//#define MIRROR_TRIANGLES
│ │ │ +
85//#define MIN_NORM
│ │ │ +
86
│ │ │ +
87//== NAMESPACE ================================================================
│ │ │
88
│ │ │ -
89//=============================================================================
│ │ │ -
90} // namespace IO
│ │ │ -
91} // namespace OpenMesh
│ │ │ -
92//=============================================================================
│ │ │ -
93#endif
│ │ │ -
94//=============================================================================
│ │ │ +
89namespace OpenMesh { // BEGIN_NS_OPENMESH
│ │ │ +
90namespace Subdivider { // BEGIN_NS_DECIMATER
│ │ │ +
91namespace Uniform { // BEGIN_NS_UNIFORM
│ │ │ +
92
│ │ │ +
93
│ │ │ +
94//== CLASS DEFINITION =========================================================
│ │ │ +
95
│ │ │ +
96
│ │ │ +
105template <typename MeshType, typename RealType = double>
│ │ │ +
│ │ │ +
106class InterpolatingSqrt3LGT : public SubdividerT< MeshType, RealType >
│ │ │ +
107{
│ │ │ +
108public:
│ │ │ +
109
│ │ │ +
110 typedef RealType real_t;
│ │ │ +
111 typedef MeshType mesh_t;
│ │ │ + │ │ │ +
113
│ │ │ +
114 typedef std::vector< std::vector<real_t> > weights_t;
│ │ │ +
115
│ │ │ +
116public:
│ │ │ +
117
│ │ │ +
118
│ │ │ + │ │ │ +
120 { init_weights(); }
│ │ │ +
121
│ │ │ +
122 explicit InterpolatingSqrt3LGT(MeshType &_m) : parent_t(_m)
│ │ │ +
123 { init_weights(); }
│ │ │ +
124
│ │ │ +
125 virtual ~InterpolatingSqrt3LGT() {}
│ │ │ +
126
│ │ │ +
127
│ │ │ +
128public:
│ │ │ +
129
│ │ │ +
130
│ │ │ +
131 const char *name() const override { return "Uniform Interpolating Sqrt3"; }
│ │ │ +
132
│ │ │ +
│ │ │ +
134 void init_weights(size_t _max_valence=50)
│ │ │ +
135 {
│ │ │ +
136 weights_.resize(_max_valence);
│ │ │ +
137
│ │ │ +
138 weights_[3].resize(4);
│ │ │ +
139 weights_[3][0] = real_t(+4.0/27);
│ │ │ +
140 weights_[3][1] = real_t(-5.0/27);
│ │ │ +
141 weights_[3][2] = real_t(+4.0/27);
│ │ │ +
142 weights_[3][3] = real_t(+8.0/9);
│ │ │ +
143
│ │ │ +
144 weights_[4].resize(5);
│ │ │ +
145 weights_[4][0] = real_t(+2.0/9);
│ │ │ +
146 weights_[4][1] = real_t(-1.0/9);
│ │ │ +
147 weights_[4][2] = real_t(-1.0/9);
│ │ │ +
148 weights_[4][3] = real_t(+2.0/9);
│ │ │ +
149 weights_[4][4] = real_t(+7.0/9);
│ │ │ +
150
│ │ │ +
151 for(unsigned int K=5; K<_max_valence; ++K)
│ │ │ +
152 {
│ │ │ +
153 weights_[K].resize(K+1);
│ │ │ +
154 double aH = 2.0*cos(M_PI/static_cast<double>(K))/3.0;
│ │ │ +
155 weights_[K][K] = static_cast<real_t>(1.0 - aH*aH);
│ │ │ +
156 for(unsigned int i=0; i<K; ++i)
│ │ │ +
157 {
│ │ │ +
158
│ │ │ +
159 weights_[K][i] = static_cast<real_t>((aH*aH + 2.0*aH*cos(2.0*static_cast<double>(i)*M_PI/static_cast<double>(K) + M_PI/static_cast<double>(K)) +
│ │ │ +
160 2.0*aH*aH*cos(4.0*static_cast<double>(i)*M_PI/static_cast<double>(K) + 2.0*M_PI/static_cast<double>(K)))/static_cast<double>(K));
│ │ │ +
161 }
│ │ │ +
162 }
│ │ │ +
163
│ │ │ +
164 //just to be sure:
│ │ │ +
165 weights_[6].resize(0);
│ │ │ +
166
│ │ │ +
167 }
│ │ │ +
│ │ │ +
168
│ │ │ +
169
│ │ │ +
170protected:
│ │ │ +
171
│ │ │ +
172
│ │ │ +
│ │ │ +
173 bool prepare( MeshType& _m ) override
│ │ │ +
174 {
│ │ │ +
175 _m.request_edge_status();
│ │ │ +
176 _m.add_property( fp_pos_ );
│ │ │ +
177 _m.add_property( ep_nv_ );
│ │ │ +
178 _m.add_property( mp_gen_ );
│ │ │ +
179 _m.property( mp_gen_ ) = 0;
│ │ │ +
180
│ │ │ +
181 return _m.has_edge_status()
│ │ │ +
182 && ep_nv_.is_valid() && mp_gen_.is_valid();
│ │ │ +
183 }
│ │ │ +
│ │ │ +
184
│ │ │ +
185
│ │ │ +
│ │ │ +
186 bool cleanup( MeshType& _m ) override
│ │ │ +
187 {
│ │ │ +
188 _m.release_edge_status();
│ │ │ +
189 _m.remove_property( fp_pos_ );
│ │ │ +
190 _m.remove_property( ep_nv_ );
│ │ │ +
191 _m.remove_property( mp_gen_ );
│ │ │ +
192 return true;
│ │ │ +
193 }
│ │ │ +
│ │ │ +
194
│ │ │ +
195
│ │ │ +
│ │ │ +
196 bool subdivide( MeshType& _m, size_t _n , const bool _update_points = true) override
│ │ │ +
197 {
│ │ │ +
198
│ │ │ +
200
│ │ │ +
201 typename MeshType::VertexIter vit;
│ │ │ +
202 typename MeshType::VertexVertexIter vvit;
│ │ │ +
203 typename MeshType::EdgeIter eit;
│ │ │ +
204 typename MeshType::FaceIter fit;
│ │ │ +
205 typename MeshType::FaceVertexIter fvit;
│ │ │ +
206 typename MeshType::FaceHalfedgeIter fheit;
│ │ │ +
207 typename MeshType::VertexHandle vh;
│ │ │ +
208 typename MeshType::HalfedgeHandle heh;
│ │ │ +
209 typename MeshType::Point pos(0,0,0), zero(0,0,0);
│ │ │ +
210 size_t &gen = _m.property( mp_gen_ );
│ │ │ +
211
│ │ │ +
212 for (size_t l=0; l<_n; ++l)
│ │ │ +
213 {
│ │ │ +
214 // tag existing edges
│ │ │ +
215 for (eit=_m.edges_begin(); eit != _m.edges_end();++eit)
│ │ │ +
216 {
│ │ │ +
217 _m.status( *eit ).set_tagged( true );
│ │ │ +
218 if ( (gen%2) && _m.is_boundary(*eit) )
│ │ │ +
219 compute_new_boundary_points( _m, *eit ); // *) creates new vertices
│ │ │ +
220 }
│ │ │ +
221
│ │ │ +
222 // insert new vertices, and store pos in vp_pos_
│ │ │ +
223 typename MeshType::FaceIter fend = _m.faces_end();
│ │ │ +
224 for (fit = _m.faces_begin();fit != fend; ++fit)
│ │ │ +
225 {
│ │ │ +
226 if (_m.is_boundary(*fit))
│ │ │ +
227 {
│ │ │ +
228 if(gen%2)
│ │ │ +
229 _m.property(fp_pos_, *fit).invalidate();
│ │ │ +
230 else
│ │ │ +
231 {
│ │ │ +
232 //find the interior boundary halfedge
│ │ │ +
233 for( heh = _m.halfedge_handle(*fit); !_m.is_boundary( _m.opposite_halfedge_handle(heh) ); heh = _m.next_halfedge_handle(heh) )
│ │ │ +
234 ;
│ │ │ +
235 assert(_m.is_boundary( _m.opposite_halfedge_handle(heh) ));
│ │ │ +
236 pos = zero;
│ │ │ +
237 //check for two boundaries case:
│ │ │ +
238 if( _m.is_boundary(_m.next_halfedge_handle(heh)) || _m.is_boundary(_m.prev_halfedge_handle(heh)) )
│ │ │ +
239 {
│ │ │ +
240 if(_m.is_boundary(_m.prev_halfedge_handle(heh)))
│ │ │ +
241 heh = _m.prev_halfedge_handle(heh); //ensure that the boundary halfedges are heh and heh->next
│ │ │ +
242 //check for three boundaries case:
│ │ │ +
243 if(_m.is_boundary(_m.next_halfedge_handle(_m.next_halfedge_handle(heh))))
│ │ │ +
244 {
│ │ │ +
245 //three boundaries, use COG of triangle
│ │ │ +
246 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
247 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
248 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(_m.prev_halfedge_handle(heh)));
│ │ │ +
249 }
│ │ │ +
250 else
│ │ │ +
251 {
│ │ │ +
252#ifdef MIRROR_TRIANGLES
│ │ │ +
253 //two boundaries, mirror two triangles
│ │ │ +
254 pos += real_t(2.0/9) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
255 pos += real_t(4.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
256 pos += real_t(4.0/9) * _m.point(_m.to_vertex_handle(_m.prev_halfedge_handle(heh)));
│ │ │ +
257 pos += real_t(-1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)))));
│ │ │ +
258#else
│ │ │ +
259 pos += real_t(7.0/24) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
260 pos += real_t(3.0/8) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
261 pos += real_t(3.0/8) * _m.point(_m.to_vertex_handle(_m.prev_halfedge_handle(heh)));
│ │ │ +
262 pos += real_t(-1.0/24) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)))));
│ │ │ +
263#endif
│ │ │ +
264 }
│ │ │ +
265 }
│ │ │ +
266 else
│ │ │ +
267 {
│ │ │ +
268 vh = _m.to_vertex_handle(_m.next_halfedge_handle(heh));
│ │ │ +
269 //check last vertex regularity
│ │ │ +
270 if((_m.valence(vh) == 6) || _m.is_boundary(vh))
│ │ │ +
271 {
│ │ │ +
272#ifdef MIRROR_TRIANGLES
│ │ │ +
273 //use regular rule and mirror one triangle
│ │ │ +
274 pos += real_t(5.0/9) * _m.point(vh);
│ │ │ +
275 pos += real_t(3.0/9) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
276 pos += real_t(3.0/9) * _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle(heh)));
│ │ │ +
277 pos += real_t(-1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.next_halfedge_handle(heh)))));
│ │ │ +
278 pos += real_t(-1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)))));
│ │ │ +
279#else
│ │ │ +
280#ifdef MIN_NORM
│ │ │ +
281 pos += real_t(1.0/9) * _m.point(vh);
│ │ │ +
282 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
283 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle(heh)));
│ │ │ +
284 pos += real_t(1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.next_halfedge_handle(heh)))));
│ │ │ +
285 pos += real_t(1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)))));
│ │ │ +
286#else
│ │ │ +
287 pos += real_t(1.0/2) * _m.point(vh);
│ │ │ +
288 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
289 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(_m.opposite_halfedge_handle(heh)));
│ │ │ +
290 pos += real_t(-1.0/12) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.next_halfedge_handle(heh)))));
│ │ │ +
291 pos += real_t(-1.0/12) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)))));
│ │ │ +
292#endif
│ │ │ +
293#endif
│ │ │ +
294 }
│ │ │ +
295 else
│ │ │ +
296 {
│ │ │ +
297 //irregular setting, use usual irregular rule
│ │ │ +
298 unsigned int K = _m.valence(vh);
│ │ │ +
299 pos += weights_[K][K]*_m.point(vh);
│ │ │ +
300 heh = _m.opposite_halfedge_handle( _m.next_halfedge_handle(heh) );
│ │ │ +
301 for(unsigned int i = 0; i<K; ++i, heh = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)) )
│ │ │ +
302 {
│ │ │ +
303 pos += weights_[K][i]*_m.point(_m.to_vertex_handle(heh));
│ │ │ +
304 }
│ │ │ +
305 }
│ │ │ +
306 }
│ │ │ +
307 vh = _m.add_vertex( pos );
│ │ │ +
308 _m.property(fp_pos_, *fit) = vh;
│ │ │ +
309 }
│ │ │ +
310 }
│ │ │ +
311 else
│ │ │ +
312 {
│ │ │ +
313 pos = zero;
│ │ │ +
314 int nOrdinary = 0;
│ │ │ +
315
│ │ │ +
316 //check number of extraordinary vertices
│ │ │ +
317 for(fvit = _m.fv_iter( *fit ); fvit.is_valid(); ++fvit)
│ │ │ +
318 if( (_m.valence(*fvit)) == 6 || _m.is_boundary(*fvit) )
│ │ │ +
319 ++nOrdinary;
│ │ │ +
320
│ │ │ +
321 if(nOrdinary==3)
│ │ │ +
322 {
│ │ │ +
323 for(fheit = _m.fh_iter( *fit ); fheit.is_valid(); ++fheit)
│ │ │ +
324 {
│ │ │ +
325 //one ring vertex has weight 32/81
│ │ │ +
326 heh = *fheit;
│ │ │ +
327 assert(_m.to_vertex_handle(heh).is_valid());
│ │ │ +
328 pos += real_t(32.0/81) * _m.point(_m.to_vertex_handle(heh));
│ │ │ +
329 //tip vertex has weight -1/81
│ │ │ +
330 heh = _m.opposite_halfedge_handle(heh);
│ │ │ +
331 assert(heh.is_valid());
│ │ │ +
332 assert(_m.next_halfedge_handle(heh).is_valid());
│ │ │ +
333 assert(_m.to_vertex_handle(_m.next_halfedge_handle(heh)).is_valid());
│ │ │ +
334 pos -= real_t(1.0/81) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
335 //outer vertices have weight -2/81
│ │ │ +
336 heh = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh));
│ │ │ +
337 assert(heh.is_valid());
│ │ │ +
338 assert(_m.next_halfedge_handle(heh).is_valid());
│ │ │ +
339 assert(_m.to_vertex_handle(_m.next_halfedge_handle(heh)).is_valid());
│ │ │ +
340 pos -= real_t(2.0/81) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
341 heh = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh));
│ │ │ +
342 assert(heh.is_valid());
│ │ │ +
343 assert(_m.next_halfedge_handle(heh).is_valid());
│ │ │ +
344 assert(_m.to_vertex_handle(_m.next_halfedge_handle(heh)).is_valid());
│ │ │ +
345 pos -= real_t(2.0/81) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle(heh)));
│ │ │ +
346 }
│ │ │ +
347 }
│ │ │ +
348 else
│ │ │ +
349 {
│ │ │ +
350 //only use irregular vertices:
│ │ │ +
351 for(fheit = _m.fh_iter( *fit ); fheit.is_valid(); ++fheit)
│ │ │ +
352 {
│ │ │ +
353 vh = _m.to_vertex_handle(*fheit);
│ │ │ +
354 if( (_m.valence(vh) != 6) && (!_m.is_boundary(vh)) )
│ │ │ +
355 {
│ │ │ +
356 unsigned int K = _m.valence(vh);
│ │ │ +
357 pos += weights_[K][K]*_m.point(vh);
│ │ │ +
358 heh = _m.opposite_halfedge_handle( *fheit );
│ │ │ +
359 for(unsigned int i = 0; i<K; ++i, heh = _m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh)) )
│ │ │ +
360 {
│ │ │ +
361 pos += weights_[K][i]*_m.point(_m.to_vertex_handle(heh));
│ │ │ +
362 }
│ │ │ +
363 }
│ │ │ +
364 }
│ │ │ +
365 pos *= real_t(1.0/(3-nOrdinary));
│ │ │ +
366 }
│ │ │ +
367
│ │ │ +
368 vh = _m.add_vertex( pos );
│ │ │ +
369 _m.property(fp_pos_, *fit) = vh;
│ │ │ +
370 }
│ │ │ +
371 }
│ │ │ +
372
│ │ │ +
373 //split faces
│ │ │ +
374 for (fit = _m.faces_begin();fit != fend; ++fit)
│ │ │ +
375 {
│ │ │ +
376 if ( _m.is_boundary(*fit) && (gen%2))
│ │ │ +
377 {
│ │ │ +
378 boundary_split( _m, *fit );
│ │ │ +
379 }
│ │ │ +
380 else
│ │ │ +
381 {
│ │ │ +
382 assert(_m.property(fp_pos_, *fit).is_valid());
│ │ │ +
383 _m.split( *fit, _m.property(fp_pos_, *fit) );
│ │ │ +
384 }
│ │ │ +
385 }
│ │ │ +
386
│ │ │ +
387 // flip old edges
│ │ │ +
388 for (eit=_m.edges_begin(); eit != _m.edges_end(); ++eit)
│ │ │ +
389 if ( _m.status( *eit ).tagged() && !_m.is_boundary( *eit ) )
│ │ │ +
390 _m.flip(*eit);
│ │ │ +
391
│ │ │ +
392 // Now we have an consistent mesh!
│ │ │ +
393 ASSERT_CONSISTENCY( MeshType, _m );
│ │ │ +
394
│ │ │ +
395 // increase generation by one
│ │ │ +
396 ++gen;
│ │ │ +
397 }
│ │ │ +
398 return true;
│ │ │ +
399 }
│ │ │ +
│ │ │ +
400
│ │ │ +
401private:
│ │ │ +
402
│ │ │ +
403 // Pre-compute location of new boundary points for odd generations
│ │ │ +
404 // and store them in the edge property ep_nv_;
│ │ │ +
405 void compute_new_boundary_points( MeshType& _m,
│ │ │ +
406 const typename MeshType::EdgeHandle& _eh)
│ │ │ +
407 {
│ │ │ +
408 assert( _m.is_boundary(_eh) );
│ │ │ +
409
│ │ │ +
410 typename MeshType::HalfedgeHandle heh;
│ │ │ +
411 typename MeshType::VertexHandle vh1, vh2, vh3, vh4, vhl, vhr;
│ │ │ +
412 typename MeshType::Point P1, P2, P3, P4;
│ │ │ +
413
│ │ │ +
414 /*
│ │ │ +
415 // *---------*---------*
│ │ │ +
416 // / \ / \ / \
│ │ │ +
417 // / \ / \ / \
│ │ │ +
418 // / \ / \ / \
│ │ │ +
419 // / \ / \ / \
│ │ │ +
420 // *---------*--#---#--*---------*
│ │ │ +
421 //
│ │ │ +
422 // ^ ^ ^ ^ ^ ^
│ │ │ +
423 // P1 P2 pl pr P3 P4
│ │ │ +
424 */
│ │ │ +
425 // get halfedge pointing from P3 to P2 (outer boundary halfedge)
│ │ │ +
426
│ │ │ +
427 heh = _m.halfedge_handle(_eh,
│ │ │ +
428 _m.is_boundary(_m.halfedge_handle(_eh,1)));
│ │ │ +
429
│ │ │ +
430 assert( _m.is_boundary( _m.next_halfedge_handle( heh ) ) );
│ │ │ +
431 assert( _m.is_boundary( _m.prev_halfedge_handle( heh ) ) );
│ │ │ +
432
│ │ │ +
433 vh1 = _m.to_vertex_handle( _m.next_halfedge_handle( heh ) );
│ │ │ +
434 vh2 = _m.to_vertex_handle( heh );
│ │ │ +
435 vh3 = _m.from_vertex_handle( heh );
│ │ │ +
436 vh4 = _m.from_vertex_handle( _m.prev_halfedge_handle( heh ));
│ │ │ +
437
│ │ │ +
438 P1 = _m.point(vh1);
│ │ │ +
439 P2 = _m.point(vh2);
│ │ │ +
440 P3 = _m.point(vh3);
│ │ │ +
441 P4 = _m.point(vh4);
│ │ │ +
442
│ │ │ +
443 vhl = _m.add_vertex(real_t(-5.0/81)*P1 + real_t(20.0/27)*P2 + real_t(10.0/27)*P3 + real_t(-4.0/81)*P4);
│ │ │ +
444 vhr = _m.add_vertex(real_t(-5.0/81)*P4 + real_t(20.0/27)*P3 + real_t(10.0/27)*P2 + real_t(-4.0/81)*P1);
│ │ │ +
445
│ │ │ +
446 _m.property(ep_nv_, _eh).first = vhl;
│ │ │ +
447 _m.property(ep_nv_, _eh).second = vhr;
│ │ │ +
448 }
│ │ │ +
449
│ │ │ +
450
│ │ │ +
451 void boundary_split( MeshType& _m, const typename MeshType::FaceHandle& _fh )
│ │ │ +
452 {
│ │ │ +
453 assert( _m.is_boundary(_fh) );
│ │ │ +
454
│ │ │ +
455 typename MeshType::VertexHandle vhl, vhr;
│ │ │ +
456 typename MeshType::FaceEdgeIter fe_it;
│ │ │ +
457 typename MeshType::HalfedgeHandle heh;
│ │ │ +
458
│ │ │ +
459 // find boundary edge
│ │ │ +
460 for( fe_it=_m.fe_iter( _fh ); fe_it.is_valid() && !_m.is_boundary( *fe_it ); ++fe_it ) {};
│ │ │ +
461
│ │ │ +
462 // use precomputed, already inserted but not linked vertices
│ │ │ +
463 vhl = _m.property(ep_nv_, *fe_it).first;
│ │ │ +
464 vhr = _m.property(ep_nv_, *fe_it).second;
│ │ │ +
465
│ │ │ +
466 /*
│ │ │ +
467 // *---------*---------*
│ │ │ +
468 // / \ / \ / \
│ │ │ +
469 // / \ / \ / \
│ │ │ +
470 // / \ / \ / \
│ │ │ +
471 // / \ / \ / \
│ │ │ +
472 // *---------*--#---#--*---------*
│ │ │ +
473 //
│ │ │ +
474 // ^ ^ ^ ^ ^ ^
│ │ │ +
475 // P1 P2 pl pr P3 P4
│ │ │ +
476 */
│ │ │ +
477 // get halfedge pointing from P2 to P3 (inner boundary halfedge)
│ │ │ +
478
│ │ │ +
479 heh = _m.halfedge_handle(*fe_it, _m.is_boundary(_m.halfedge_handle(*fe_it,0)));
│ │ │ +
480
│ │ │ +
481 typename MeshType::HalfedgeHandle pl_P3;
│ │ │ +
482
│ │ │ +
483 // split P2->P3 (heh) in P2->pl (heh) and pl->P3
│ │ │ +
484 boundary_split( _m, heh, vhl ); // split edge
│ │ │ +
485 pl_P3 = _m.next_halfedge_handle( heh ); // store next halfedge handle
│ │ │ +
486 boundary_split( _m, heh ); // split face
│ │ │ +
487
│ │ │ +
488 // split pl->P3 in pl->pr and pr->P3
│ │ │ +
489 boundary_split( _m, pl_P3, vhr );
│ │ │ +
490 boundary_split( _m, pl_P3 );
│ │ │ +
491
│ │ │ +
492 assert( _m.is_boundary( vhl ) && _m.halfedge_handle(vhl).is_valid() );
│ │ │ +
493 assert( _m.is_boundary( vhr ) && _m.halfedge_handle(vhr).is_valid() );
│ │ │ +
494 }
│ │ │ +
495
│ │ │ +
496 void boundary_split(MeshType& _m,
│ │ │ +
497 const typename MeshType::HalfedgeHandle& _heh,
│ │ │ +
498 const typename MeshType::VertexHandle& _vh)
│ │ │ +
499 {
│ │ │ +
500 assert( _m.is_boundary( _m.edge_handle(_heh) ) );
│ │ │ +
501
│ │ │ +
502 typename MeshType::HalfedgeHandle
│ │ │ +
503 heh(_heh),
│ │ │ +
504 opp_heh( _m.opposite_halfedge_handle(_heh) ),
│ │ │ +
505 new_heh, opp_new_heh;
│ │ │ +
506 typename MeshType::VertexHandle to_vh(_m.to_vertex_handle(heh));
│ │ │ +
507 typename MeshType::HalfedgeHandle t_heh;
│ │ │ +
508
│ │ │ +
509 /*
│ │ │ +
510 * P5
│ │ │ +
511 * *
│ │ │ +
512 * /|\
│ │ │ +
513 * / \
│ │ │ +
514 * / \
│ │ │ +
515 * / \
│ │ │ +
516 * / \
│ │ │ +
517 * /_ heh new \
│ │ │ +
518 * *-----\*-----\*\-----*
│ │ │ +
519 * ^ ^ t_heh
│ │ │ +
520 * _vh to_vh
│ │ │ +
521 *
│ │ │ +
522 * P1 P2 P3 P4
│ │ │ +
523 */
│ │ │ +
524 // Re-Setting Handles
│ │ │ +
525
│ │ │ +
526 // find halfedge point from P4 to P3
│ │ │ +
527 for(t_heh = heh;
│ │ │ +
528 _m.next_halfedge_handle(t_heh) != opp_heh;
│ │ │ +
529 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh)))
│ │ │ +
530 {}
│ │ │ +
531
│ │ │ +
532 assert( _m.is_boundary( t_heh ) );
│ │ │ +
533
│ │ │ +
534 new_heh = _m.new_edge( _vh, to_vh );
│ │ │ +
535 opp_new_heh = _m.opposite_halfedge_handle(new_heh);
│ │ │ +
536
│ │ │ +
537 // update halfedge connectivity
│ │ │ +
538 _m.set_next_halfedge_handle(t_heh, opp_new_heh); // P4-P3 -> P3-P2
│ │ │ +
539 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh)); // P2-P3 -> P3-P5
│ │ │ +
540 _m.set_next_halfedge_handle(heh, new_heh); // P1-P2 -> P2-P3
│ │ │ +
541 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); // P3-P2 -> P2-P1
│ │ │ +
542
│ │ │ +
543 // both opposite halfedges point to same face
│ │ │ +
544 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh));
│ │ │ +
545
│ │ │ +
546 // let heh finally point to new inserted vertex
│ │ │ +
547 _m.set_vertex_handle(heh, _vh);
│ │ │ +
548
│ │ │ +
549 // let heh and new_heh point to same face
│ │ │ +
550 _m.set_face_handle(new_heh, _m.face_handle(heh));
│ │ │ +
551
│ │ │ +
552 // let opp_new_heh be the new outgoing halfedge for to_vh
│ │ │ +
553 // (replaces for opp_heh)
│ │ │ +
554 _m.set_halfedge_handle( to_vh, opp_new_heh );
│ │ │ +
555
│ │ │ +
556 // let opp_heh be the outgoing halfedge for _vh
│ │ │ +
557 _m.set_halfedge_handle( _vh, opp_heh );
│ │ │ +
558 }
│ │ │ +
559
│ │ │ +
560 void boundary_split( MeshType& _m,
│ │ │ +
561 const typename MeshType::HalfedgeHandle& _heh)
│ │ │ +
562 {
│ │ │ +
563 assert( _m.is_boundary( _m.opposite_halfedge_handle( _heh ) ) );
│ │ │ +
564
│ │ │ +
565 typename MeshType::HalfedgeHandle
│ │ │ +
566 heh(_heh),
│ │ │ +
567 n_heh(_m.next_halfedge_handle(heh));
│ │ │ +
568
│ │ │ +
569 typename MeshType::VertexHandle
│ │ │ +
570 to_vh(_m.to_vertex_handle(heh));
│ │ │ +
571
│ │ │ +
572 typename MeshType::HalfedgeHandle
│ │ │ +
573 heh2(_m.new_edge(to_vh,
│ │ │ +
574 _m.to_vertex_handle(_m.next_halfedge_handle(n_heh)))),
│ │ │ +
575 heh3(_m.opposite_halfedge_handle(heh2));
│ │ │ +
576
│ │ │ +
577 typename MeshType::FaceHandle
│ │ │ +
578 new_fh(_m.new_face()),
│ │ │ +
579 fh(_m.face_handle(heh));
│ │ │ +
580
│ │ │ +
581 // Relink (half)edges
│ │ │ +
582 _m.set_face_handle(heh, new_fh);
│ │ │ +
583 _m.set_face_handle(heh2, new_fh);
│ │ │ +
584 _m.set_next_halfedge_handle(heh2, _m.next_halfedge_handle(_m.next_halfedge_handle(n_heh)));
│ │ │ +
585 _m.set_next_halfedge_handle(heh, heh2);
│ │ │ +
586 _m.set_face_handle( _m.next_halfedge_handle(heh2), new_fh);
│ │ │ +
587
│ │ │ +
588 _m.set_next_halfedge_handle(heh3, n_heh);
│ │ │ +
589 _m.set_next_halfedge_handle(_m.next_halfedge_handle(n_heh), heh3);
│ │ │ +
590 _m.set_face_handle(heh3, fh);
│ │ │ +
591
│ │ │ +
592 _m.set_halfedge_handle( fh, n_heh);
│ │ │ +
593 _m.set_halfedge_handle(new_fh, heh);
│ │ │ +
594
│ │ │ +
595
│ │ │ +
596 }
│ │ │ +
597
│ │ │ +
598private:
│ │ │ +
599
│ │ │ +
600 weights_t weights_;
│ │ │ + │ │ │ +
602 OpenMesh::EPropHandleT< std::pair< typename MeshType::VertexHandle,
│ │ │ +
603 typename MeshType::VertexHandle> > ep_nv_;
│ │ │ + │ │ │ +
605};
│ │ │ +
│ │ │ +
606
│ │ │ +
607
│ │ │ +
608//=============================================================================
│ │ │ +
609} // END_NS_UNIFORM
│ │ │ +
610} // END_NS_SUBDIVIDER
│ │ │ +
611} // END_NS_OPENMESH
│ │ │ +
612//=============================================================================
│ │ │ +
613#endif // OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH
│ │ │ +
614//=============================================================================
│ │ │ + │ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ +
Handle representing an edge property.
Definition Property.hh:447
│ │ │ + │ │ │ + │ │ │ +
Uniform Interpolating Sqrt3 subdivision algorithm
Definition Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:107
│ │ │ +
bool cleanup(MeshType &_m) override
Cleanup mesh after usage, e.g. remove added properties.
Definition Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:186
│ │ │ +
const char * name() const override
Return name of subdivision algorithm.
Definition Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:131
│ │ │ +
bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true) override
Subdivide mesh _m _n times.
Definition Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:196
│ │ │ +
bool prepare(MeshType &_m) override
Prepare mesh, e.g.
Definition Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:173
│ │ │ +
void init_weights(size_t _max_valence=50)
Pre-compute weights.
Definition Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:134
│ │ │ +
Abstract base class for uniform subdivision algorithms.
Definition SubdividerT.hh:89
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OFFFormat.hh │ │ │ │ +Sqrt3InterpolatingSubdividerLabsikGreinerT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,69 +46,655 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45#ifndef OPENMESH_IO_OFFFORMAT_HH │ │ │ │ -46#define OPENMESH_IO_OFFFORMAT_HH │ │ │ │ -47 │ │ │ │ -48 │ │ │ │ -49//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52// OpenMesh │ │ │ │ -53#include │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//== NAMESPACES │ │ │ │ -============================================================== │ │ │ │ -57 │ │ │ │ -58 │ │ │ │ -59namespace _O_p_e_n_M_e_s_h { │ │ │ │ -60namespace IO { │ │ │ │ -61 │ │ │ │ +51// │ │ │ │ +============================================================================= │ │ │ │ +52// │ │ │ │ +53// CLASS InterpolatingSqrt3LGT │ │ │ │ +54// │ │ │ │ +55// │ │ │ │ +============================================================================= │ │ │ │ +56 │ │ │ │ +57#ifndef OPENMESH_SUBDIVIDER_UNIFORM_INTERP_SQRT3T_LABSIK_GREINER_HH │ │ │ │ +58#define OPENMESH_SUBDIVIDER_UNIFORM_INTERP_SQRT3T_LABSIK_GREINER_HH │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +61//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 62 │ │ │ │ -63//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -72//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -73 │ │ │ │ -74#ifndef DOXY_IGNORE_THIS │ │ │ │ -75 │ │ │ │ -76struct OPENMESHDLLEXPORT OFFFormat │ │ │ │ -77{ │ │ │ │ -78 typedef int integer_type; │ │ │ │ -79 typedef float float_type; │ │ │ │ -80}; │ │ │ │ -81 │ │ │ │ +63#include │ │ │ │ +64#include │ │ │ │ +65#include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_S_u_b_d_i_v_i_d_e_r_/_U_n_i_f_o_r_m_/_S_u_b_d_i_v_i_d_e_r_T_._h_h> │ │ │ │ +66 │ │ │ │ +67#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ +68// Makes life lot easier, when playing/messing around with low-level topology │ │ │ │ +69// changing methods of OpenMesh │ │ │ │ +70# include │ │ │ │ +71# define ASSERT_CONSISTENCY( T, m ) \ │ │ │ │ +72 assert(OpenMesh::Utils::MeshCheckerT(m).check()) │ │ │ │ +73#else │ │ │ │ +74# define ASSERT_CONSISTENCY( T, m ) │ │ │ │ +75#endif │ │ │ │ +76// -------------------- STL │ │ │ │ +77#include │ │ │ │ +78#if defined(OM_CC_MIPS) │ │ │ │ +79# include │ │ │ │ +80#else │ │ │ │ +81# include │ │ │ │ 82#endif │ │ │ │ 83 │ │ │ │ -84 │ │ │ │ -85 │ │ │ │ -87 │ │ │ │ +84//#define MIRROR_TRIANGLES │ │ │ │ +85//#define MIN_NORM │ │ │ │ +86 │ │ │ │ +87//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ 88 │ │ │ │ -89// │ │ │ │ +89namespace _O_p_e_n_M_e_s_h { // BEGIN_NS_OPENMESH │ │ │ │ +90namespace Subdivider { // BEGIN_NS_DECIMATER │ │ │ │ +91namespace Uniform { // BEGIN_NS_UNIFORM │ │ │ │ +92 │ │ │ │ +93 │ │ │ │ +94//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +95 │ │ │ │ +96 │ │ │ │ +105template │ │ │ │ +_1_0_6class _I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T : public _S_u_b_d_i_v_i_d_e_r_T< MeshType, RealType > │ │ │ │ +107{ │ │ │ │ +108public: │ │ │ │ +109 │ │ │ │ +110 typedef RealType real_t; │ │ │ │ +111 typedef MeshType mesh_t; │ │ │ │ +112 typedef _S_u_b_d_i_v_i_d_e_r_T_<_ _m_e_s_h___t_,_ _r_e_a_l___t_ _> _p_a_r_e_n_t___t; │ │ │ │ +113 │ │ │ │ +114 typedef std::vector< std::vector > weights_t; │ │ │ │ +115 │ │ │ │ +116public: │ │ │ │ +117 │ │ │ │ +118 │ │ │ │ +119 _I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T(void) : _p_a_r_e_n_t___t() │ │ │ │ +120 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +121 │ │ │ │ +122 explicit _I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T(MeshType &_m) : _p_a_r_e_n_t___t(_m) │ │ │ │ +123 { _i_n_i_t___w_e_i_g_h_t_s(); } │ │ │ │ +124 │ │ │ │ +125 virtual _~_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T() {} │ │ │ │ +126 │ │ │ │ +127 │ │ │ │ +128public: │ │ │ │ +129 │ │ │ │ +130 │ │ │ │ +_1_3_1 const char *_n_a_m_e() const override { return "Uniform Interpolating Sqrt3"; } │ │ │ │ +132 │ │ │ │ +_1_3_4 void _i_n_i_t___w_e_i_g_h_t_s(size_t _max_valence=50) │ │ │ │ +135 { │ │ │ │ +136 weights_.resize(_max_valence); │ │ │ │ +137 │ │ │ │ +138 weights_[3].resize(4); │ │ │ │ +139 weights_[3][0] = real_t(+4.0/27); │ │ │ │ +140 weights_[3][1] = real_t(-5.0/27); │ │ │ │ +141 weights_[3][2] = real_t(+4.0/27); │ │ │ │ +142 weights_[3][3] = real_t(+8.0/9); │ │ │ │ +143 │ │ │ │ +144 weights_[4].resize(5); │ │ │ │ +145 weights_[4][0] = real_t(+2.0/9); │ │ │ │ +146 weights_[4][1] = real_t(-1.0/9); │ │ │ │ +147 weights_[4][2] = real_t(-1.0/9); │ │ │ │ +148 weights_[4][3] = real_t(+2.0/9); │ │ │ │ +149 weights_[4][4] = real_t(+7.0/9); │ │ │ │ +150 │ │ │ │ +151 for(unsigned int K=5; K<_max_valence; ++K) │ │ │ │ +152 { │ │ │ │ +153 weights_[K].resize(K+1); │ │ │ │ +154 double aH = 2.0*cos(M_PI/static_cast(K))/3.0; │ │ │ │ +155 weights_[K][K] = static_cast(1.0 - aH*aH); │ │ │ │ +156 for(unsigned int i=0; i((aH*aH + 2.0*aH*cos │ │ │ │ +(2.0*static_cast(i)*M_PI/static_cast(K) + M_PI/ │ │ │ │ +static_cast(K)) + │ │ │ │ +160 2.0*aH*aH*cos(4.0*static_cast(i)*M_PI/static_cast(K) + │ │ │ │ +2.0*M_PI/static_cast(K)))/static_cast(K)); │ │ │ │ +161 } │ │ │ │ +162 } │ │ │ │ +163 │ │ │ │ +164 //just to be sure: │ │ │ │ +165 weights_[6].resize(0); │ │ │ │ +166 │ │ │ │ +167 } │ │ │ │ +168 │ │ │ │ +169 │ │ │ │ +170protected: │ │ │ │ +171 │ │ │ │ +172 │ │ │ │ +_1_7_3 bool _p_r_e_p_a_r_e( MeshType& _m ) override │ │ │ │ +174 { │ │ │ │ +175 _m.request_edge_status(); │ │ │ │ +176 _m.add_property( fp_pos_ ); │ │ │ │ +177 _m.add_property( ep_nv_ ); │ │ │ │ +178 _m.add_property( mp_gen_ ); │ │ │ │ +179 _m.property( mp_gen_ ) = 0; │ │ │ │ +180 │ │ │ │ +181 return _m.has_edge_status() │ │ │ │ +182 && ep_nv_._i_s___v_a_l_i_d() && mp_gen_._i_s___v_a_l_i_d(); │ │ │ │ +183 } │ │ │ │ +184 │ │ │ │ +185 │ │ │ │ +_1_8_6 bool _c_l_e_a_n_u_p( MeshType& _m ) override │ │ │ │ +187 { │ │ │ │ +188 _m.release_edge_status(); │ │ │ │ +189 _m.remove_property( fp_pos_ ); │ │ │ │ +190 _m.remove_property( ep_nv_ ); │ │ │ │ +191 _m.remove_property( mp_gen_ ); │ │ │ │ +192 return true; │ │ │ │ +193 } │ │ │ │ +194 │ │ │ │ +195 │ │ │ │ +_1_9_6 bool _s_u_b_d_i_v_i_d_e( MeshType& _m, size_t _n , const bool _update_points = true) │ │ │ │ +override │ │ │ │ +197 { │ │ │ │ +198 │ │ │ │ +200 │ │ │ │ +201 typename MeshType::VertexIter vit; │ │ │ │ +202 typename MeshType::VertexVertexIter vvit; │ │ │ │ +203 typename MeshType::EdgeIter eit; │ │ │ │ +204 typename MeshType::FaceIter fit; │ │ │ │ +205 typename MeshType::FaceVertexIter fvit; │ │ │ │ +206 typename MeshType::FaceHalfedgeIter fheit; │ │ │ │ +207 typename MeshType::VertexHandle vh; │ │ │ │ +208 typename MeshType::HalfedgeHandle heh; │ │ │ │ +209 typename MeshType::Point pos(0,0,0), zero(0,0,0); │ │ │ │ +210 size_t &gen = _m.property( mp_gen_ ); │ │ │ │ +211 │ │ │ │ +212 for (size_t l=0; l<_n; ++l) │ │ │ │ +213 { │ │ │ │ +214 // tag existing edges │ │ │ │ +215 for (eit=_m.edges_begin(); eit != _m.edges_end();++eit) │ │ │ │ +216 { │ │ │ │ +217 _m.status( *eit ).set_tagged( true ); │ │ │ │ +218 if ( (gen%2) && _m.is_boundary(*eit) ) │ │ │ │ +219 compute_new_boundary_points( _m, *eit ); // *) creates new vertices │ │ │ │ +220 } │ │ │ │ +221 │ │ │ │ +222 // insert new vertices, and store pos in vp_pos_ │ │ │ │ +223 typename MeshType::FaceIter fend = _m.faces_end(); │ │ │ │ +224 for (fit = _m.faces_begin();fit != fend; ++fit) │ │ │ │ +225 { │ │ │ │ +226 if (_m.is_boundary(*fit)) │ │ │ │ +227 { │ │ │ │ +228 if(gen%2) │ │ │ │ +229 _m.property(fp_pos_, *fit).invalidate(); │ │ │ │ +230 else │ │ │ │ +231 { │ │ │ │ +232 //find the interior boundary halfedge │ │ │ │ +233 for( heh = _m.halfedge_handle(*fit); !_m.is_boundary │ │ │ │ +( _m.opposite_halfedge_handle(heh) ); heh = _m.next_halfedge_handle(heh) ) │ │ │ │ +234 ; │ │ │ │ +235 assert(_m.is_boundary( _m.opposite_halfedge_handle(heh) )); │ │ │ │ +236 pos = zero; │ │ │ │ +237 //check for two boundaries case: │ │ │ │ +238 if( _m.is_boundary(_m.next_halfedge_handle(heh)) || _m.is_boundary │ │ │ │ +(_m.prev_halfedge_handle(heh)) ) │ │ │ │ +239 { │ │ │ │ +240 if(_m.is_boundary(_m.prev_halfedge_handle(heh))) │ │ │ │ +241 heh = _m.prev_halfedge_handle(heh); //ensure that the boundary halfedges │ │ │ │ +are heh and heh->next │ │ │ │ +242 //check for three boundaries case: │ │ │ │ +243 if(_m.is_boundary(_m.next_halfedge_handle(_m.next_halfedge_handle(heh)))) │ │ │ │ +244 { │ │ │ │ +245 //three boundaries, use COG of triangle │ │ │ │ +246 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +247 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle │ │ │ │ +(heh))); │ │ │ │ +248 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))); │ │ │ │ +249 } │ │ │ │ +250 else │ │ │ │ +251 { │ │ │ │ +252#ifdef MIRROR_TRIANGLES │ │ │ │ +253 //two boundaries, mirror two triangles │ │ │ │ +254 pos += real_t(2.0/9) * _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +255 pos += real_t(4.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle │ │ │ │ +(heh))); │ │ │ │ +256 pos += real_t(4.0/9) * _m.point(_m.to_vertex_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))); │ │ │ │ +257 pos += real_t(-1.0/9) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))))); │ │ │ │ +258#else │ │ │ │ +259 pos += real_t(7.0/24) * _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +260 pos += real_t(3.0/8) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle │ │ │ │ +(heh))); │ │ │ │ +261 pos += real_t(3.0/8) * _m.point(_m.to_vertex_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))); │ │ │ │ +262 pos += real_t(-1.0/24) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))))); │ │ │ │ +263#endif │ │ │ │ +264 } │ │ │ │ +265 } │ │ │ │ +266 else │ │ │ │ +267 { │ │ │ │ +268 vh = _m.to_vertex_handle(_m.next_halfedge_handle(heh)); │ │ │ │ +269 //check last vertex regularity │ │ │ │ +270 if((_m.valence(vh) == 6) || _m.is_boundary(vh)) │ │ │ │ +271 { │ │ │ │ +272#ifdef MIRROR_TRIANGLES │ │ │ │ +273 //use regular rule and mirror one triangle │ │ │ │ +274 pos += real_t(5.0/9) * _m.point(vh); │ │ │ │ +275 pos += real_t(3.0/9) * _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +276 pos += real_t(3.0/9) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.opposite_halfedge_handle(heh))); │ │ │ │ +277 pos += real_t(-1.0/9) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.next_halfedge_handle │ │ │ │ +(heh))))); │ │ │ │ +278 pos += real_t(-1.0/9) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))))); │ │ │ │ +279#else │ │ │ │ +280#ifdef MIN_NORM │ │ │ │ +281 pos += real_t(1.0/9) * _m.point(vh); │ │ │ │ +282 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +283 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.opposite_halfedge_handle(heh))); │ │ │ │ +284 pos += real_t(1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle │ │ │ │ +(_m.opposite_halfedge_handle(_m.next_halfedge_handle(heh))))); │ │ │ │ +285 pos += real_t(1.0/9) * _m.point(_m.to_vertex_handle(_m.next_halfedge_handle │ │ │ │ +(_m.opposite_halfedge_handle(_m.prev_halfedge_handle(heh))))); │ │ │ │ +286#else │ │ │ │ +287 pos += real_t(1.0/2) * _m.point(vh); │ │ │ │ +288 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle(heh)); │ │ │ │ +289 pos += real_t(1.0/3) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.opposite_halfedge_handle(heh))); │ │ │ │ +290 pos += real_t(-1.0/12) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.next_halfedge_handle │ │ │ │ +(heh))))); │ │ │ │ +291 pos += real_t(-1.0/12) * _m.point(_m.to_vertex_handle │ │ │ │ +(_m.next_halfedge_handle(_m.opposite_halfedge_handle(_m.prev_halfedge_handle │ │ │ │ +(heh))))); │ │ │ │ +292#endif │ │ │ │ +293#endif │ │ │ │ +294 } │ │ │ │ +295 else │ │ │ │ +296 { │ │ │ │ +297 //irregular setting, use usual irregular rule │ │ │ │ +298 unsigned int K = _m.valence(vh); │ │ │ │ +299 pos += weights_[K][K]*_m.point(vh); │ │ │ │ +300 heh = _m.opposite_halfedge_handle( _m.next_halfedge_handle(heh) ); │ │ │ │ +301 for(unsigned int i = 0; iP3 (heh) in P2->pl (heh) and pl->P3 │ │ │ │ +484 boundary_split( _m, heh, vhl ); // split edge │ │ │ │ +485 pl_P3 = _m.next_halfedge_handle( heh ); // store next halfedge handle │ │ │ │ +486 boundary_split( _m, heh ); // split face │ │ │ │ +487 │ │ │ │ +488 // split pl->P3 in pl->pr and pr->P3 │ │ │ │ +489 boundary_split( _m, pl_P3, vhr ); │ │ │ │ +490 boundary_split( _m, pl_P3 ); │ │ │ │ +491 │ │ │ │ +492 assert( _m.is_boundary( vhl ) && _m.halfedge_handle(vhl).is_valid() ); │ │ │ │ +493 assert( _m.is_boundary( vhr ) && _m.halfedge_handle(vhr).is_valid() ); │ │ │ │ +494 } │ │ │ │ +495 │ │ │ │ +496 void boundary_split(MeshType& _m, │ │ │ │ +497 const typename MeshType::HalfedgeHandle& _heh, │ │ │ │ +498 const typename MeshType::VertexHandle& _vh) │ │ │ │ +499 { │ │ │ │ +500 assert( _m.is_boundary( _m.edge_handle(_heh) ) ); │ │ │ │ +501 │ │ │ │ +502 typename MeshType::HalfedgeHandle │ │ │ │ +503 heh(_heh), │ │ │ │ +504 opp_heh( _m.opposite_halfedge_handle(_heh) ), │ │ │ │ +505 new_heh, opp_new_heh; │ │ │ │ +506 typename MeshType::VertexHandle to_vh(_m.to_vertex_handle(heh)); │ │ │ │ +507 typename MeshType::HalfedgeHandle t_heh; │ │ │ │ +508 │ │ │ │ +509 /* │ │ │ │ +510 * P5 │ │ │ │ +511 * * │ │ │ │ +512 * /|\ │ │ │ │ +513 * / \ │ │ │ │ +514 * / \ │ │ │ │ +515 * / \ │ │ │ │ +516 * / \ │ │ │ │ +517 * /_ heh new \ │ │ │ │ +518 * *-----\*-----\*\-----* │ │ │ │ +519 * ^ ^ t_heh │ │ │ │ +520 * _vh to_vh │ │ │ │ +521 * │ │ │ │ +522 * P1 P2 P3 P4 │ │ │ │ +523 */ │ │ │ │ +524 // Re-Setting Handles │ │ │ │ +525 │ │ │ │ +526 // find halfedge point from P4 to P3 │ │ │ │ +527 for(t_heh = heh; │ │ │ │ +528 _m.next_halfedge_handle(t_heh) != opp_heh; │ │ │ │ +529 t_heh = _m.opposite_halfedge_handle(_m.next_halfedge_handle(t_heh))) │ │ │ │ +530 {} │ │ │ │ +531 │ │ │ │ +532 assert( _m.is_boundary( t_heh ) ); │ │ │ │ +533 │ │ │ │ +534 new_heh = _m.new_edge( _vh, to_vh ); │ │ │ │ +535 opp_new_heh = _m.opposite_halfedge_handle(new_heh); │ │ │ │ +536 │ │ │ │ +537 // update halfedge connectivity │ │ │ │ +538 _m.set_next_halfedge_handle(t_heh, opp_new_heh); // P4-P3 -> P3-P2 │ │ │ │ +539 _m.set_next_halfedge_handle(new_heh, _m.next_halfedge_handle(heh)); // P2- │ │ │ │ +P3 -> P3-P5 │ │ │ │ +540 _m.set_next_halfedge_handle(heh, new_heh); // P1-P2 -> P2-P3 │ │ │ │ +541 _m.set_next_halfedge_handle(opp_new_heh, opp_heh); // P3-P2 -> P2-P1 │ │ │ │ +542 │ │ │ │ +543 // both opposite halfedges point to same face │ │ │ │ +544 _m.set_face_handle(opp_new_heh, _m.face_handle(opp_heh)); │ │ │ │ +545 │ │ │ │ +546 // let heh finally point to new inserted vertex │ │ │ │ +547 _m.set_vertex_handle(heh, _vh); │ │ │ │ +548 │ │ │ │ +549 // let heh and new_heh point to same face │ │ │ │ +550 _m.set_face_handle(new_heh, _m.face_handle(heh)); │ │ │ │ +551 │ │ │ │ +552 // let opp_new_heh be the new outgoing halfedge for to_vh │ │ │ │ +553 // (replaces for opp_heh) │ │ │ │ +554 _m.set_halfedge_handle( to_vh, opp_new_heh ); │ │ │ │ +555 │ │ │ │ +556 // let opp_heh be the outgoing halfedge for _vh │ │ │ │ +557 _m.set_halfedge_handle( _vh, opp_heh ); │ │ │ │ +558 } │ │ │ │ +559 │ │ │ │ +560 void boundary_split( MeshType& _m, │ │ │ │ +561 const typename MeshType::HalfedgeHandle& _heh) │ │ │ │ +562 { │ │ │ │ +563 assert( _m.is_boundary( _m.opposite_halfedge_handle( _heh ) ) ); │ │ │ │ +564 │ │ │ │ +565 typename MeshType::HalfedgeHandle │ │ │ │ +566 heh(_heh), │ │ │ │ +567 n_heh(_m.next_halfedge_handle(heh)); │ │ │ │ +568 │ │ │ │ +569 typename MeshType::VertexHandle │ │ │ │ +570 to_vh(_m.to_vertex_handle(heh)); │ │ │ │ +571 │ │ │ │ +572 typename MeshType::HalfedgeHandle │ │ │ │ +573 heh2(_m.new_edge(to_vh, │ │ │ │ +574 _m.to_vertex_handle(_m.next_halfedge_handle(n_heh)))), │ │ │ │ +575 heh3(_m.opposite_halfedge_handle(heh2)); │ │ │ │ +576 │ │ │ │ +577 typename MeshType::FaceHandle │ │ │ │ +578 new_fh(_m.new_face()), │ │ │ │ +579 fh(_m.face_handle(heh)); │ │ │ │ +580 │ │ │ │ +581 // Relink (half)edges │ │ │ │ +582 _m.set_face_handle(heh, new_fh); │ │ │ │ +583 _m.set_face_handle(heh2, new_fh); │ │ │ │ +584 _m.set_next_halfedge_handle(heh2, _m.next_halfedge_handle │ │ │ │ +(_m.next_halfedge_handle(n_heh))); │ │ │ │ +585 _m.set_next_halfedge_handle(heh, heh2); │ │ │ │ +586 _m.set_face_handle( _m.next_halfedge_handle(heh2), new_fh); │ │ │ │ +587 │ │ │ │ +588 _m.set_next_halfedge_handle(heh3, n_heh); │ │ │ │ +589 _m.set_next_halfedge_handle(_m.next_halfedge_handle(n_heh), heh3); │ │ │ │ +590 _m.set_face_handle(heh3, fh); │ │ │ │ +591 │ │ │ │ +592 _m.set_halfedge_handle( fh, n_heh); │ │ │ │ +593 _m.set_halfedge_handle(new_fh, heh); │ │ │ │ +594 │ │ │ │ +595 │ │ │ │ +596 } │ │ │ │ +597 │ │ │ │ +598private: │ │ │ │ +599 │ │ │ │ +600 weights_t weights_; │ │ │ │ +601 _O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _M_e_s_h_T_y_p_e_:_:_V_e_r_t_e_x_H_a_n_d_l_e_ _> fp_pos_; │ │ │ │ +602 _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T< std::pair< typename MeshType::VertexHandle, │ │ │ │ +603 typename MeshType::VertexHandle> > ep_nv_; │ │ │ │ +604 _O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_ _s_i_z_e___t_ _> mp_gen_; │ │ │ │ +605}; │ │ │ │ +606 │ │ │ │ +607 │ │ │ │ +608// │ │ │ │ ============================================================================= │ │ │ │ -90} // namespace IO │ │ │ │ -91} // namespace OpenMesh │ │ │ │ -92// │ │ │ │ +609} // END_NS_UNIFORM │ │ │ │ +610} // END_NS_SUBDIVIDER │ │ │ │ +611} // END_NS_OPENMESH │ │ │ │ +612// │ │ │ │ ============================================================================= │ │ │ │ -93#endif │ │ │ │ -94// │ │ │ │ +613#endif // OPENMESH_SUBDIVIDER_UNIFORM_SQRT3T_HH │ │ │ │ +614// │ │ │ │ ============================================================================= │ │ │ │ +_S_u_b_d_i_v_i_d_e_r_T_._h_h │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ +bool is_valid() const │ │ │ │ +The handle is valid iff the index is not negative. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing an edge property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:447 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_ _t_y_p_e_n_a_m_e_ _M_e_s_h_T_y_p_e_:_:_V_e_r_t_e_x_H_a_n_d_l_e_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_ _s_i_z_e___t_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T │ │ │ │ +Uniform Interpolating Sqrt3 subdivision algorithm │ │ │ │ +DDeeffiinniittiioonn Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:107 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T_:_:_c_l_e_a_n_u_p │ │ │ │ +bool cleanup(MeshType &_m) override │ │ │ │ +Cleanup mesh after usage, e.g. remove added properties. │ │ │ │ +DDeeffiinniittiioonn Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:186 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T_:_:_n_a_m_e │ │ │ │ +const char * name() const override │ │ │ │ +Return name of subdivision algorithm. │ │ │ │ +DDeeffiinniittiioonn Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:131 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T_:_:_s_u_b_d_i_v_i_d_e │ │ │ │ +bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true) │ │ │ │ +override │ │ │ │ +Subdivide mesh _m _n times. │ │ │ │ +DDeeffiinniittiioonn Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:196 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T_:_:_p_r_e_p_a_r_e │ │ │ │ +bool prepare(MeshType &_m) override │ │ │ │ +Prepare mesh, e.g. │ │ │ │ +DDeeffiinniittiioonn Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:173 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_I_n_t_e_r_p_o_l_a_t_i_n_g_S_q_r_t_3_L_G_T_:_:_i_n_i_t___w_e_i_g_h_t_s │ │ │ │ +void init_weights(size_t _max_valence=50) │ │ │ │ +Pre-compute weights. │ │ │ │ +DDeeffiinniittiioonn Sqrt3InterpolatingSubdividerLabsikGreinerT.hh:134 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_u_b_d_i_v_i_d_e_r_:_:_U_n_i_f_o_r_m_:_:_S_u_b_d_i_v_i_d_e_r_T │ │ │ │ +Abstract base class for uniform subdivision algorithms. │ │ │ │ +DDeeffiinniittiioonn SubdividerT.hh:89 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00545_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/reader/OBJReader.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/SmartTagger/SmartTaggerT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OBJReader.hh
│ │ │ +
SmartTaggerT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -136,176 +136,215 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ +
42#define OPENMESH_SMARTTAGGERT_C
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Implements an reader module for OBJ files
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ +
44//== INCLUDES =================================================================
│ │ │ +
45
│ │ │ +
46#include "SmartTaggerT.hh"
│ │ │ +
47
│ │ │ +
48#include <iostream>
│ │ │ +
49#include <limits>
│ │ │
50
│ │ │ -
51
│ │ │ -
52#ifndef __OBJREADER_HH__
│ │ │ -
53#define __OBJREADER_HH__
│ │ │ +
51//== NAMESPACES ===============================================================
│ │ │ +
52
│ │ │ +
53namespace OpenMesh {
│ │ │
54
│ │ │ -
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ -
57
│ │ │ -
58
│ │ │ -
59#include <iosfwd>
│ │ │ -
60#include <string>
│ │ │ -
61#include <map>
│ │ │ -
62
│ │ │ -
63#include <OpenMesh/Core/System/config.h>
│ │ │ -
64#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
65#include <OpenMesh/Core/IO/importer/BaseImporter.hh>
│ │ │ -
66#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ -
67
│ │ │ -
68
│ │ │ -
69//== NAMESPACES ===============================================================
│ │ │ +
55//== IMPLEMENTATION ==========================================================
│ │ │ +
56
│ │ │ +
57template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
│ │ │ + │ │ │ +
59SmartTaggerT(Mesh& _mesh, unsigned int _tag_range)
│ │ │ +
60 : mesh_(_mesh),
│ │ │ +
61 current_base_(0),
│ │ │ +
62 tag_range_(_tag_range)
│ │ │ +
63{
│ │ │ +
64 // add new property
│ │ │ +
65 mesh_.add_property(ep_tag_);
│ │ │ +
66
│ │ │ +
67 // reset all tags once
│ │ │ +
68 all_tags_to_zero();
│ │ │ +
69}
│ │ │ +
│ │ │
70
│ │ │
71
│ │ │ -
72namespace OpenMesh {
│ │ │ -
73namespace IO {
│ │ │ +
72//-----------------------------------------------------------------------------
│ │ │ +
73
│ │ │
74
│ │ │ -
75
│ │ │ -
76//== IMPLEMENTATION ===========================================================
│ │ │ -
77
│ │ │ -
78
│ │ │ -
│ │ │ -
82class OPENMESHDLLEXPORT _OBJReader_ : public BaseReader
│ │ │ -
83{
│ │ │ -
84public:
│ │ │ +
75template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
78{
│ │ │ +
79 mesh_.remove_property(ep_tag_);
│ │ │ +
80}
│ │ │ +
│ │ │ +
81
│ │ │ +
82
│ │ │ +
83//-----------------------------------------------------------------------------
│ │ │ +
84
│ │ │
85
│ │ │ - │ │ │ -
87
│ │ │ -
88 virtual ~_OBJReader_() { }
│ │ │ -
89
│ │ │ -
90 std::string get_description() const override { return "Alias/Wavefront"; }
│ │ │ -
91 std::string get_extensions() const override { return "obj"; }
│ │ │ +
86template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
87void
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
90{
│ │ │ +
91 unsigned int max_uint = std::numeric_limits<unsigned int>::max();
│ │ │
92
│ │ │ -
93 bool read(const std::string& _filename,
│ │ │ -
94 BaseImporter& _bi,
│ │ │ -
95 Options& _opt) override;
│ │ │ -
96
│ │ │ -
97 bool read(std::istream& _in,
│ │ │ -
98 BaseImporter& _bi,
│ │ │ -
99 Options& _opt) override;
│ │ │ -
100
│ │ │ -
101private:
│ │ │ -
102
│ │ │ -
103#ifndef DOXY_IGNORE_THIS
│ │ │ -
104 class Material
│ │ │ -
105 {
│ │ │ -
106 public:
│ │ │ -
107
│ │ │ -
108 Material():Tr_(0),index_Kd_(0) { cleanup(); }
│ │ │ +
93 if( current_base_ < max_uint - 2*tag_range_)
│ │ │ +
94 current_base_ += tag_range_;
│ │ │ +
95 else
│ │ │ +
96 {
│ │ │ +
97 //overflow -> reset all tags
│ │ │ +
98#ifdef STV_DEBUG_CHECKS
│ │ │ +
99 std::cerr << "Tagging Overflow occured...\n";
│ │ │ +
100#endif
│ │ │ +
101 current_base_ = 0;
│ │ │ +
102 all_tags_to_zero();
│ │ │ +
103 }
│ │ │ +
104}
│ │ │ +
│ │ │ +
105
│ │ │ +
106
│ │ │ +
107//-----------------------------------------------------------------------------
│ │ │ +
108
│ │ │
109
│ │ │ -
110 void cleanup()
│ │ │ -
111 {
│ │ │ -
112 Kd_is_set_ = false;
│ │ │ -
113 Ka_is_set_ = false;
│ │ │ -
114 Ks_is_set_ = false;
│ │ │ -
115 Tr_is_set_ = false;
│ │ │ -
116 map_Kd_is_set_ = false;
│ │ │ -
117 }
│ │ │ +
110template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
111void
│ │ │ +
│ │ │ + │ │ │ +
113untag_all( const unsigned int _new_tag_range)
│ │ │ +
114{
│ │ │ +
115 set_tag_range(_new_tag_range);
│ │ │ +
116}
│ │ │ +
│ │ │ +
117
│ │ │
118
│ │ │ -
119 bool is_valid(void) const
│ │ │ -
120 { return Kd_is_set_ || Ka_is_set_ || Ks_is_set_ || Tr_is_set_ || map_Kd_is_set_; }
│ │ │ -
121
│ │ │ -
122 bool has_Kd(void) { return Kd_is_set_; }
│ │ │ -
123 bool has_Ka(void) { return Ka_is_set_; }
│ │ │ -
124 bool has_Ks(void) { return Ks_is_set_; }
│ │ │ -
125 bool has_Tr(void) { return Tr_is_set_; }
│ │ │ -
126 bool has_map_Kd(void) { return map_Kd_is_set_; }
│ │ │ -
127
│ │ │ -
128 void set_Kd( float r, float g, float b )
│ │ │ -
129 { Kd_=Vec3f(r,g,b); Kd_is_set_=true; }
│ │ │ +
119//-----------------------------------------------------------------------------
│ │ │ +
120
│ │ │ +
121template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
122void
│ │ │ +
│ │ │ + │ │ │ +
124set_tag ( const EHandle _eh, unsigned int _tag)
│ │ │ +
125{
│ │ │ +
126#ifdef STV_DEBUG_CHECKS
│ │ │ +
127 if( _tag > tag_range_)
│ │ │ +
128 std::cerr << "ERROR in set_tag tag range!!!\n";
│ │ │ +
│ │ │ +
129#endif
│ │ │
130
│ │ │ -
131 void set_Ka( float r, float g, float b )
│ │ │ -
132 { Ka_=Vec3f(r,g,b); Ka_is_set_=true; }
│ │ │ +
131 mesh_.property(ep_tag_, _eh) = current_base_ + _tag;
│ │ │ +
│ │ │ + │ │ │
133
│ │ │ -
134 void set_Ks( float r, float g, float b )
│ │ │ -
135 { Ks_=Vec3f(r,g,b); Ks_is_set_=true; }
│ │ │ +
134
│ │ │ +
135//-----------------------------------------------------------------------------
│ │ │
136
│ │ │ -
137 void set_Tr( float t )
│ │ │ -
138 { Tr_=t; Tr_is_set_=true; }
│ │ │ -
139
│ │ │ -
140 void set_map_Kd( const std::string& _name, int _index_Kd )
│ │ │ -
141 { map_Kd_ = _name, index_Kd_ = _index_Kd; map_Kd_is_set_ = true; };
│ │ │ -
142
│ │ │ -
143 const Vec3f& Kd( void ) const { return Kd_; }
│ │ │ -
144 const Vec3f& Ka( void ) const { return Ka_; }
│ │ │ -
145 const Vec3f& Ks( void ) const { return Ks_; }
│ │ │ -
146 float Tr( void ) const { return Tr_; }
│ │ │ -
147 const std::string& map_Kd( void ) { return map_Kd_ ; }
│ │ │ -
148 const int& map_Kd_index( void ) { return index_Kd_ ; }
│ │ │ +
│ │ │ + │ │ │ +
138template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
139unsigned int
│ │ │ +
│ │ │ + │ │ │ +
141get_tag ( const EHandle _eh) const
│ │ │ +
142{
│ │ │ +
│ │ │ +
143 unsigned int t = mesh_.property(ep_tag_, _eh);
│ │ │ +
144
│ │ │ +
145#ifdef STV_DEBUG_CHECKS
│ │ │ +
146 if( t > current_base_ + tag_range_)
│ │ │ +
147 std::cerr << "ERROR in get_tag tag range!!!\n";
│ │ │ +
148#endif
│ │ │
149
│ │ │ -
150 private:
│ │ │ -
151
│ │ │ -
152 Vec3f Kd_; bool Kd_is_set_; // diffuse
│ │ │ -
153 Vec3f Ka_; bool Ka_is_set_; // ambient
│ │ │ -
154 Vec3f Ks_; bool Ks_is_set_; // specular
│ │ │ -
155 float Tr_; bool Tr_is_set_; // transperency
│ │ │ +
│ │ │ +
150 if( t<= current_base_) return 0;
│ │ │ +
151 else return t-current_base_;
│ │ │ +
152}
│ │ │ +
153
│ │ │ +
154
│ │ │ +
155//-----------------------------------------------------------------------------
│ │ │
156
│ │ │ -
157 std::string map_Kd_; int index_Kd_; bool map_Kd_is_set_; // Texture
│ │ │ -
158
│ │ │ -
159 };
│ │ │ -
160#endif
│ │ │ -
161
│ │ │ -
162 typedef std::map<std::string, Material> MaterialList;
│ │ │ -
163
│ │ │ -
164 MaterialList materials_;
│ │ │ +
│ │ │ + │ │ │ +
158template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
159bool
│ │ │ +
│ │ │ + │ │ │ +
161is_tagged( const EHandle _eh) const
│ │ │ +
162{
│ │ │ +
163 return bool(get_tag(_eh));
│ │ │ + │ │ │ +
│ │ │
165
│ │ │ -
166 bool read_material( std::fstream& _in );
│ │ │ -
167
│ │ │ +
166
│ │ │ +
167//-----------------------------------------------------------------------------
│ │ │
168
│ │ │ -
169private:
│ │ │ -
170
│ │ │ -
171 bool read_vertices(std::istream& _in, BaseImporter& _bi, Options& _opt,
│ │ │ -
172 std::vector<Vec3f> & normals,
│ │ │ -
173 std::vector<Vec3f> & colors,
│ │ │ -
174 std::vector<Vec3f> & texcoords3d,
│ │ │ -
175 std::vector<Vec2f> & texcoords,
│ │ │ -
176 std::vector<VertexHandle> & vertexHandles,
│ │ │ -
177 Options & fileOptions);
│ │ │ -
178
│ │ │ -
179 std::string path_;
│ │ │ -
180
│ │ │ -
181};
│ │ │ -
│ │ │ -
182
│ │ │ -
183
│ │ │ -
184//== TYPE DEFINITION ==========================================================
│ │ │ -
185
│ │ │ +
169
│ │ │ +
170template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
171void
│ │ │ +
│ │ │ + │ │ │ +
173set_tag_range( const unsigned int _tag_range)
│ │ │ +
174{
│ │ │ +
175 if( _tag_range <= tag_range_)
│ │ │ +
176 {
│ │ │ +
177 untag_all();
│ │ │ +
178 tag_range_ = _tag_range;
│ │ │ +
179 }
│ │ │ +
180 else
│ │ │ +
181 {
│ │ │ +
182 tag_range_ = _tag_range;
│ │ │ +
183 untag_all();
│ │ │ +
184 }
│ │ │ +
185}
│ │ │ +
│ │ │
186
│ │ │ -
187extern _OBJReader_ __OBJReaderInstance;
│ │ │ -
188OPENMESHDLLEXPORT _OBJReader_& OBJReader();
│ │ │ +
187
│ │ │ +
188//-----------------------------------------------------------------------------
│ │ │
189
│ │ │
190
│ │ │ -
191//=============================================================================
│ │ │ -
192} // namespace IO
│ │ │ -
193} // namespace OpenMesh
│ │ │ -
194//=============================================================================
│ │ │ -
195#endif
│ │ │ -
196//=============================================================================
│ │ │ +
191template <class Mesh, class EHandle, class EPHandle>
│ │ │ +
192void
│ │ │ + │ │ │ + │ │ │ +
195{
│ │ │ +
196 // iterate over property vector
│ │ │ +
197 for(unsigned int i=0; i<mesh_.property(ep_tag_).n_elements(); ++i)
│ │ │ +
198 {
│ │ │ +
199 mesh_.property(ep_tag_)[i] = 0;
│ │ │ +
200 }
│ │ │ +
201}
│ │ │ +
202
│ │ │ +
203//=============================================================================
│ │ │ +
204} // namespace OpenMesh
│ │ │ +
205//=============================================================================
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
VectorT< float, 3 > Vec3f
3-float vector
Definition Vector11T.hh:851
│ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for reader modules.
Definition BaseReader.hh:87
│ │ │ -
Implementation of the OBJ format reader.
Definition OBJReader.hh:83
│ │ │ -
std::string get_extensions() const override
Returns a string with the accepted file extensions separated by a whitespace and in small caps.
Definition OBJReader.hh:91
│ │ │ -
std::string get_description() const override
Returns a brief description of the file type that can be parsed.
Definition OBJReader.hh:90
│ │ │ +
Smart Tagger.
Definition SmartTaggerT.hh:125
│ │ │ +
unsigned int get_tag(const EHandle _eh) const
get tag value in range [0..tag_range]
Definition SmartTaggerT_impl.hh:141
│ │ │ +
bool is_tagged(const EHandle _eh) const
overloaded member for boolean tags
Definition SmartTaggerT_impl.hh:161
│ │ │ +
void set_tag(const EHandle _eh, unsigned int _tag=1)
set tag to a value in [0..tag_range]
Definition SmartTaggerT_impl.hh:124
│ │ │ +
void set_tag_range(const unsigned int _tag_range)
set new tag range and untag_all
Definition SmartTaggerT_impl.hh:173
│ │ │ +
void untag_all()
untag all elements
Definition SmartTaggerT_impl.hh:89
│ │ │ +
~SmartTaggerT()
Destructor.
Definition SmartTaggerT_impl.hh:77
│ │ │ +
SmartTaggerT(Mesh &_mesh, unsigned int _tag_range=1)
Constructor.
Definition SmartTaggerT_impl.hh:59
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,16 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OBJReader.hh │ │ │ │ +SmartTaggerT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -45,201 +45,222 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ +42#define OPENMESH_SMARTTAGGERT_C │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Implements an reader module for OBJ files │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ +44//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +45 │ │ │ │ +46#include "SmartTaggerT.hh" │ │ │ │ +47 │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ 50 │ │ │ │ -51 │ │ │ │ -52#ifndef __OBJREADER_HH__ │ │ │ │ -53#define __OBJREADER_HH__ │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ -57 │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62 │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66#include │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -69//== NAMESPACES │ │ │ │ +51//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ +52 │ │ │ │ +53namespace _O_p_e_n_M_e_s_h { │ │ │ │ +54 │ │ │ │ +55//== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ +56 │ │ │ │ +57template │ │ │ │ +_5_8_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +59_S_m_a_r_t_T_a_g_g_e_r_T(Mesh& _mesh, unsigned int _tag_range) │ │ │ │ +60 : mesh_(_mesh), │ │ │ │ +61 current_base_(0), │ │ │ │ +62 tag_range_(_tag_range) │ │ │ │ +63{ │ │ │ │ +64 // add new property │ │ │ │ +65 mesh_.add_property(ep_tag_); │ │ │ │ +66 │ │ │ │ +67 // reset all tags once │ │ │ │ +68 all_tags_to_zero(); │ │ │ │ +69} │ │ │ │ 70 │ │ │ │ 71 │ │ │ │ -72namespace _O_p_e_n_M_e_s_h { │ │ │ │ -73namespace IO { │ │ │ │ +72//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +73 │ │ │ │ 74 │ │ │ │ -75 │ │ │ │ -76//== IMPLEMENTATION │ │ │ │ -=========================================================== │ │ │ │ -77 │ │ │ │ -78 │ │ │ │ -_8_2class OPENMESHDLLEXPORT ___O_B_J_R_e_a_d_e_r__ : public _B_a_s_e_R_e_a_d_e_r │ │ │ │ -83{ │ │ │ │ -84public: │ │ │ │ +75template │ │ │ │ +_7_6_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +77_~_S_m_a_r_t_T_a_g_g_e_r_T() │ │ │ │ +78{ │ │ │ │ +79 mesh_.remove_property(ep_tag_); │ │ │ │ +80} │ │ │ │ +81 │ │ │ │ +82 │ │ │ │ +83//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +84 │ │ │ │ 85 │ │ │ │ -86 ___O_B_J_R_e_a_d_e_r__(); │ │ │ │ -87 │ │ │ │ -88 virtual _~___O_B_J_R_e_a_d_e_r__() { } │ │ │ │ -89 │ │ │ │ -_9_0 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "Alias/Wavefront"; } │ │ │ │ -_9_1 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "obj"; } │ │ │ │ +86template │ │ │ │ +87void │ │ │ │ +_8_8_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +89_u_n_t_a_g___a_l_l() │ │ │ │ +90{ │ │ │ │ +91 unsigned int max_uint = std::numeric_limits::max(); │ │ │ │ 92 │ │ │ │ -93 bool read(const std::string& _filename, │ │ │ │ -94 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -95 _O_p_t_i_o_n_s& _opt) override; │ │ │ │ -96 │ │ │ │ -97 bool read(std::istream& _in, │ │ │ │ -98 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -99 _O_p_t_i_o_n_s& _opt) override; │ │ │ │ -100 │ │ │ │ -101private: │ │ │ │ -102 │ │ │ │ -103#ifndef DOXY_IGNORE_THIS │ │ │ │ -104 class Material │ │ │ │ -105 { │ │ │ │ -106 public: │ │ │ │ -107 │ │ │ │ -108 Material():Tr_(0),index_Kd_(0) { cleanup(); } │ │ │ │ +93 if( current_base_ < max_uint - 2*tag_range_) │ │ │ │ +94 current_base_ += tag_range_; │ │ │ │ +95 else │ │ │ │ +96 { │ │ │ │ +97 //overflow -> reset all tags │ │ │ │ +98#ifdef STV_DEBUG_CHECKS │ │ │ │ +99 std::cerr << "Tagging Overflow occured...\n"; │ │ │ │ +100#endif │ │ │ │ +101 current_base_ = 0; │ │ │ │ +102 all_tags_to_zero(); │ │ │ │ +103 } │ │ │ │ +104} │ │ │ │ +105 │ │ │ │ +106 │ │ │ │ +107//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +108 │ │ │ │ 109 │ │ │ │ -110 void cleanup() │ │ │ │ -111 { │ │ │ │ -112 Kd_is_set_ = false; │ │ │ │ -113 Ka_is_set_ = false; │ │ │ │ -114 Ks_is_set_ = false; │ │ │ │ -115 Tr_is_set_ = false; │ │ │ │ -116 map_Kd_is_set_ = false; │ │ │ │ -117 } │ │ │ │ +110template │ │ │ │ +111void │ │ │ │ +_1_1_2_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +113_u_n_t_a_g___a_l_l( const unsigned int _new_tag_range) │ │ │ │ +114{ │ │ │ │ +115 set_tag_range(_new_tag_range); │ │ │ │ +116} │ │ │ │ +117 │ │ │ │ 118 │ │ │ │ -119 bool is_valid(void) const │ │ │ │ -120 { return Kd_is_set_ || Ka_is_set_ || Ks_is_set_ || Tr_is_set_ || │ │ │ │ -map_Kd_is_set_; } │ │ │ │ -121 │ │ │ │ -122 bool has_Kd(void) { return Kd_is_set_; } │ │ │ │ -123 bool has_Ka(void) { return Ka_is_set_; } │ │ │ │ -124 bool has_Ks(void) { return Ks_is_set_; } │ │ │ │ -125 bool has_Tr(void) { return Tr_is_set_; } │ │ │ │ -126 bool has_map_Kd(void) { return map_Kd_is_set_; } │ │ │ │ -127 │ │ │ │ -128 void set_Kd( float r, float g, float b ) │ │ │ │ -129 { Kd_=_V_e_c_3_f(r,g,b); Kd_is_set_=true; } │ │ │ │ +119//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +120 │ │ │ │ +121template │ │ │ │ +122void │ │ │ │ +_1_2_3_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +124_s_e_t___t_a_g ( const EHandle _eh, unsigned int _tag) │ │ │ │ +125{ │ │ │ │ +126#ifdef STV_DEBUG_CHECKS │ │ │ │ +127 if( _tag > tag_range_) │ │ │ │ +128 std::cerr << "ERROR in set_tag tag range!!!\n"; │ │ │ │ +_1_2_9#endif │ │ │ │ 130 │ │ │ │ -131 void set_Ka( float r, float g, float b ) │ │ │ │ -132 { Ka_=_V_e_c_3_f(r,g,b); Ka_is_set_=true; } │ │ │ │ +131 mesh_.property(ep_tag_, _eh) = current_base_ + _tag; │ │ │ │ +_1_3_2} │ │ │ │ 133 │ │ │ │ -134 void set_Ks( float r, float g, float b ) │ │ │ │ -135 { Ks_=_V_e_c_3_f(r,g,b); Ks_is_set_=true; } │ │ │ │ +134 │ │ │ │ +135//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ 136 │ │ │ │ -137 void set_Tr( float t ) │ │ │ │ -138 { Tr_=t; Tr_is_set_=true; } │ │ │ │ -139 │ │ │ │ -140 void set_map_Kd( const std::string& _name, int _index_Kd ) │ │ │ │ -141 { map_Kd_ = _name, index_Kd_ = _index_Kd; map_Kd_is_set_ = true; }; │ │ │ │ -142 │ │ │ │ -143 const _V_e_c_3_f& Kd( void ) const { return Kd_; } │ │ │ │ -144 const _V_e_c_3_f& Ka( void ) const { return Ka_; } │ │ │ │ -145 const _V_e_c_3_f& Ks( void ) const { return Ks_; } │ │ │ │ -146 float Tr( void ) const { return Tr_; } │ │ │ │ -147 const std::string& map_Kd( void ) { return map_Kd_ ; } │ │ │ │ -148 const int& map_Kd_index( void ) { return index_Kd_ ; } │ │ │ │ +_1_3_7 │ │ │ │ +138template │ │ │ │ +139unsigned int │ │ │ │ +_1_4_0_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +141_g_e_t___t_a_g ( const EHandle _eh) const │ │ │ │ +142{ │ │ │ │ +_1_4_3 unsigned int t = mesh_.property(ep_tag_, _eh); │ │ │ │ +144 │ │ │ │ +145#ifdef STV_DEBUG_CHECKS │ │ │ │ +146 if( t > current_base_ + tag_range_) │ │ │ │ +147 std::cerr << "ERROR in get_tag tag range!!!\n"; │ │ │ │ +148#endif │ │ │ │ 149 │ │ │ │ -150 private: │ │ │ │ -151 │ │ │ │ -152 _V_e_c_3_f Kd_; bool Kd_is_set_; // diffuse │ │ │ │ -153 _V_e_c_3_f Ka_; bool Ka_is_set_; // ambient │ │ │ │ -154 _V_e_c_3_f Ks_; bool Ks_is_set_; // specular │ │ │ │ -155 float Tr_; bool Tr_is_set_; // transperency │ │ │ │ +_1_5_0 if( t<= current_base_) return 0; │ │ │ │ +151 else return t-current_base_; │ │ │ │ +152} │ │ │ │ +153 │ │ │ │ +154 │ │ │ │ +155//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ 156 │ │ │ │ -157 std::string map_Kd_; int index_Kd_; bool map_Kd_is_set_; // Texture │ │ │ │ -158 │ │ │ │ -159 }; │ │ │ │ -160#endif │ │ │ │ -161 │ │ │ │ -162 typedef std::map MaterialList; │ │ │ │ -163 │ │ │ │ -164 MaterialList materials_; │ │ │ │ +_1_5_7 │ │ │ │ +158template │ │ │ │ +159bool │ │ │ │ +_1_6_0_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +161_i_s___t_a_g_g_e_d( const EHandle _eh) const │ │ │ │ +162{ │ │ │ │ +163 return bool(get_tag(_eh)); │ │ │ │ +_1_6_4} │ │ │ │ 165 │ │ │ │ -166 bool read_material( std::fstream& _in ); │ │ │ │ -167 │ │ │ │ +166 │ │ │ │ +167//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ 168 │ │ │ │ -169private: │ │ │ │ -170 │ │ │ │ -171 bool read_vertices(std::istream& _in, BaseImporter& _bi, Options& _opt, │ │ │ │ -172 std::vector & normals, │ │ │ │ -173 std::vector & colors, │ │ │ │ -174 std::vector & texcoords3d, │ │ │ │ -175 std::vector & texcoords, │ │ │ │ -176 std::vector & vertexHandles, │ │ │ │ -177 Options & fileOptions); │ │ │ │ -178 │ │ │ │ -179 std::string path_; │ │ │ │ -180 │ │ │ │ -181}; │ │ │ │ -182 │ │ │ │ -183 │ │ │ │ -184//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -185 │ │ │ │ +169 │ │ │ │ +170template │ │ │ │ +171void │ │ │ │ +_1_7_2_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +173_s_e_t___t_a_g___r_a_n_g_e( const unsigned int _tag_range) │ │ │ │ +174{ │ │ │ │ +175 if( _tag_range <= tag_range_) │ │ │ │ +176 { │ │ │ │ +177 untag_all(); │ │ │ │ +178 tag_range_ = _tag_range; │ │ │ │ +179 } │ │ │ │ +180 else │ │ │ │ +181 { │ │ │ │ +182 tag_range_ = _tag_range; │ │ │ │ +183 untag_all(); │ │ │ │ +184 } │ │ │ │ +185} │ │ │ │ 186 │ │ │ │ -187extern _OBJReader_ __OBJReaderInstance; │ │ │ │ -188OPENMESHDLLEXPORT _OBJReader_& OBJReader(); │ │ │ │ +187 │ │ │ │ +188//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ 189 │ │ │ │ 190 │ │ │ │ -191// │ │ │ │ -============================================================================= │ │ │ │ -192} // namespace IO │ │ │ │ -193} // namespace OpenMesh │ │ │ │ -194// │ │ │ │ +191template │ │ │ │ +192void │ │ │ │ +193_S_m_a_r_t_T_a_g_g_e_r_T_<_M_e_s_h_,_ _E_H_a_n_d_l_e_,_ _E_P_H_a_n_d_l_e_>_:_: │ │ │ │ +194_a_l_l___t_a_g_s___t_o___z_e_r_o() │ │ │ │ +195{ │ │ │ │ +196 // iterate over property vector │ │ │ │ +197 for(unsigned int i=0; i Vec3f │ │ │ │ -3-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:851 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_R_e_a_d_e_r │ │ │ │ -Base class for reader modules. │ │ │ │ -DDeeffiinniittiioonn BaseReader.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_R_e_a_d_e_r__ │ │ │ │ -Implementation of the OBJ format reader. │ │ │ │ -DDeeffiinniittiioonn OBJReader.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_R_e_a_d_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Returns a string with the accepted file extensions separated by a whitespace │ │ │ │ -and in small caps. │ │ │ │ -DDeeffiinniittiioonn OBJReader.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_R_e_a_d_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Returns a brief description of the file type that can be parsed. │ │ │ │ -DDeeffiinniittiioonn OBJReader.hh:90 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T │ │ │ │ +Smart Tagger. │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT.hh:125 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_g_e_t___t_a_g │ │ │ │ +unsigned int get_tag(const EHandle _eh) const │ │ │ │ +get tag value in range [0..tag_range] │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:141 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_i_s___t_a_g_g_e_d │ │ │ │ +bool is_tagged(const EHandle _eh) const │ │ │ │ +overloaded member for boolean tags │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:161 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_s_e_t___t_a_g │ │ │ │ +void set_tag(const EHandle _eh, unsigned int _tag=1) │ │ │ │ +set tag to a value in [0..tag_range] │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_s_e_t___t_a_g___r_a_n_g_e │ │ │ │ +void set_tag_range(const unsigned int _tag_range) │ │ │ │ +set new tag range and untag_all │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:173 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_u_n_t_a_g___a_l_l │ │ │ │ +void untag_all() │ │ │ │ +untag all elements │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_~_S_m_a_r_t_T_a_g_g_e_r_T │ │ │ │ +~SmartTaggerT() │ │ │ │ +Destructor. │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_T_a_g_g_e_r_T_:_:_S_m_a_r_t_T_a_g_g_e_r_T │ │ │ │ +SmartTaggerT(Mesh &_mesh, unsigned int _tag_range=1) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn SmartTaggerT_impl.hh:59 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00557_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/reader/OFFReader.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Kernel_OSG/VectorAdapter.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OFFReader.hh
│ │ │ +
VectorAdapter.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -138,114 +138,155 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Implements a reader module for OFF files
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51#pragma once
│ │ │ -
52
│ │ │ -
53//=== INCLUDES ================================================================
│ │ │ +
44// ----------------------------------------------------------------------------
│ │ │ +
45
│ │ │ +
46#ifndef OPENMESH_KERNEL_OSG_VECTORADAPTER_HH
│ │ │ +
47#define OPENMESH_KERNEL_OSG_VECTORADAPTER_HH
│ │ │ +
48
│ │ │ +
49
│ │ │ +
50//== INCLUDES =================================================================
│ │ │ +
51
│ │ │ +
52#include <osg/Geometry>
│ │ │ +
53#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │
54
│ │ │ -
55
│ │ │ -
56#include <iosfwd>
│ │ │ -
57#include <string>
│ │ │ -
58#include <cstdio>
│ │ │ -
59
│ │ │ -
60#include <OpenMesh/Core/System/config.h>
│ │ │ -
61#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
62#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ -
63
│ │ │ -
64
│ │ │ -
65//== NAMESPACES ===============================================================
│ │ │ -
66
│ │ │ -
67
│ │ │ -
68namespace OpenMesh {
│ │ │ -
69namespace IO {
│ │ │ -
70
│ │ │ -
71
│ │ │ -
72//== FORWARDS =================================================================
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75class BaseImporter;
│ │ │ -
76
│ │ │ -
77
│ │ │ -
78//== IMPLEMENTATION ===========================================================
│ │ │ +
55//== NAMESPACES ===============================================================
│ │ │ +
56
│ │ │ +
57namespace OpenMesh {
│ │ │ +
58
│ │ │ +
59//== CLASS DEFINITION =========================================================
│ │ │ +
60
│ │ │ +
61// ----------------------------------------------------------------- class ----
│ │ │ +
62
│ │ │ +
63#define OSG_VECTOR_TRAITS( VecType ) \
│ │ │ +
64 template <> struct vector_traits< VecType > { \
│ │ │ +
65 typedef VecType vector_type; \
│ │ │ +
66 typedef vector_type::ValueType value_type; \
│ │ │ +
67 typedef GenProg::Int2Type< vector_type::_iSize > typed_size; \
│ │ │ +
68 \
│ │ │ +
69 static const size_t size_ = vector_type::_iSize; \
│ │ │ +
70 static size_t size() { return size_; } \
│ │ │ +
71 }
│ │ │ +
72
│ │ │ +
74OSG_VECTOR_TRAITS( osg::Pnt4f );
│ │ │ +
76OSG_VECTOR_TRAITS( osg::Pnt3f );
│ │ │ +
78OSG_VECTOR_TRAITS( osg::Pnt2f );
│ │ │
79
│ │ │ -
80
│ │ │ -
│ │ │ -
109class OPENMESHDLLEXPORT _OFFReader_ : public BaseReader
│ │ │ -
110{
│ │ │ -
111public:
│ │ │ -
112
│ │ │ -
113 _OFFReader_();
│ │ │ -
114
│ │ │ -
116 virtual ~_OFFReader_() {};
│ │ │ -
117
│ │ │ -
118 std::string get_description() const override { return "Object File Format"; }
│ │ │ -
119 std::string get_extensions() const override { return "off"; }
│ │ │ -
120 std::string get_magic() const override { return "OFF"; }
│ │ │ -
121
│ │ │ -
122 bool read(const std::string& _filename,
│ │ │ -
123 BaseImporter& _bi,
│ │ │ -
124 Options& _opt) override;
│ │ │ +
81OSG_VECTOR_TRAITS( osg::Vec4f );
│ │ │ +
83OSG_VECTOR_TRAITS( osg::Vec3f );
│ │ │ +
85OSG_VECTOR_TRAITS( osg::Vec2f );
│ │ │ +
86
│ │ │ +
88OSG_VECTOR_TRAITS( osg::Pnt4d );
│ │ │ +
90OSG_VECTOR_TRAITS( osg::Pnt3d );
│ │ │ +
92OSG_VECTOR_TRAITS( osg::Pnt2d );
│ │ │ +
93
│ │ │ +
95OSG_VECTOR_TRAITS( osg::Vec4d );
│ │ │ +
97OSG_VECTOR_TRAITS( osg::Vec3d );
│ │ │ +
98
│ │ │ +
100OSG_VECTOR_TRAITS( osg::Vec4ub );
│ │ │ +
101
│ │ │ +
102
│ │ │ +
103// ----------------------------------------------------------------------------
│ │ │ +
104
│ │ │ +
105
│ │ │ +
106#define OSG_COLOR_TRAITS( VecType, N ) \
│ │ │ +
107 template <> struct vector_traits< VecType > { \
│ │ │ +
108 typedef VecType vector_type; \
│ │ │ +
109 typedef vector_type::ValueType value_type; \
│ │ │ +
110 typedef GenProg::Int2Type< N > typed_size; \
│ │ │ +
111 \
│ │ │ +
112 static const size_t size_ = N; \
│ │ │ +
113 static size_t size() { return size_; } \
│ │ │ +
114 }
│ │ │ +
115
│ │ │ +
116
│ │ │ +
118OSG_COLOR_TRAITS( osg::Color3ub, 3 );
│ │ │ +
120OSG_COLOR_TRAITS( osg::Color4ub, 4 );
│ │ │ +
122OSG_COLOR_TRAITS( osg::Color3f, 3 );
│ │ │ +
124OSG_COLOR_TRAITS( osg::Color4f, 4 );
│ │ │
125
│ │ │ -
126 bool can_u_read(const std::string& _filename) const override;
│ │ │ +
126#undef OSG_VECTOR_TRAITS
│ │ │
127
│ │ │ -
128 bool read(std::istream& _in, BaseImporter& _bi, Options& _opt ) override;
│ │ │ -
129
│ │ │ -
130private:
│ │ │ -
131
│ │ │ -
132 bool can_u_read(std::istream& _is) const;
│ │ │ -
133
│ │ │ -
134 bool read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) const;
│ │ │ -
135 bool read_binary(std::istream& _in, BaseImporter& _bi, Options& _opt, bool swap) const;
│ │ │ -
136
│ │ │ -
137 void readValue(std::istream& _in, float& _value) const;
│ │ │ -
138 void readValue(std::istream& _in, int& _value) const;
│ │ │ -
139 void readValue(std::istream& _in, unsigned int& _value) const;
│ │ │ +
128
│ │ │ +
129// ----------------------------------------
│ │ │ +
130#if 1
│ │ │ +
131#define PNT2VEC_CASTER( DST, SRC ) \
│ │ │ +
132 template <> struct vector_caster< DST, SRC > { \
│ │ │ +
133 typedef DST dst_t; \
│ │ │ +
134 typedef SRC src_t; \
│ │ │ +
135 typedef const dst_t& return_type; \
│ │ │ +
136 inline static return_type cast( const src_t& _src ) {\
│ │ │ +
137 return _src.subZero(); \
│ │ │ +
138 } \
│ │ │ +
139 }
│ │ │
140
│ │ │ -
141 int getColorType(std::string & _line, bool _texCoordsAvailable) const;
│ │ │ -
142
│ │ │ -
143 //available options for reading
│ │ │ -
144 mutable Options options_;
│ │ │ -
145 //options that the user wants to read
│ │ │ -
146 mutable Options userOptions_;
│ │ │ -
147};
│ │ │ -
│ │ │ -
148
│ │ │ +
142PNT2VEC_CASTER( osg::Vec3f, osg::Pnt3f );
│ │ │ +
143
│ │ │ +
145PNT2VEC_CASTER( osg::Vec4f, osg::Pnt4f );
│ │ │ +
146
│ │ │ +
148PNT2VEC_CASTER( osg::Vec3d, osg::Pnt3d );
│ │ │
149
│ │ │ -
150//== TYPE DEFINITION ==========================================================
│ │ │ -
151
│ │ │ +
151PNT2VEC_CASTER( osg::Vec4d, osg::Pnt4d );
│ │ │
152
│ │ │ -
154extern _OFFReader_ __OFFReaderInstance;
│ │ │ -
155OPENMESHDLLEXPORT _OFFReader_& OFFReader();
│ │ │ -
156
│ │ │ -
157
│ │ │ -
158//=============================================================================
│ │ │ -
159} // namespace IO
│ │ │ -
160} // namespace OpenMesh
│ │ │ -
161//=============================================================================
│ │ │ +
153#undef PNT2VEC
│ │ │ +
154#else
│ │ │ +
155
│ │ │ +
156 template <>
│ │ │ +
157 struct vector_caster< osg::Vec3f, osg::Pnt3f >
│ │ │ +
158 {
│ │ │ +
159 typedef osg::Vec3f dst_t;
│ │ │ +
160 typedef osg::Pnt3f src_t;
│ │ │ +
161
│ │ │ +
162 typedef const dst_t& return_type;
│ │ │ +
163 inline static return_type cast( const src_t& _src )
│ │ │ +
164 {
│ │ │ +
165 std::cout << "casting Pnt3f to Vec3f\n";
│ │ │ +
166 return _src.subZero();
│ │ │ +
167 }
│ │ │ +
168 };
│ │ │ +
169
│ │ │ +
170#endif
│ │ │ +
171// ----------------------------------------
│ │ │ +
172
│ │ │ +
174
│ │ │ +
175inline
│ │ │ +
│ │ │ +
176osg::Vec3f::ValueType dot( const osg::Vec3f &_v1, const osg::Vec3f &_v2 )
│ │ │ +
177{ return _v1.dot(_v2); }
│ │ │ +
│ │ │ +
178
│ │ │ +
179
│ │ │ +
180inline
│ │ │ +
181osg::Vec3f::ValueType dot( const osg::Vec3f &_v1, const osg::Pnt3f &_v2 )
│ │ │ +
182{ return _v1.dot(_v2); }
│ │ │ +
183
│ │ │ +
184
│ │ │ +
185inline
│ │ │ +
186osg::Vec2f::ValueType dot( const osg::Vec2f &_v1, const osg::Vec2f &_v2 )
│ │ │ +
187{ return _v1.dot(_v2); }
│ │ │ +
188
│ │ │ +
189
│ │ │ +
190inline
│ │ │ +
191osg::Vec3f cross( const osg::Vec3f &_v1, const osg::Vec3f &_v2 )
│ │ │ +
192{ return _v1.cross(_v2); }
│ │ │ +
194
│ │ │ +
195//=============================================================================
│ │ │ +
196} // namespace OpenMesh
│ │ │ +
197//=============================================================================
│ │ │ +
198#endif // OPENMESH_VECTORADAPTER_HH defined
│ │ │ +
199//=============================================================================
│ │ │ +
200
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
_OFFReader_ __OFFReaderInstance
Declare the single entity of the OFF reader.
Definition OFFReader.cc:88
│ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for reader modules.
Definition BaseReader.hh:87
│ │ │ -
Implementation of the OFF format reader.
Definition OFFReader.hh:110
│ │ │ -
virtual ~_OFFReader_()
Destructor.
Definition OFFReader.hh:116
│ │ │ -
std::string get_description() const override
Returns a brief description of the file type that can be parsed.
Definition OFFReader.hh:118
│ │ │ -
std::string get_extensions() const override
Returns a string with the accepted file extensions separated by a whitespace and in small caps.
Definition OFFReader.hh:119
│ │ │ -
std::string get_magic() const override
Return magic bits used to determine file format.
Definition OFFReader.hh:120
│ │ │ +
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ + │ │ │ +
auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs)
compute scalar product
Definition Vector11T.hh:409
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,16 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OFFReader.hh │ │ │ │ +VectorAdapter.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -47,146 +47,167 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Implements a reader module for OFF files │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51#pragma once │ │ │ │ -52 │ │ │ │ -53//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +44// -------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +45 │ │ │ │ +46#ifndef OPENMESH_KERNEL_OSG_VECTORADAPTER_HH │ │ │ │ +47#define OPENMESH_KERNEL_OSG_VECTORADAPTER_HH │ │ │ │ +48 │ │ │ │ +49 │ │ │ │ +50//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +51 │ │ │ │ +52#include │ │ │ │ +53#include │ │ │ │ 54 │ │ │ │ -55 │ │ │ │ -56#include │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59 │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ -63 │ │ │ │ -64 │ │ │ │ -65//== NAMESPACES │ │ │ │ +55//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -66 │ │ │ │ -67 │ │ │ │ -68namespace _O_p_e_n_M_e_s_h { │ │ │ │ -69namespace IO { │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -72//== FORWARDS │ │ │ │ -================================================================= │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -75class BaseImporter; │ │ │ │ -76 │ │ │ │ -77 │ │ │ │ -78//== IMPLEMENTATION │ │ │ │ -=========================================================== │ │ │ │ +56 │ │ │ │ +57namespace _O_p_e_n_M_e_s_h { │ │ │ │ +58 │ │ │ │ +59//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +60 │ │ │ │ +61// ----------------------------------------------------------------- class -- │ │ │ │ +-- │ │ │ │ +62 │ │ │ │ +63#define OSG_VECTOR_TRAITS( VecType ) \ │ │ │ │ +64 template <> struct vector_traits< VecType > { \ │ │ │ │ +65 typedef VecType vector_type; \ │ │ │ │ +66 typedef vector_type::ValueType value_type; \ │ │ │ │ +67 typedef GenProg::Int2Type< vector_type::_iSize > typed_size; \ │ │ │ │ +68 \ │ │ │ │ +69 static const size_t size_ = vector_type::_iSize; \ │ │ │ │ +70 static size_t size() { return size_; } \ │ │ │ │ +71 } │ │ │ │ +72 │ │ │ │ +_7_4OSG_VECTOR_TRAITS( osg::Pnt4f ); │ │ │ │ +_7_6OSG_VECTOR_TRAITS( osg::Pnt3f ); │ │ │ │ +_7_8OSG_VECTOR_TRAITS( osg::Pnt2f ); │ │ │ │ 79 │ │ │ │ -80 │ │ │ │ -_1_0_9class OPENMESHDLLEXPORT ___O_F_F_R_e_a_d_e_r__ : public _B_a_s_e_R_e_a_d_e_r │ │ │ │ -110{ │ │ │ │ -111public: │ │ │ │ -112 │ │ │ │ -113 ___O_F_F_R_e_a_d_e_r__(); │ │ │ │ -114 │ │ │ │ -_1_1_6 virtual _~___O_F_F_R_e_a_d_e_r__() {}; │ │ │ │ -117 │ │ │ │ -_1_1_8 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "Object File Format"; │ │ │ │ -} │ │ │ │ -_1_1_9 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "off"; } │ │ │ │ -_1_2_0 std::string _g_e_t___m_a_g_i_c() const override { return "OFF"; } │ │ │ │ -121 │ │ │ │ -122 bool read(const std::string& _filename, │ │ │ │ -123 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -124 _O_p_t_i_o_n_s& _opt) override; │ │ │ │ +_8_1OSG_VECTOR_TRAITS( osg::Vec4f ); │ │ │ │ +_8_3OSG_VECTOR_TRAITS( osg::Vec3f ); │ │ │ │ +_8_5OSG_VECTOR_TRAITS( osg::Vec2f ); │ │ │ │ +86 │ │ │ │ +_8_8OSG_VECTOR_TRAITS( osg::Pnt4d ); │ │ │ │ +_9_0OSG_VECTOR_TRAITS( osg::Pnt3d ); │ │ │ │ +_9_2OSG_VECTOR_TRAITS( osg::Pnt2d ); │ │ │ │ +93 │ │ │ │ +_9_5OSG_VECTOR_TRAITS( osg::Vec4d ); │ │ │ │ +_9_7OSG_VECTOR_TRAITS( osg::Vec3d ); │ │ │ │ +98 │ │ │ │ +_1_0_0OSG_VECTOR_TRAITS( osg::Vec4ub ); │ │ │ │ +101 │ │ │ │ +102 │ │ │ │ +103// ------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +104 │ │ │ │ +105 │ │ │ │ +106#define OSG_COLOR_TRAITS( VecType, N ) \ │ │ │ │ +107 template <> struct vector_traits< VecType > { \ │ │ │ │ +108 typedef VecType vector_type; \ │ │ │ │ +109 typedef vector_type::ValueType value_type; \ │ │ │ │ +110 typedef GenProg::Int2Type< N > typed_size; \ │ │ │ │ +111 \ │ │ │ │ +112 static const size_t size_ = N; \ │ │ │ │ +113 static size_t size() { return size_; } \ │ │ │ │ +114 } │ │ │ │ +115 │ │ │ │ +116 │ │ │ │ +_1_1_8OSG_COLOR_TRAITS( osg::Color3ub, 3 ); │ │ │ │ +_1_2_0OSG_COLOR_TRAITS( osg::Color4ub, 4 ); │ │ │ │ +_1_2_2OSG_COLOR_TRAITS( osg::Color3f, 3 ); │ │ │ │ +_1_2_4OSG_COLOR_TRAITS( osg::Color4f, 4 ); │ │ │ │ 125 │ │ │ │ -126 bool can_u_read(const std::string& _filename) const override; │ │ │ │ +126#undef OSG_VECTOR_TRAITS │ │ │ │ 127 │ │ │ │ -128 bool read(std::istream& _in, _B_a_s_e_I_m_p_o_r_t_e_r& _bi, _O_p_t_i_o_n_s& _opt ) override; │ │ │ │ -129 │ │ │ │ -130private: │ │ │ │ -131 │ │ │ │ -132 bool can_u_read(std::istream& _is) const; │ │ │ │ -133 │ │ │ │ -134 bool read_ascii(std::istream& _in, _B_a_s_e_I_m_p_o_r_t_e_r& _bi, _O_p_t_i_o_n_s& _opt) const; │ │ │ │ -135 bool read_binary(std::istream& _in, _B_a_s_e_I_m_p_o_r_t_e_r& _bi, _O_p_t_i_o_n_s& _opt, bool │ │ │ │ -swap) const; │ │ │ │ -136 │ │ │ │ -137 void readValue(std::istream& _in, float& _value) const; │ │ │ │ -138 void readValue(std::istream& _in, int& _value) const; │ │ │ │ -139 void readValue(std::istream& _in, unsigned int& _value) const; │ │ │ │ +128 │ │ │ │ +129// ---------------------------------------- │ │ │ │ +130#if 1 │ │ │ │ +131#define PNT2VEC_CASTER( DST, SRC ) \ │ │ │ │ +132 template <> struct vector_caster< DST, SRC > { \ │ │ │ │ +133 typedef DST dst_t; \ │ │ │ │ +134 typedef SRC src_t; \ │ │ │ │ +135 typedef const dst_t& return_type; \ │ │ │ │ +136 inline static return_type cast( const src_t& _src ) {\ │ │ │ │ +137 return _src.subZero(); \ │ │ │ │ +138 } \ │ │ │ │ +139 } │ │ │ │ 140 │ │ │ │ -141 int getColorType(std::string & _line, bool _texCoordsAvailable) const; │ │ │ │ -142 │ │ │ │ -143 //available options for reading │ │ │ │ -144 mutable _O_p_t_i_o_n_s options_; │ │ │ │ -145 //options that the user wants to read │ │ │ │ -146 mutable _O_p_t_i_o_n_s userOptions_; │ │ │ │ -147}; │ │ │ │ -148 │ │ │ │ +_1_4_2PNT2VEC_CASTER( osg::Vec3f, osg::Pnt3f ); │ │ │ │ +143 │ │ │ │ +_1_4_5PNT2VEC_CASTER( osg::Vec4f, osg::Pnt4f ); │ │ │ │ +146 │ │ │ │ +_1_4_8PNT2VEC_CASTER( osg::Vec3d, osg::Pnt3d ); │ │ │ │ 149 │ │ │ │ -150//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -151 │ │ │ │ +_1_5_1PNT2VEC_CASTER( osg::Vec4d, osg::Pnt4d ); │ │ │ │ 152 │ │ │ │ -154extern _OFFReader_ _____O_F_F_R_e_a_d_e_r_I_n_s_t_a_n_c_e; │ │ │ │ -155OPENMESHDLLEXPORT _OFFReader_& OFFReader(); │ │ │ │ -156 │ │ │ │ -157 │ │ │ │ -158// │ │ │ │ +153#undef PNT2VEC │ │ │ │ +154#else │ │ │ │ +155 │ │ │ │ +156 template <> │ │ │ │ +157 struct vector_caster< osg::_V_e_c_3_f, osg::Pnt3f > │ │ │ │ +158 { │ │ │ │ +159 typedef osg::Vec3f dst_t; │ │ │ │ +160 typedef osg::Pnt3f src_t; │ │ │ │ +161 │ │ │ │ +162 typedef const dst_t& return_type; │ │ │ │ +163 inline static return_type cast( const src_t& _src ) │ │ │ │ +164 { │ │ │ │ +165 std::cout << "casting Pnt3f to Vec3f\n"; │ │ │ │ +166 return _src.subZero(); │ │ │ │ +167 } │ │ │ │ +168 }; │ │ │ │ +169 │ │ │ │ +170#endif │ │ │ │ +171// ---------------------------------------- │ │ │ │ +172 │ │ │ │ +174 │ │ │ │ +175inline │ │ │ │ +_1_7_6osg::Vec3f::ValueType _d_o_t( const osg::Vec3f &_v1, const osg::Vec3f &_v2 ) │ │ │ │ +177{ return _v1._d_o_t(_v2); } │ │ │ │ +178 │ │ │ │ +179 │ │ │ │ +180inline │ │ │ │ +181osg::Vec3f::ValueType _d_o_t( const osg::Vec3f &_v1, const osg::Pnt3f &_v2 ) │ │ │ │ +182{ return _v1.dot(_v2); } │ │ │ │ +183 │ │ │ │ +184 │ │ │ │ +185inline │ │ │ │ +186osg::Vec2f::ValueType _d_o_t( const osg::Vec2f &_v1, const osg::Vec2f &_v2 ) │ │ │ │ +187{ return _v1.dot(_v2); } │ │ │ │ +188 │ │ │ │ +189 │ │ │ │ +190inline │ │ │ │ +191osg::Vec3f cross( const osg::Vec3f &_v1, const osg::Vec3f &_v2 ) │ │ │ │ +192{ return _v1.cross(_v2); } │ │ │ │ +194 │ │ │ │ +195// │ │ │ │ +============================================================================= │ │ │ │ +196} // namespace OpenMesh │ │ │ │ +197// │ │ │ │ ============================================================================= │ │ │ │ -159} // namespace IO │ │ │ │ -160} // namespace OpenMesh │ │ │ │ -161// │ │ │ │ +198#endif // OPENMESH_VECTORADAPTER_HH defined │ │ │ │ +199// │ │ │ │ ============================================================================= │ │ │ │ +200 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_____O_F_F_R_e_a_d_e_r_I_n_s_t_a_n_c_e │ │ │ │ -_OFFReader_ __OFFReaderInstance │ │ │ │ -Declare the single entity of the OFF reader. │ │ │ │ -DDeeffiinniittiioonn OFFReader.cc:88 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_R_e_a_d_e_r │ │ │ │ -Base class for reader modules. │ │ │ │ -DDeeffiinniittiioonn BaseReader.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_F_F_R_e_a_d_e_r__ │ │ │ │ -Implementation of the OFF format reader. │ │ │ │ -DDeeffiinniittiioonn OFFReader.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_F_F_R_e_a_d_e_r___:_:_~___O_F_F_R_e_a_d_e_r__ │ │ │ │ -virtual ~_OFFReader_() │ │ │ │ -Destructor. │ │ │ │ -DDeeffiinniittiioonn OFFReader.hh:116 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_F_F_R_e_a_d_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Returns a brief description of the file type that can be parsed. │ │ │ │ -DDeeffiinniittiioonn OFFReader.hh:118 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_F_F_R_e_a_d_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Returns a string with the accepted file extensions separated by a whitespace │ │ │ │ -and in small caps. │ │ │ │ -DDeeffiinniittiioonn OFFReader.hh:119 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_F_F_R_e_a_d_e_r___:_:_g_e_t___m_a_g_i_c │ │ │ │ -std::string get_magic() const override │ │ │ │ -Return magic bits used to determine file format. │ │ │ │ -DDeeffiinniittiioonn OFFReader.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ +osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ +Adapter for osg vector member computing a scalar product. │ │ │ │ +DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_o_t │ │ │ │ +auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs) │ │ │ │ +compute scalar product │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:409 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00560_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/reader/PLYReader.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Kernel_OSG/bindT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
PLYReader.hh
│ │ │ +
bindT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -139,231 +139,272 @@ │ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Implements a reader module for OFF files
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#ifndef __PLYREADER_HH__
│ │ │ -
53#define __PLYREADER_HH__
│ │ │ -
54
│ │ │ -
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ -
57
│ │ │ +
53//=============================================================================
│ │ │ +
54//
│ │ │ +
55// CLASS Traits
│ │ │ +
56//
│ │ │ +
57//=============================================================================
│ │ │
58
│ │ │ -
59
│ │ │ -
60#include <iosfwd>
│ │ │ -
61#include <string>
│ │ │ -
62#include <cstdio>
│ │ │ -
63#include <vector>
│ │ │ -
64#include <list>
│ │ │ +
59#ifndef OPENMESH_KERNEL_OSG_BINDT_HH
│ │ │ +
60#define OPENMESH_KERNEL_OSG_BINDT_HH
│ │ │ +
61
│ │ │ +
62
│ │ │ +
63//== INCLUDES =================================================================
│ │ │ +
64
│ │ │
65
│ │ │ -
66#include <OpenMesh/Core/System/config.h>
│ │ │ -
67#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
68#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ -
69#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
70
│ │ │ -
71
│ │ │ -
72//== NAMESPACES ===============================================================
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75namespace OpenMesh {
│ │ │ -
76namespace IO {
│ │ │ +
66#include <functional>
│ │ │ +
67#include <algorithm>
│ │ │ +
68//
│ │ │ +
69#include <OpenMesh/Core/Mesh/TriMeshT.hh>
│ │ │ +
70#include <OpenMesh/Core/Utils/color_cast.hh>
│ │ │ +
71#include <OpenMesh/Tools/Utils/GLConstAsString.hh>
│ │ │ +
72#include <OpenSG/OSGGeometry.h>
│ │ │ +
73//
│ │ │ +
74#include "color_cast.hh"
│ │ │ +
75
│ │ │ +
76//== NAMESPACES ===============================================================
│ │ │
77
│ │ │ -
78
│ │ │ -
79//== FORWARDS =================================================================
│ │ │ +
78namespace OpenMesh {
│ │ │ +
79namespace Kernel_OSG {
│ │ │
80
│ │ │
81
│ │ │ -
82class BaseImporter;
│ │ │ +
82//== CLASS DEFINITION =========================================================
│ │ │
83
│ │ │ -
84
│ │ │ -
85//== IMPLEMENTATION ===========================================================
│ │ │ -
86
│ │ │ -
87
│ │ │ -
│ │ │ -
95class OPENMESHDLLEXPORT _PLYReader_ : public BaseReader
│ │ │ -
96{
│ │ │ -
97public:
│ │ │ -
98
│ │ │ - │ │ │ -
100
│ │ │ -
101 std::string get_description() const override { return "PLY polygon file format"; }
│ │ │ -
102 std::string get_extensions() const override { return "ply"; }
│ │ │ -
103 std::string get_magic() const override { return "PLY"; }
│ │ │ -
104
│ │ │ -
105 bool read(const std::string& _filename,
│ │ │ -
106 BaseImporter& _bi,
│ │ │ -
107 Options& _opt) override;
│ │ │ -
108
│ │ │ -
109 bool read(std::istream& _is,
│ │ │ -
110 BaseImporter& _bi,
│ │ │ -
111 Options& _opt) override;
│ │ │ -
112
│ │ │ -
113 bool can_u_read(const std::string& _filename) const override;
│ │ │ -
114
│ │ │ -
115 enum ValueType {
│ │ │ -
116 Unsupported,
│ │ │ -
117 ValueTypeINT8, ValueTypeCHAR,
│ │ │ -
118 ValueTypeUINT8, ValueTypeUCHAR,
│ │ │ -
119 ValueTypeINT16, ValueTypeSHORT,
│ │ │ -
120 ValueTypeUINT16, ValueTypeUSHORT,
│ │ │ -
121 ValueTypeINT32, ValueTypeINT,
│ │ │ -
122 ValueTypeUINT32, ValueTypeUINT,
│ │ │ -
123 ValueTypeFLOAT32, ValueTypeFLOAT,
│ │ │ -
124 ValueTypeFLOAT64, ValueTypeDOUBLE
│ │ │ -
125 };
│ │ │ +
84inline
│ │ │ +
85bool type_is_valid( unsigned char _t )
│ │ │ +
86{
│ │ │ +
87 return _t == GL_TRIANGLES
│ │ │ +
88 || _t == GL_TRIANGLE_STRIP
│ │ │ +
89 || _t == GL_QUADS
│ │ │ +
90 || _t == GL_POLYGON;
│ │ │ +
91}
│ │ │ +
92
│ │ │ +
93
│ │ │ +
100template < typename Mesh > inline
│ │ │ +
│ │ │ +
101bool bind( osg::GeometryPtr& _geo, Mesh& _mesh )
│ │ │ +
102{
│ │ │ +
103 _geo = _mesh.createGeometryPtr();
│ │ │ +
104}
│ │ │ +
│ │ │ +
105
│ │ │ +
114template < typename Mesh > inline
│ │ │ +
│ │ │ +
115bool bind( Mesh& _mesh, osg::GeometryPtr& _geo )
│ │ │ +
116{
│ │ │ +
117 using namespace OpenMesh;
│ │ │ +
118 using namespace osg;
│ │ │ +
119 using namespace std;
│ │ │ +
120
│ │ │ +
121 bool ok = true;
│ │ │ +
122
│ │ │ +
123 // pre-check if types are supported
│ │ │ +
124
│ │ │ +
125 GeoPTypesPtr types = _geo->getTypes();
│ │ │
126
│ │ │ -
127private:
│ │ │ -
128
│ │ │ -
129 bool can_u_read(std::istream& _is) const;
│ │ │ +
127 if ( (size_t)count_if( types->getData(), types->getData()+types->size(),
│ │ │ +
128 ptr_fun(type_is_valid) ) != (size_t)types->size() )
│ │ │ +
129 return false;
│ │ │
130
│ │ │ -
131 bool read_ascii(std::istream& _in, BaseImporter& _bi, const Options& _opt) const;
│ │ │ -
132 bool read_binary(std::istream& _in, BaseImporter& _bi, bool swap, const Options& _opt) const;
│ │ │ -
133
│ │ │ -
134 void readValue(ValueType _type , std::istream& _in, float& _value) const;
│ │ │ -
135 void readValue(ValueType _type , std::istream& _in, double& _value) const;
│ │ │ -
136 void readValue(ValueType _type , std::istream& _in, unsigned int& _value) const;
│ │ │ -
137 void readValue(ValueType _type , std::istream& _in, unsigned short& _value) const;
│ │ │ -
138 void readValue(ValueType _type , std::istream& _in, unsigned char& _value) const;
│ │ │ -
139 void readValue(ValueType _type , std::istream& _in, int& _value) const;
│ │ │ -
140 void readValue(ValueType _type , std::istream& _in, short& _value) const;
│ │ │ -
141 void readValue(ValueType _type , std::istream& _in, signed char& _value) const;
│ │ │ -
142
│ │ │ -
143 template<typename T>
│ │ │ -
144 void readInteger(ValueType _type, std::istream& _in, T& _value) const;
│ │ │ -
145
│ │ │ -
147 void consume_input(std::istream& _in, int _count) const {
│ │ │ -
148
│ │ │ -
149 // Make sure, we do not run over our buffer size
│ │ │ -
150 int loops = _count / 8 ;
│ │ │ -
151
│ │ │ -
152 // Read only our buffer size batches
│ │ │ -
153 for ( auto i = 0 ; i < loops; ++i) {
│ │ │ -
154 _in.read(reinterpret_cast<char*>(&buff[0]), 8);
│ │ │ -
155 }
│ │ │ -
156
│ │ │ -
157 // Read reminder which is smaller than our buffer size
│ │ │ -
158 _in.read(reinterpret_cast<char*>(&buff[0]), _count - 8 * loops );
│ │ │ -
159 }
│ │ │ -
160
│ │ │ -
161 mutable unsigned char buff[8];
│ │ │ +
131 // pre-check if it is a multi-indexed geometry, which is not supported!
│ │ │ +
132
│ │ │ +
133 if ( _geo->getIndexMapping().getSize() > 1 )
│ │ │ +
134 {
│ │ │ +
135 omerr << "OpenMesh::Kernel_OSG::bind(): Multi-indexed geometry is not supported!\n";
│ │ │ +
136 return false;
│ │ │ +
137 }
│ │ │ +
138
│ │ │ +
139
│ │ │ +
140 // create shortcuts
│ │ │ +
141
│ │ │ +
142 GeoPLengthsPtr lengths = _geo->getLengths();
│ │ │ +
143 GeoIndicesPtr indices = _geo->getIndices();
│ │ │ +
144 GeoPositionsPtr pos = _geo->getPositions();
│ │ │ +
145 GeoNormalsPtr normals = _geo->getNormals();
│ │ │ +
146 GeoColorsPtr colors = _geo->getColors();
│ │ │ +
147
│ │ │ +
148
│ │ │ +
149 // -------------------- now convert everything to polygon/triangles
│ │ │ +
150
│ │ │ +
151 size_t tidx, bidx; // types; base index into indices
│ │ │ +
152 vector< VertexHandle > vhandles;
│ │ │ +
153
│ │ │ +
154 // ---------- initialize geometry
│ │ │ +
155
│ │ │ +
156 {
│ │ │ +
157 VertexHandle vh;
│ │ │ +
158 typedef typename Mesh::Color color_t;
│ │ │ +
159
│ │ │ +
160 bool bind_normal = (normals!=NullFC) && _mesh.has_vertex_normals();
│ │ │ +
161 bool bind_color = (colors !=NullFC) && _mesh.has_vertex_colors();
│ │ │
162
│ │ │ -
164 mutable Options options_;
│ │ │ -
165
│ │ │ -
167 mutable Options userOptions_;
│ │ │ -
168
│ │ │ -
169 mutable unsigned int vertexCount_;
│ │ │ -
170 mutable unsigned int faceCount_;
│ │ │ -
171
│ │ │ -
172 mutable uint vertexDimension_;
│ │ │ -
173
│ │ │ -
174 enum Property {
│ │ │ -
175 XCOORD,YCOORD,ZCOORD,
│ │ │ -
176 TEXX,TEXY,
│ │ │ -
177 COLORRED,COLORGREEN,COLORBLUE,COLORALPHA,
│ │ │ -
178 XNORM,YNORM,ZNORM, CUSTOM_PROP, VERTEX_INDICES,
│ │ │ -
179 TEXCOORD, TEXNUMBER, UNSUPPORTED
│ │ │ -
180 };
│ │ │ -
181
│ │ │ -
183 mutable std::map<ValueType, int> scalar_size_;
│ │ │ -
184
│ │ │ -
185 // Number of vertex properties
│ │ │ -
186 struct PropertyInfo
│ │ │ -
187 {
│ │ │ -
188 Property property;
│ │ │ -
189 ValueType value;
│ │ │ -
190 std::string name;//for custom properties
│ │ │ -
191 ValueType listIndexType;//if type is unsupported, the poerty is not a list. otherwise, it the index type
│ │ │ -
192 PropertyInfo():property(UNSUPPORTED),value(Unsupported),name(""),listIndexType(Unsupported){}
│ │ │ -
193 PropertyInfo(Property _p, ValueType _v):property(_p),value(_v),name(""),listIndexType(Unsupported){}
│ │ │ -
194 PropertyInfo(Property _p, ValueType _v, const std::string& _n):property(_p),value(_v),name(_n),listIndexType(Unsupported){}
│ │ │ -
195 };
│ │ │ -
196
│ │ │ -
197 enum Element {
│ │ │ -
198 VERTEX,
│ │ │ -
199 FACE,
│ │ │ -
200 UNKNOWN
│ │ │ -
201 };
│ │ │ -
202
│ │ │ -
203 // Information on the elements
│ │ │ -
204 struct ElementInfo
│ │ │ -
205 {
│ │ │ -
206 Element element_;
│ │ │ -
207 std::string name_;
│ │ │ -
208 unsigned int count_;
│ │ │ -
209 std::vector< PropertyInfo > properties_;
│ │ │ -
210 };
│ │ │ -
211
│ │ │ -
212 mutable std::vector< ElementInfo > elements_;
│ │ │ -
213
│ │ │ -
214 mutable std::vector< std::string > texture_files_;
│ │ │ -
215
│ │ │ -
216 template<typename T>
│ │ │ -
217 inline void read(_PLYReader_::ValueType _type, std::istream& _in, T& _value, OpenMesh::GenProg::TrueType /*_binary*/) const
│ │ │ -
218 {
│ │ │ -
219 readValue(_type, _in, _value);
│ │ │ -
220 }
│ │ │ -
221
│ │ │ -
222 template<typename T>
│ │ │ -
223 inline void read(_PLYReader_::ValueType _type, std::istream& _in, T& _value, OpenMesh::GenProg::FalseType /*_binary*/) const
│ │ │ -
224 {
│ │ │ -
225 _in >> _value;
│ │ │ -
226 }
│ │ │ -
227
│ │ │ -
228 template<typename T>
│ │ │ -
229 inline void readInteger(_PLYReader_::ValueType _type, std::istream& _in, T& _value, OpenMesh::GenProg::TrueType /*_binary*/) const
│ │ │ -
230 {
│ │ │ -
231 readInteger(_type, _in, _value);
│ │ │ -
232 }
│ │ │ -
233
│ │ │ -
234 template<typename T>
│ │ │ -
235 inline void readInteger(_PLYReader_::ValueType _type, std::istream& _in, T& _value, OpenMesh::GenProg::FalseType /*_binary*/) const
│ │ │ -
236 {
│ │ │ -
237 _in >> _value;
│ │ │ -
238 }
│ │ │ -
239
│ │ │ -
240 //read and assign custom properties with the given type. Also creates property, if not exist
│ │ │ -
241 template<bool binary, typename T, typename Handle>
│ │ │ -
242 void readCreateCustomProperty(std::istream& _in, BaseImporter& _bi, Handle _h, const std::string& _propName, const ValueType _valueType, const ValueType _listType) const;
│ │ │ -
243
│ │ │ -
244 template<bool binary, typename Handle>
│ │ │ -
245 void readCustomProperty(std::istream& _in, BaseImporter& _bi, Handle _h, const std::string& _propName, const _PLYReader_::ValueType _valueType, const _PLYReader_::ValueType _listIndexType) const;
│ │ │ -
246};
│ │ │ +
163 for (bidx=0; bidx < pos->size(); ++bidx)
│ │ │ +
164 {
│ │ │ +
165 vh = _mesh.add_vertex( pos->getValue(bidx) );
│ │ │ +
166 if ( bind_normal )
│ │ │ +
167 _mesh.set_normal(vh, normals->getValue(bidx));
│ │ │ +
168 if ( bind_color )
│ │ │ +
169 _mesh.set_color(vh, color_cast<color_t>(colors->getValue(bidx)));
│ │ │ +
170 }
│ │ │ +
171 }
│ │ │ +
172
│ │ │ +
173 // ---------- create topology
│ │ │ +
174
│ │ │ +
175 FaceHandle fh;
│ │ │ +
176
│ │ │ +
177 size_t max_bidx = indices != NullFC ? indices->size() : pos->size();
│ │ │ +
178
│ │ │ +
179 for (bidx=tidx=0; ok && tidx<types->size() && bidx < max_bidx; ++tidx)
│ │ │ +
180 {
│ │ │ +
181 switch( types->getValue(tidx) )
│ │ │ +
182 {
│ │ │ +
183 case GL_TRIANGLES:
│ │ │ +
184 vhandles.resize(3);
│ │ │ +
185 for(size_t lidx=0; lidx < lengths->getValue(tidx)-2; lidx+=3)
│ │ │ +
186 {
│ │ │ +
187 if (indices == NullFC ) {
│ │ │ +
188 vhandles[0] = VertexHandle(bidx+lidx);
│ │ │ +
189 vhandles[1] = VertexHandle(bidx+lidx+1);
│ │ │ +
190 vhandles[2] = VertexHandle(bidx+lidx+2);
│ │ │ +
191 }
│ │ │ +
192 else {
│ │ │ +
193 vhandles[0] = VertexHandle(indices->getValue(bidx+lidx ) );
│ │ │ +
194 vhandles[1] = VertexHandle(indices->getValue(bidx+lidx+1) );
│ │ │ +
195 vhandles[2] = VertexHandle(indices->getValue(bidx+lidx+2) );
│ │ │ +
196 }
│ │ │ +
197
│ │ │ +
198 if ( !(fh = _mesh.add_face( vhandles )).is_valid() )
│ │ │ +
199 {
│ │ │ +
200 // if fh is complex try swapped order
│ │ │ +
201 swap(vhandles[2], vhandles[1]);
│ │ │ +
202 fh = _mesh.add_face( vhandles );
│ │ │ +
203 }
│ │ │ +
204 ok = fh.is_valid();
│ │ │ +
205 }
│ │ │ +
206 break;
│ │ │ +
207
│ │ │ +
208 case GL_TRIANGLE_STRIP:
│ │ │ +
209 vhandles.resize(3);
│ │ │ +
210 for (size_t lidx=0; lidx < lengths->getValue(tidx)-2; ++lidx)
│ │ │ +
211 {
│ │ │ +
212 if (indices == NullFC ) {
│ │ │ +
213 vhandles[0] = VertexHandle(bidx+lidx);
│ │ │ +
214 vhandles[1] = VertexHandle(bidx+lidx+1);
│ │ │ +
215 vhandles[2] = VertexHandle(bidx+lidx+2);
│ │ │ +
216 }
│ │ │ +
217 else {
│ │ │ +
218 vhandles[0] = VertexHandle(indices->getValue(bidx+lidx ) );
│ │ │ +
219 vhandles[1] = VertexHandle(indices->getValue(bidx+lidx+1) );
│ │ │ +
220 vhandles[2] = VertexHandle(indices->getValue(bidx+lidx+2) );
│ │ │ +
221 }
│ │ │ +
222
│ │ │ +
223 if (vhandles[0]!=vhandles[2] &&
│ │ │ +
224 vhandles[0]!=vhandles[1] &&
│ │ │ +
225 vhandles[1]!=vhandles[2])
│ │ │ +
226 {
│ │ │ +
227 // if fh is complex try swapped order
│ │ │ +
228 bool swapped(false);
│ │ │ +
229
│ │ │ +
230 if (lidx % 2) // odd numbered triplet must be reordered
│ │ │ +
231 swap(vhandles[2], vhandles[1]);
│ │ │ +
232
│ │ │ +
233 if ( !(fh = _mesh.add_face( vhandles )).is_valid() )
│ │ │ +
234 {
│ │ │ +
235 omlog << "OpenMesh::Kernel_OSG::bind(): complex entity!\n";
│ │ │ +
236
│ │ │ +
237 swap(vhandles[2], vhandles[1]);
│ │ │ +
238 fh = _mesh.add_face( vhandles );
│ │ │ +
239 swapped = true;
│ │ │ +
240 }
│ │ │ +
241 ok = fh.is_valid();
│ │ │ +
242 }
│ │ │ +
243 }
│ │ │ +
244 break;
│ │ │ +
245
│ │ │ +
246 case GL_QUADS:
│ │ │ +
247 vhandles.resize(4);
│ │ │ +
248 for(size_t nf=_mesh.n_faces(), lidx=0;
│ │ │ +
249 lidx < lengths->getValue(tidx)-3; lidx+=4)
│ │ │ +
250 {
│ │ │ +
251 if (indices == NullFC ) {
│ │ │ +
252 vhandles[0] = VertexHandle(bidx+lidx);
│ │ │ +
253 vhandles[1] = VertexHandle(bidx+lidx+1);
│ │ │ +
254 vhandles[2] = VertexHandle(bidx+lidx+2);
│ │ │ +
255 vhandles[3] = VertexHandle(bidx+lidx+3);
│ │ │ +
256 }
│ │ │ +
257 else {
│ │ │ +
258 vhandles[0] = VertexHandle(indices->getValue(bidx+lidx ) );
│ │ │ +
259 vhandles[1] = VertexHandle(indices->getValue(bidx+lidx+1) );
│ │ │ +
260 vhandles[2] = VertexHandle(indices->getValue(bidx+lidx+2) );
│ │ │ +
261 vhandles[3] = VertexHandle(indices->getValue(bidx+lidx+3) );
│ │ │ +
262 }
│ │ │ +
263
│ │ │ +
264 fh = _mesh.add_face( vhandles );
│ │ │ +
265 ok = ( Mesh::Face::is_triangle() && (_mesh.n_faces()==(nf+2)))
│ │ │ +
266 || fh.is_valid();
│ │ │ +
267 nf = _mesh.n_faces();
│ │ │ +
268 }
│ │ │ +
269 break;
│ │ │ +
270
│ │ │ +
271 case GL_POLYGON:
│ │ │ +
272 {
│ │ │ +
273 size_t ne = lengths->getValue(tidx);
│ │ │ +
274 size_t nf = _mesh.n_faces();
│ │ │ +
275
│ │ │ +
276 vhandles.resize(ne);
│ │ │ +
277
│ │ │ +
278 for(size_t lidx=0; lidx < ne; ++lidx)
│ │ │ +
279 vhandles[lidx] = (indices == NullFC)
│ │ │ +
280 ? VertexHandle(bidx+lidx)
│ │ │ +
281 : VertexHandle(indices->getValue(bidx+lidx) );
│ │ │ +
282
│ │ │ +
283 fh = _mesh.add_face( vhandles );
│ │ │ +
284 ok = ( Mesh::Face::is_triangle() && (_mesh.n_faces()==nf+ne-2) )
│ │ │ +
285 || fh.is_valid();
│ │ │ +
286
│ │ │ +
287 break;
│ │ │ +
288 }
│ │ │ +
289 default:
│ │ │ +
290 cerr << "Warning! Skipping unsupported type "
│ │ │ +
291 << types->getValue(tidx) << " '"
│ │ │ +
292 << Utils::GLenum_as_string( types->getValue(tidx) ) << "'\n";
│ │ │ +
293 }
│ │ │ +
294
│ │ │ +
295 // update base index into indices for next face type
│ │ │ +
296 bidx += lengths->getValue(tidx);
│ │ │ +
297 }
│ │ │ +
298
│ │ │ +
299 if (ok)
│ │ │ +
300 ok=_mesh.bind(_geo);
│ │ │ +
301 else
│ │ │ +
302 _mesh.clear();
│ │ │ +
303
│ │ │ +
304 return ok;
│ │ │ +
305}
│ │ │
│ │ │ -
247
│ │ │ -
248
│ │ │ -
249//== TYPE DEFINITION ==========================================================
│ │ │ -
250
│ │ │ -
251
│ │ │ -
253extern _PLYReader_ __PLYReaderInstance;
│ │ │ -
254OPENMESHDLLEXPORT _PLYReader_& PLYReader();
│ │ │ -
255
│ │ │ -
256
│ │ │ -
257//=============================================================================
│ │ │ -
258} // namespace IO
│ │ │ -
259} // namespace OpenMesh
│ │ │ -
260//=============================================================================
│ │ │ -
261#endif
│ │ │ -
262//=============================================================================
│ │ │ +
306
│ │ │ +
307
│ │ │ +
308//=============================================================================
│ │ │ +
309} // namespace Kernel_OSG
│ │ │ +
310} // namespace OpenMesh
│ │ │ +
311//=============================================================================
│ │ │ +
312#endif // OPENMESH_KERNEL_OSG_BINDT_HH defined
│ │ │ +
313//=============================================================================
│ │ │ +
314
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
_PLYReader_ __PLYReaderInstance
Declare the single entity of the PLY reader.
Definition PLYReader.cc:73
│ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for reader modules.
Definition BaseReader.hh:87
│ │ │ -
Implementation of the PLY format reader.
Definition PLYReader.hh:96
│ │ │ -
std::string get_description() const override
Returns a brief description of the file type that can be parsed.
Definition PLYReader.hh:101
│ │ │ -
std::string get_magic() const override
Return magic bits used to determine file format.
Definition PLYReader.hh:103
│ │ │ -
std::string get_extensions() const override
Returns a string with the accepted file extensions separated by a whitespace and in small caps.
Definition PLYReader.hh:102
│ │ │ +
bool bind(osg::GeometryPtr &_geo, Mesh &_mesh)
Bind a OpenSG geometry to a mesh.
Definition bindT.hh:101
│ │ │ +
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,17 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -PLYReader.hh │ │ │ │ +bindT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -48,279 +49,289 @@ │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ -45// │ │ │ │ +53// │ │ │ │ ============================================================================= │ │ │ │ -46// │ │ │ │ -47// Implements a reader module for OFF files │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ +54// │ │ │ │ +55// CLASS Traits │ │ │ │ +56// │ │ │ │ +57// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef __PLYREADER_HH__ │ │ │ │ -53#define __PLYREADER_HH__ │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ -57 │ │ │ │ 58 │ │ │ │ -59 │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ +59#ifndef OPENMESH_KERNEL_OSG_BINDT_HH │ │ │ │ +60#define OPENMESH_KERNEL_OSG_BINDT_HH │ │ │ │ +61 │ │ │ │ +62 │ │ │ │ +63//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +64 │ │ │ │ 65 │ │ │ │ -66#include │ │ │ │ -67#include │ │ │ │ -68#include │ │ │ │ -69#include │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -72//== NAMESPACES │ │ │ │ +66#include │ │ │ │ +67#include │ │ │ │ +68// │ │ │ │ +69#include │ │ │ │ +70#include │ │ │ │ +71#include │ │ │ │ +72#include │ │ │ │ +73// │ │ │ │ +74#include "color_cast.hh" │ │ │ │ +75 │ │ │ │ +76//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -75namespace _O_p_e_n_M_e_s_h { │ │ │ │ -76namespace IO { │ │ │ │ 77 │ │ │ │ -78 │ │ │ │ -79//== FORWARDS │ │ │ │ -================================================================= │ │ │ │ +78namespace _O_p_e_n_M_e_s_h { │ │ │ │ +79namespace Kernel_OSG { │ │ │ │ 80 │ │ │ │ 81 │ │ │ │ -82class BaseImporter; │ │ │ │ +82//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ 83 │ │ │ │ -84 │ │ │ │ -85//== IMPLEMENTATION │ │ │ │ -=========================================================== │ │ │ │ -86 │ │ │ │ -87 │ │ │ │ -_9_5class OPENMESHDLLEXPORT ___P_L_Y_R_e_a_d_e_r__ : public _B_a_s_e_R_e_a_d_e_r │ │ │ │ -96{ │ │ │ │ -97public: │ │ │ │ -98 │ │ │ │ -99 ___P_L_Y_R_e_a_d_e_r__(); │ │ │ │ -100 │ │ │ │ -_1_0_1 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "PLY polygon file │ │ │ │ -format"; } │ │ │ │ -_1_0_2 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "ply"; } │ │ │ │ -_1_0_3 std::string _g_e_t___m_a_g_i_c() const override { return "PLY"; } │ │ │ │ -104 │ │ │ │ -105 bool read(const std::string& _filename, │ │ │ │ -106 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -107 _O_p_t_i_o_n_s& _opt) override; │ │ │ │ -108 │ │ │ │ -109 bool read(std::istream& _is, │ │ │ │ -110 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -111 _O_p_t_i_o_n_s& _opt) override; │ │ │ │ -112 │ │ │ │ -113 bool can_u_read(const std::string& _filename) const override; │ │ │ │ -114 │ │ │ │ -115 enum ValueType { │ │ │ │ -116 Unsupported, │ │ │ │ -117 ValueTypeINT8, ValueTypeCHAR, │ │ │ │ -118 ValueTypeUINT8, ValueTypeUCHAR, │ │ │ │ -119 ValueTypeINT16, ValueTypeSHORT, │ │ │ │ -120 ValueTypeUINT16, ValueTypeUSHORT, │ │ │ │ -121 ValueTypeINT32, ValueTypeINT, │ │ │ │ -122 ValueTypeUINT32, ValueTypeUINT, │ │ │ │ -123 ValueTypeFLOAT32, ValueTypeFLOAT, │ │ │ │ -124 ValueTypeFLOAT64, ValueTypeDOUBLE │ │ │ │ -125 }; │ │ │ │ +84inline │ │ │ │ +85bool type_is_valid( unsigned char _t ) │ │ │ │ +86{ │ │ │ │ +87 return _t == GL_TRIANGLES │ │ │ │ +88 || _t == GL_TRIANGLE_STRIP │ │ │ │ +89 || _t == GL_QUADS │ │ │ │ +90 || _t == GL_POLYGON; │ │ │ │ +91} │ │ │ │ +92 │ │ │ │ +93 │ │ │ │ +100template < typename Mesh > inline │ │ │ │ +_1_0_1bool _b_i_n_d( osg::GeometryPtr& _geo, Mesh& _mesh ) │ │ │ │ +102{ │ │ │ │ +103 _geo = _mesh.createGeometryPtr(); │ │ │ │ +104} │ │ │ │ +105 │ │ │ │ +114template < typename Mesh > inline │ │ │ │ +_1_1_5bool _b_i_n_d( Mesh& _mesh, osg::GeometryPtr& _geo ) │ │ │ │ +116{ │ │ │ │ +117 using namespace _O_p_e_n_M_e_s_h; │ │ │ │ +118 using namespace osg; │ │ │ │ +119 using namespace std; │ │ │ │ +120 │ │ │ │ +121 bool ok = true; │ │ │ │ +122 │ │ │ │ +123 // pre-check if types are supported │ │ │ │ +124 │ │ │ │ +125 GeoPTypesPtr types = _geo->getTypes(); │ │ │ │ 126 │ │ │ │ -127private: │ │ │ │ -128 │ │ │ │ -129 bool can_u_read(std::istream& _is) const; │ │ │ │ +127 if ( (size_t)count_if( types->getData(), types->getData()+types->size(), │ │ │ │ +128 ptr_fun(type_is_valid) ) != (size_t)types->size() ) │ │ │ │ +129 return false; │ │ │ │ 130 │ │ │ │ -131 bool read_ascii(std::istream& _in, BaseImporter& _bi, const Options& _opt) │ │ │ │ -const; │ │ │ │ -132 bool read_binary(std::istream& _in, BaseImporter& _bi, bool swap, const │ │ │ │ -Options& _opt) const; │ │ │ │ -133 │ │ │ │ -134 void readValue(ValueType _type , std::istream& _in, float& _value) const; │ │ │ │ -135 void readValue(ValueType _type , std::istream& _in, double& _value) const; │ │ │ │ -136 void readValue(ValueType _type , std::istream& _in, unsigned int& _value) │ │ │ │ -const; │ │ │ │ -137 void readValue(ValueType _type , std::istream& _in, unsigned short& _value) │ │ │ │ -const; │ │ │ │ -138 void readValue(ValueType _type , std::istream& _in, unsigned char& _value) │ │ │ │ -const; │ │ │ │ -139 void readValue(ValueType _type , std::istream& _in, int& _value) const; │ │ │ │ -140 void readValue(ValueType _type , std::istream& _in, short& _value) const; │ │ │ │ -141 void readValue(ValueType _type , std::istream& _in, signed char& _value) │ │ │ │ -const; │ │ │ │ -142 │ │ │ │ -143 template │ │ │ │ -144 void readInteger(ValueType _type, std::istream& _in, T& _value) const; │ │ │ │ -145 │ │ │ │ -147 void consume_input(std::istream& _in, int _count) const { │ │ │ │ +131 // pre-check if it is a multi-indexed geometry, which is not supported! │ │ │ │ +132 │ │ │ │ +133 if ( _geo->getIndexMapping().getSize() > 1 ) │ │ │ │ +134 { │ │ │ │ +135 omerr << "OpenMesh::Kernel_OSG::bind(): Multi-indexed geometry is not │ │ │ │ +supported!\n"; │ │ │ │ +136 return false; │ │ │ │ +137 } │ │ │ │ +138 │ │ │ │ +139 │ │ │ │ +140 // create shortcuts │ │ │ │ +141 │ │ │ │ +142 GeoPLengthsPtr lengths = _geo->getLengths(); │ │ │ │ +143 GeoIndicesPtr indices = _geo->getIndices(); │ │ │ │ +144 GeoPositionsPtr pos = _geo->getPositions(); │ │ │ │ +145 GeoNormalsPtr normals = _geo->getNormals(); │ │ │ │ +146 GeoColorsPtr colors = _geo->getColors(); │ │ │ │ +147 │ │ │ │ 148 │ │ │ │ -149 // Make sure, we do not run over our buffer size │ │ │ │ -150 int loops = _count / 8 ; │ │ │ │ -151 │ │ │ │ -152 // Read only our buffer size batches │ │ │ │ -153 for ( auto i = 0 ; i < loops; ++i) { │ │ │ │ -154 _in.read(reinterpret_cast(&buff[0]), 8); │ │ │ │ -155 } │ │ │ │ -156 │ │ │ │ -157 // Read reminder which is smaller than our buffer size │ │ │ │ -158 _in.read(reinterpret_cast(&buff[0]), _count - 8 * loops ); │ │ │ │ -159 } │ │ │ │ -160 │ │ │ │ -161 mutable unsigned char buff[8]; │ │ │ │ +149 // -------------------- now convert everything to polygon/triangles │ │ │ │ +150 │ │ │ │ +151 size_t tidx, bidx; // types; base index into indices │ │ │ │ +152 vector< VertexHandle > vhandles; │ │ │ │ +153 │ │ │ │ +154 // ---------- initialize geometry │ │ │ │ +155 │ │ │ │ +156 { │ │ │ │ +157 _V_e_r_t_e_x_H_a_n_d_l_e vh; │ │ │ │ +158 typedef typename _M_e_s_h_:_:_C_o_l_o_r color_t; │ │ │ │ +159 │ │ │ │ +160 bool bind_normal = (normals!=NullFC) && _mesh.has_vertex_normals(); │ │ │ │ +161 bool bind_color = (colors !=NullFC) && _mesh.has_vertex_colors(); │ │ │ │ 162 │ │ │ │ -164 mutable Options options_; │ │ │ │ -165 │ │ │ │ -167 mutable Options userOptions_; │ │ │ │ -168 │ │ │ │ -169 mutable unsigned int vertexCount_; │ │ │ │ -170 mutable unsigned int faceCount_; │ │ │ │ -171 │ │ │ │ -172 mutable uint vertexDimension_; │ │ │ │ -173 │ │ │ │ -174 enum Property { │ │ │ │ -175 XCOORD,YCOORD,ZCOORD, │ │ │ │ -176 TEXX,TEXY, │ │ │ │ -177 COLORRED,COLORGREEN,COLORBLUE,COLORALPHA, │ │ │ │ -178 XNORM,YNORM,ZNORM, CUSTOM_PROP, VERTEX_INDICES, │ │ │ │ -179 TEXCOORD, TEXNUMBER, UNSUPPORTED │ │ │ │ -180 }; │ │ │ │ -181 │ │ │ │ -183 mutable std::map scalar_size_; │ │ │ │ -184 │ │ │ │ -185 // Number of vertex properties │ │ │ │ -186 struct PropertyInfo │ │ │ │ -187 { │ │ │ │ -188 Property property; │ │ │ │ -189 ValueType value; │ │ │ │ -190 std::string name;//for custom properties │ │ │ │ -191 ValueType listIndexType;//if type is unsupported, the poerty is not a list. │ │ │ │ -otherwise, it the index type │ │ │ │ -192 PropertyInfo():property(UNSUPPORTED),value(Unsupported),name │ │ │ │ -(""),listIndexType(Unsupported){} │ │ │ │ -193 PropertyInfo(Property _p, ValueType _v):property(_p),value(_v),name │ │ │ │ -(""),listIndexType(Unsupported){} │ │ │ │ -194 PropertyInfo(Property _p, ValueType _v, const std::string& _n):property │ │ │ │ -(_p),value(_v),name(_n),listIndexType(Unsupported){} │ │ │ │ -195 }; │ │ │ │ -196 │ │ │ │ -197 enum Element { │ │ │ │ -198 VERTEX, │ │ │ │ -199 FACE, │ │ │ │ -200 UNKNOWN │ │ │ │ -201 }; │ │ │ │ -202 │ │ │ │ -203 // Information on the elements │ │ │ │ -204 struct ElementInfo │ │ │ │ -205 { │ │ │ │ -206 Element element_; │ │ │ │ -207 std::string name_; │ │ │ │ -208 unsigned int count_; │ │ │ │ -209 std::vector< PropertyInfo > properties_; │ │ │ │ -210 }; │ │ │ │ -211 │ │ │ │ -212 mutable std::vector< ElementInfo > elements_; │ │ │ │ -213 │ │ │ │ -214 mutable std::vector< std::string > texture_files_; │ │ │ │ -215 │ │ │ │ -216 template │ │ │ │ -217 inline void read(_PLYReader_::ValueType _type, std::istream& _in, T& │ │ │ │ -_value, OpenMesh::GenProg::TrueType /*_binary*/) const │ │ │ │ -218 { │ │ │ │ -219 readValue(_type, _in, _value); │ │ │ │ -220 } │ │ │ │ -221 │ │ │ │ -222 template │ │ │ │ -223 inline void read(_PLYReader_::ValueType _type, std::istream& _in, T& │ │ │ │ -_value, OpenMesh::GenProg::FalseType /*_binary*/) const │ │ │ │ -224 { │ │ │ │ -225 _in >> _value; │ │ │ │ -226 } │ │ │ │ -227 │ │ │ │ -228 template │ │ │ │ -229 inline void readInteger(_PLYReader_::ValueType _type, std::istream& _in, T& │ │ │ │ -_value, OpenMesh::GenProg::TrueType /*_binary*/) const │ │ │ │ -230 { │ │ │ │ -231 readInteger(_type, _in, _value); │ │ │ │ -232 } │ │ │ │ -233 │ │ │ │ -234 template │ │ │ │ -235 inline void readInteger(_PLYReader_::ValueType _type, std::istream& _in, T& │ │ │ │ -_value, OpenMesh::GenProg::FalseType /*_binary*/) const │ │ │ │ -236 { │ │ │ │ -237 _in >> _value; │ │ │ │ -238 } │ │ │ │ -239 │ │ │ │ -240 //read and assign custom properties with the given type. Also creates │ │ │ │ -property, if not exist │ │ │ │ -241 template │ │ │ │ -242 void readCreateCustomProperty(std::istream& _in, BaseImporter& _bi, Handle │ │ │ │ -_h, const std::string& _propName, const ValueType _valueType, const ValueType │ │ │ │ -_listType) const; │ │ │ │ -243 │ │ │ │ -244 template │ │ │ │ -245 void readCustomProperty(std::istream& _in, BaseImporter& _bi, Handle _h, │ │ │ │ -const std::string& _propName, const _PLYReader_::ValueType _valueType, const │ │ │ │ -_PLYReader_::ValueType _listIndexType) const; │ │ │ │ -246}; │ │ │ │ -247 │ │ │ │ -248 │ │ │ │ -249//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -250 │ │ │ │ -251 │ │ │ │ -253extern _PLYReader_ _____P_L_Y_R_e_a_d_e_r_I_n_s_t_a_n_c_e; │ │ │ │ -254OPENMESHDLLEXPORT _PLYReader_& PLYReader(); │ │ │ │ -255 │ │ │ │ -256 │ │ │ │ -257// │ │ │ │ +163 for (bidx=0; bidx < pos->size(); ++bidx) │ │ │ │ +164 { │ │ │ │ +165 vh = _mesh.add_vertex( pos->getValue(bidx) ); │ │ │ │ +166 if ( bind_normal ) │ │ │ │ +167 _mesh.set_normal(vh, normals->getValue(bidx)); │ │ │ │ +168 if ( bind_color ) │ │ │ │ +169 _mesh.set_color(vh, color_cast(colors->getValue(bidx))); │ │ │ │ +170 } │ │ │ │ +171 } │ │ │ │ +172 │ │ │ │ +173 // ---------- create topology │ │ │ │ +174 │ │ │ │ +175 _F_a_c_e_H_a_n_d_l_e fh; │ │ │ │ +176 │ │ │ │ +177 size_t max_bidx = indices != NullFC ? indices->size() : pos->size(); │ │ │ │ +178 │ │ │ │ +179 for (bidx=tidx=0; ok && tidxsize() && bidx < max_bidx; ++tidx) │ │ │ │ +180 { │ │ │ │ +181 switch( types->getValue(tidx) ) │ │ │ │ +182 { │ │ │ │ +183 case GL_TRIANGLES: │ │ │ │ +184 vhandles.resize(3); │ │ │ │ +185 for(size_t lidx=0; lidx < lengths->getValue(tidx)-2; lidx+=3) │ │ │ │ +186 { │ │ │ │ +187 if (indices == NullFC ) { │ │ │ │ +188 vhandles[0] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx); │ │ │ │ +189 vhandles[1] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+1); │ │ │ │ +190 vhandles[2] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+2); │ │ │ │ +191 } │ │ │ │ +192 else { │ │ │ │ +193 vhandles[0] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx ) ); │ │ │ │ +194 vhandles[1] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+1) ); │ │ │ │ +195 vhandles[2] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+2) ); │ │ │ │ +196 } │ │ │ │ +197 │ │ │ │ +198 if ( !(fh = _mesh.add_face( vhandles )).is_valid() ) │ │ │ │ +199 { │ │ │ │ +200 // if fh is complex try swapped order │ │ │ │ +201 swap(vhandles[2], vhandles[1]); │ │ │ │ +202 fh = _mesh.add_face( vhandles ); │ │ │ │ +203 } │ │ │ │ +204 ok = fh._i_s___v_a_l_i_d(); │ │ │ │ +205 } │ │ │ │ +206 break; │ │ │ │ +207 │ │ │ │ +208 case GL_TRIANGLE_STRIP: │ │ │ │ +209 vhandles.resize(3); │ │ │ │ +210 for (size_t lidx=0; lidx < lengths->getValue(tidx)-2; ++lidx) │ │ │ │ +211 { │ │ │ │ +212 if (indices == NullFC ) { │ │ │ │ +213 vhandles[0] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx); │ │ │ │ +214 vhandles[1] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+1); │ │ │ │ +215 vhandles[2] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+2); │ │ │ │ +216 } │ │ │ │ +217 else { │ │ │ │ +218 vhandles[0] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx ) ); │ │ │ │ +219 vhandles[1] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+1) ); │ │ │ │ +220 vhandles[2] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+2) ); │ │ │ │ +221 } │ │ │ │ +222 │ │ │ │ +223 if (vhandles[0]!=vhandles[2] && │ │ │ │ +224 vhandles[0]!=vhandles[1] && │ │ │ │ +225 vhandles[1]!=vhandles[2]) │ │ │ │ +226 { │ │ │ │ +227 // if fh is complex try swapped order │ │ │ │ +228 bool swapped(false); │ │ │ │ +229 │ │ │ │ +230 if (lidx % 2) // odd numbered triplet must be reordered │ │ │ │ +231 swap(vhandles[2], vhandles[1]); │ │ │ │ +232 │ │ │ │ +233 if ( !(fh = _mesh.add_face( vhandles )).is_valid() ) │ │ │ │ +234 { │ │ │ │ +235 omlog << "OpenMesh::Kernel_OSG::bind(): complex entity!\n"; │ │ │ │ +236 │ │ │ │ +237 swap(vhandles[2], vhandles[1]); │ │ │ │ +238 fh = _mesh.add_face( vhandles ); │ │ │ │ +239 swapped = true; │ │ │ │ +240 } │ │ │ │ +241 ok = fh._i_s___v_a_l_i_d(); │ │ │ │ +242 } │ │ │ │ +243 } │ │ │ │ +244 break; │ │ │ │ +245 │ │ │ │ +246 case GL_QUADS: │ │ │ │ +247 vhandles.resize(4); │ │ │ │ +248 for(size_t nf=_mesh.n_faces(), lidx=0; │ │ │ │ +249 lidx < lengths->getValue(tidx)-3; lidx+=4) │ │ │ │ +250 { │ │ │ │ +251 if (indices == NullFC ) { │ │ │ │ +252 vhandles[0] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx); │ │ │ │ +253 vhandles[1] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+1); │ │ │ │ +254 vhandles[2] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+2); │ │ │ │ +255 vhandles[3] = _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx+3); │ │ │ │ +256 } │ │ │ │ +257 else { │ │ │ │ +258 vhandles[0] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx ) ); │ │ │ │ +259 vhandles[1] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+1) ); │ │ │ │ +260 vhandles[2] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+2) ); │ │ │ │ +261 vhandles[3] = _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx+3) ); │ │ │ │ +262 } │ │ │ │ +263 │ │ │ │ +264 fh = _mesh.add_face( vhandles ); │ │ │ │ +265 ok = ( Mesh::Face::is_triangle() && (_mesh.n_faces()==(nf+2))) │ │ │ │ +266 || fh._i_s___v_a_l_i_d(); │ │ │ │ +267 nf = _mesh.n_faces(); │ │ │ │ +268 } │ │ │ │ +269 break; │ │ │ │ +270 │ │ │ │ +271 case GL_POLYGON: │ │ │ │ +272 { │ │ │ │ +273 size_t ne = lengths->getValue(tidx); │ │ │ │ +274 size_t nf = _mesh.n_faces(); │ │ │ │ +275 │ │ │ │ +276 vhandles.resize(ne); │ │ │ │ +277 │ │ │ │ +278 for(size_t lidx=0; lidx < ne; ++lidx) │ │ │ │ +279 vhandles[lidx] = (indices == NullFC) │ │ │ │ +280 ? _V_e_r_t_e_x_H_a_n_d_l_e(bidx+lidx) │ │ │ │ +281 : _V_e_r_t_e_x_H_a_n_d_l_e(indices->getValue(bidx+lidx) ); │ │ │ │ +282 │ │ │ │ +283 fh = _mesh.add_face( vhandles ); │ │ │ │ +284 ok = ( Mesh::Face::is_triangle() && (_mesh.n_faces()==nf+ne-2) ) │ │ │ │ +285 || fh._i_s___v_a_l_i_d(); │ │ │ │ +286 │ │ │ │ +287 break; │ │ │ │ +288 } │ │ │ │ +289 default: │ │ │ │ +290 cerr << "Warning! Skipping unsupported type " │ │ │ │ +291 << types->getValue(tidx) << " '" │ │ │ │ +292 << Utils::GLenum_as_string( types->getValue(tidx) ) << "'\n"; │ │ │ │ +293 } │ │ │ │ +294 │ │ │ │ +295 // update base index into indices for next face type │ │ │ │ +296 bidx += lengths->getValue(tidx); │ │ │ │ +297 } │ │ │ │ +298 │ │ │ │ +299 if (ok) │ │ │ │ +300 ok=_mesh.bind(_geo); │ │ │ │ +301 else │ │ │ │ +302 _mesh.clear(); │ │ │ │ +303 │ │ │ │ +304 return ok; │ │ │ │ +305} │ │ │ │ +306 │ │ │ │ +307 │ │ │ │ +308// │ │ │ │ ============================================================================= │ │ │ │ -258} // namespace IO │ │ │ │ -259} // namespace OpenMesh │ │ │ │ -260// │ │ │ │ +309} // namespace Kernel_OSG │ │ │ │ +310} // namespace OpenMesh │ │ │ │ +311// │ │ │ │ ============================================================================= │ │ │ │ -261#endif │ │ │ │ -262// │ │ │ │ +312#endif // OPENMESH_KERNEL_OSG_BINDT_HH defined │ │ │ │ +313// │ │ │ │ ============================================================================= │ │ │ │ +314 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_____P_L_Y_R_e_a_d_e_r_I_n_s_t_a_n_c_e │ │ │ │ -_PLYReader_ __PLYReaderInstance │ │ │ │ -Declare the single entity of the PLY reader. │ │ │ │ -DDeeffiinniittiioonn PLYReader.cc:73 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_R_e_a_d_e_r │ │ │ │ -Base class for reader modules. │ │ │ │ -DDeeffiinniittiioonn BaseReader.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_R_e_a_d_e_r__ │ │ │ │ -Implementation of the PLY format reader. │ │ │ │ -DDeeffiinniittiioonn PLYReader.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_R_e_a_d_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Returns a brief description of the file type that can be parsed. │ │ │ │ -DDeeffiinniittiioonn PLYReader.hh:101 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_R_e_a_d_e_r___:_:_g_e_t___m_a_g_i_c │ │ │ │ -std::string get_magic() const override │ │ │ │ -Return magic bits used to determine file format. │ │ │ │ -DDeeffiinniittiioonn PLYReader.hh:103 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_R_e_a_d_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Returns a string with the accepted file extensions separated by a whitespace │ │ │ │ -and in small caps. │ │ │ │ -DDeeffiinniittiioonn PLYReader.hh:102 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_K_e_r_n_e_l___O_S_G_:_:_b_i_n_d │ │ │ │ +bool bind(osg::GeometryPtr &_geo, Mesh &_mesh) │ │ │ │ +Bind a OpenSG geometry to a mesh. │ │ │ │ +DDeeffiinniittiioonn bindT.hh:101 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ +bool is_valid() const │ │ │ │ +The handle is valid iff the index is not negative. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ +Kernel::Color Color │ │ │ │ +Color type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00566_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/reader/OMReader.hh Source File │ │ │ +OpenMesh: OpenMesh/Tools/Kernel_OSG/ArrayKernelT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OMReader.hh
│ │ │ +
ArrayKernelT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -141,150 +141,189 @@ │ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45//=============================================================================
│ │ │
46//
│ │ │ -
47// Implements a reader module for OFF files
│ │ │ +
47// CLASS OSGArrayKernelT
│ │ │
48//
│ │ │
49//=============================================================================
│ │ │
50
│ │ │
51
│ │ │ -
52#ifndef __OMREADER_HH__
│ │ │ -
53#define __OMREADER_HH__
│ │ │ +
52#ifndef OPENMESH_KERNELOSG_ARRAY_KERNEL_HH
│ │ │ +
53#define OPENMEHS_KERNELOSG_ARRAY_KERNEL_HH
│ │ │
54
│ │ │
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ +
56//== INCLUDES =================================================================
│ │ │
57
│ │ │ -
58// OpenMesh
│ │ │ -
59#include <OpenMesh/Core/System/config.h>
│ │ │ -
60#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
61#include <OpenMesh/Core/IO/OMFormat.hh>
│ │ │ -
62#include <OpenMesh/Core/IO/IOManager.hh>
│ │ │ -
63#include <OpenMesh/Core/IO/importer/BaseImporter.hh>
│ │ │ -
64#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ +
58#include <vector>
│ │ │ +
59// --------------------
│ │ │ +
60#include <OpenMesh/Core/System/config.h>
│ │ │ +
61#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ +
62#include <OpenMesh/Core/Mesh/ArrayKernel.hh>
│ │ │ +
63// --------------------
│ │ │ +
64#include <OpenMesh/Tools/Kernel_OSG/AttribKernelT.hh>
│ │ │
65
│ │ │ -
66// STD C++
│ │ │ -
67#include <iosfwd>
│ │ │ -
68#include <string>
│ │ │ +
66
│ │ │ +
67
│ │ │ +
68//== NAMESPACES ===============================================================
│ │ │
69
│ │ │
70
│ │ │ -
71//== NAMESPACES ===============================================================
│ │ │ -
72
│ │ │ +
71namespace OpenMesh {
│ │ │ +
72namespace Kernel_OSG {
│ │ │
73
│ │ │ -
74namespace OpenMesh {
│ │ │ -
75namespace IO {
│ │ │ +
74//== CLASS DEFINITION =========================================================
│ │ │ +
75
│ │ │
76
│ │ │ -
77
│ │ │ -
78//== IMPLEMENTATION ===========================================================
│ │ │ -
79
│ │ │ -
80
│ │ │ -
│ │ │ -
85class OPENMESHDLLEXPORT _OMReader_ : public BaseReader
│ │ │ -
86{
│ │ │ -
87public:
│ │ │ -
88
│ │ │ -
89 _OMReader_();
│ │ │ -
90 virtual ~_OMReader_() { }
│ │ │ -
91
│ │ │ -
92 std::string get_description() const override { return "OpenMesh File Format"; }
│ │ │ -
93 std::string get_extensions() const override { return "om"; }
│ │ │ -
94 std::string get_magic() const override { return "OM"; }
│ │ │ -
95
│ │ │ -
96 bool read(const std::string& _filename,
│ │ │ -
97 BaseImporter& _bi,
│ │ │ -
98 Options& _opt ) override;
│ │ │ +
87// \see OpenMesh::ArrayHandleT
│ │ │ +
88// \see \ref mesh_type
│ │ │ +
89
│ │ │ +
90
│ │ │ +
91template <class AttribKernel, class FinalMeshItems>
│ │ │ +
│ │ │ + │ │ │ +
93 : public OpenMesh::ArrayKernelT<AttribKernel, FinalMeshItems>
│ │ │ +
94{
│ │ │ +
95public:
│ │ │ +
96
│ │ │ + │ │ │ +
98 typedef OpenMesh::ArrayKernelT<AttribKernel, FinalMeshItems> Base;
│ │ │
99
│ │ │ -
101 bool read(std::istream& _is,
│ │ │ -
102 BaseImporter& _bi,
│ │ │ -
103 Options& _opt ) override;
│ │ │ -
104
│ │ │ -
105 virtual bool can_u_read(const std::string& _filename) const override;
│ │ │ -
106 virtual bool can_u_read(std::istream& _is) const;
│ │ │ -
107
│ │ │ -
108
│ │ │ -
109private:
│ │ │ +
100 // attributes
│ │ │ +
101// typedef typename Base::HasVertexNormals HasVertexNormals;
│ │ │ +
102// typedef typename Base::HasVertexColors HasVertexColors;
│ │ │ +
103// typedef typename Base::HasVertexTexCoords HasVertexTexCoords;
│ │ │ +
104// typedef typename Base::HasVertexStatus HasVertexStatus;
│ │ │ +
105 typedef typename Base::HasPrevHalfedge HasPrevHalfedge;
│ │ │ +
106// typedef typename Base::HasEdgeStatus HasEdgeStatus;
│ │ │ +
107// typedef typename Base::HasFaceNormals HasFaceNormals;
│ │ │ +
108// typedef typename Base::HasFaceColors HasFaceColors;
│ │ │ +
109// typedef typename Base::HasFaceStatus HasFaceStatus;
│ │ │
110
│ │ │ -
111 bool supports( const OMFormat::uint8 version ) const;
│ │ │ -
112
│ │ │ -
113 bool read_ascii(std::istream& _is, BaseImporter& _bi, const Options& _opt) const;
│ │ │ -
114 bool read_binary(std::istream& _is, BaseImporter& _bi, const Options& _opt) const;
│ │ │ -
115
│ │ │ -
116 typedef OMFormat::Header Header;
│ │ │ -
117 typedef OMFormat::Chunk::Header ChunkHeader;
│ │ │ -
118 typedef OMFormat::Chunk::PropertyName PropertyName;
│ │ │ -
119
│ │ │ -
120 // initialized/updated by read_binary*/read_ascii*
│ │ │ -
121 mutable size_t bytes_;
│ │ │ -
122 mutable Options fileOptions_;
│ │ │ -
123 mutable Header header_;
│ │ │ -
124 mutable ChunkHeader chunk_header_;
│ │ │ -
125 mutable PropertyName property_name_;
│ │ │ -
126
│ │ │ -
127 bool read_binary_vertex_chunk( std::istream &_is,
│ │ │ -
128 BaseImporter &_bi,
│ │ │ -
129 const Options &_opt,
│ │ │ -
130 bool _swap) const;
│ │ │ -
131
│ │ │ -
132 bool read_binary_face_chunk( std::istream &_is,
│ │ │ -
133 BaseImporter &_bi,
│ │ │ -
134 const Options &_opt,
│ │ │ -
135 bool _swap) const;
│ │ │ -
136
│ │ │ -
137 bool read_binary_edge_chunk( std::istream &_is,
│ │ │ -
138 BaseImporter &_bi,
│ │ │ -
139 const Options &_opt,
│ │ │ -
140 bool _swap) const;
│ │ │ -
141
│ │ │ -
142 bool read_binary_halfedge_chunk( std::istream &_is,
│ │ │ -
143 BaseImporter &_bi,
│ │ │ -
144 const Options &_opt,
│ │ │ -
145 bool _swap) const;
│ │ │ +
111 // item types
│ │ │ +
112 typedef typename FinalMeshItems::Vertex Vertex;
│ │ │ +
113 typedef typename FinalMeshItems::Halfedge Halfedge;
│ │ │ +
114 typedef typename FinalMeshItems::Edge Edge;
│ │ │ +
115 typedef typename FinalMeshItems::Face Face;
│ │ │ +
116 typedef typename FinalMeshItems::Point Point;
│ │ │ +
117 typedef typename FinalMeshItems::Normal Normal;
│ │ │ +
118 typedef typename FinalMeshItems::Color Color;
│ │ │ +
119 typedef typename FinalMeshItems::TexCoord TexCoord;
│ │ │ +
120 typedef typename FinalMeshItems::Scalar Scalar;
│ │ │ +
121
│ │ │ +
122// // handles
│ │ │ +
123// typedef typename OpenMesh::VertexHandle VertexHandle;
│ │ │ +
124// typedef typename FinalMeshItems::HalfedgeHandle HalfedgeHandle;
│ │ │ +
125// typedef typename FinalMeshItems::EdgeHandle EdgeHandle;
│ │ │ +
126// typedef typename FinalMeshItems::FaceHandle FaceHandle;
│ │ │ +
127
│ │ │ +
128 // iterators
│ │ │ +
129 typedef std::vector<Vertex> VertexContainer;
│ │ │ +
130 typedef std::vector<Edge> EdgeContainer;
│ │ │ +
131 typedef std::vector<Face> FaceContainer;
│ │ │ +
132 typedef typename VertexContainer::iterator KernelVertexIter;
│ │ │ +
133 typedef typename VertexContainer::const_iterator KernelConstVertexIter;
│ │ │ +
134 typedef typename EdgeContainer::iterator KernelEdgeIter;
│ │ │ +
135 typedef typename EdgeContainer::const_iterator KernelConstEdgeIter;
│ │ │ +
136 typedef typename FaceContainer::iterator KernelFaceIter;
│ │ │ +
137 typedef typename FaceContainer::const_iterator KernelConstFaceIter;
│ │ │ +
138
│ │ │ +
139public:
│ │ │ +
140
│ │ │ +
141 ArrayKernelT() : Base()
│ │ │ +
142 { }
│ │ │ +
143
│ │ │ +
144 virtual ~ArrayKernelT()
│ │ │ +
145 { }
│ │ │
146
│ │ │ -
147 bool read_binary_mesh_chunk( std::istream &_is,
│ │ │ -
148 BaseImporter &_bi,
│ │ │ -
149 const Options &_opt,
│ │ │ -
150 bool _swap) const;
│ │ │ -
151
│ │ │ -
152 size_t restore_binary_custom_data(std::istream& _is,
│ │ │ -
153 BaseProperty* _bp,
│ │ │ -
154 size_t _n_elem,
│ │ │ -
155 bool _swap) const;
│ │ │ -
156
│ │ │ -
157 //------------------helper
│ │ │ -
158private:
│ │ │ -
159 void add_generic_property(OMFormat::Chunk::PropertyName& _property_type, BaseImporter& _bi) const;
│ │ │ -
160};
│ │ │ -
│ │ │ -
161
│ │ │ +
147public: // replacements
│ │ │ +
148
│ │ │ +
149 void set_halfedge_handle(VertexHandle _vh, HalfedgeHandle _heh) {
│ │ │ +
150 Base::set_halfedge_handle( _vh, _heh );
│ │ │ +
151 }
│ │ │ +
152
│ │ │ +
153 void set_halfedge_handle(FaceHandle _fh, HalfedgeHandle _heh) {
│ │ │ +
154 Base::set_halfedge_handle( _fh, _heh );
│ │ │ +
155 osg_sync( _fh );
│ │ │ +
156 }
│ │ │ +
157
│ │ │ +
158 void set_next_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _nheh) {
│ │ │ +
159 Base::set_next_halfedge_handle( _heh, _nheh );
│ │ │ +
160 osg_sync( face_handle( _heh ) ); // ##Changed
│ │ │ +
161 }
│ │ │
162
│ │ │ -
163//== TYPE DEFINITION ==========================================================
│ │ │ +
163 void garbage_collection(bool _v=true, bool _e=true, bool _f=true);
│ │ │
164
│ │ │ -
165
│ │ │ -
167extern _OMReader_ __OMReaderInstance;
│ │ │ -
168OPENMESHDLLEXPORT _OMReader_& OMReader();
│ │ │ -
169
│ │ │ -
170
│ │ │ -
171//=============================================================================
│ │ │ -
172} // namespace IO
│ │ │ -
173} // namespace OpenMesh
│ │ │ -
174//=============================================================================
│ │ │ -
175#endif
│ │ │ -
176//=============================================================================
│ │ │ +
165protected:
│ │ │ +
166
│ │ │ +
167 bool osg_sync( FaceHandle _fh )
│ │ │ +
168 {
│ │ │ +
169 return _fh.is_valid()
│ │ │ +
170 ? osg_sync( _fh, typename Face::IsTriangle() )
│ │ │ +
171 : false;
│ │ │ +
172 }
│ │ │ +
173
│ │ │ +
174private:
│ │ │ +
175
│ │ │ +
176 bool osg_sync( FaceHandle _fh, GenProg::Bool2Type<true> )
│ │ │ +
177 {
│ │ │ +
178 HalfedgeHandle hh( halfedge_handle(_fh) );
│ │ │ +
179 if ( !hh.is_valid() ) return false;
│ │ │ +
180 FaceHandle f1( _fh.idx() * 3 );
│ │ │ +
181 set_face_indices( f1, to_vertex_handle(hh).idx() );
│ │ │ +
182
│ │ │ +
183 hh = next_halfedge_handle(hh);
│ │ │ +
184 if ( !hh.is_valid() ) return false;
│ │ │ +
185 FaceHandle f2( f1.idx()+1 );
│ │ │ +
186 set_face_indices( f2, to_vertex_handle(hh).idx() );
│ │ │ +
187
│ │ │ +
188 hh = next_halfedge_handle(hh);
│ │ │ +
189 if ( !hh.is_valid() ) return false;
│ │ │ +
190 FaceHandle f3( f1.idx()+2 );
│ │ │ +
191 set_face_indices( f3, to_vertex_handle(hh).idx() );
│ │ │ +
192
│ │ │ +
193 set_face_types ( _fh, GL_TRIANGLES );
│ │ │ +
194 set_face_lengths( _fh, 3 );
│ │ │ +
195
│ │ │ +
196 return true;
│ │ │ +
197 }
│ │ │ +
198
│ │ │ +
199 bool osg_sync( FaceHandle _fh, GenProg::Bool2Type<false> )
│ │ │ +
200 {
│ │ │ +
201 return false;
│ │ │ +
202 }
│ │ │ +
203
│ │ │ +
204};
│ │ │ +
│ │ │ +
205
│ │ │ +
206
│ │ │ +
207template <class AttribKernel, class FinalMeshItems>
│ │ │ +
208void
│ │ │ + │ │ │ +
210garbage_collection(bool _v, bool _e, bool _f)
│ │ │ +
211{
│ │ │ +
212 Base::garbage_collection(_v, _e, _f);
│ │ │ +
213 for (size_t fidx=0; fidx < n_faces(); ++fidx)
│ │ │ +
214 osg_sync( FaceHandle(fidx) );
│ │ │ +
215}
│ │ │ +
216
│ │ │ +
217//=============================================================================
│ │ │ +
218} // namespace Kernel_OSG
│ │ │ +
219} // namespace OpenMesh
│ │ │ +
220//=============================================================================
│ │ │ +
221#endif // OPENMESH_ARRAY_KERNEL_HH defined
│ │ │ +
222//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
_OMReader_ __OMReaderInstance
Declare the single entity of the OM reader.
Definition OMReader.cc:75
│ │ │ -
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for reader modules.
Definition BaseReader.hh:87
│ │ │ -
Implementation of the OM format reader.
Definition OMReader.hh:86
│ │ │ -
std::string get_magic() const override
Return magic bits used to determine file format.
Definition OMReader.hh:94
│ │ │ -
std::string get_extensions() const override
Returns a string with the accepted file extensions separated by a whitespace and in small caps.
Definition OMReader.hh:93
│ │ │ -
std::string get_description() const override
Returns a brief description of the file type that can be parsed.
Definition OMReader.hh:92
│ │ │ -
Abstract class defining the basic interface of a dynamic property.
Definition BaseProperty.hh:61
│ │ │ +
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ +
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Mesh kernel using arrays for mesh item storage.
Definition ArrayKernelT.hh:94
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,16 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OMReader.hh │ │ │ │ +ArrayKernelT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -51,182 +51,207 @@ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45// │ │ │ │ ============================================================================= │ │ │ │ 46// │ │ │ │ -47// Implements a reader module for OFF files │ │ │ │ +47// CLASS OSGArrayKernelT │ │ │ │ 48// │ │ │ │ 49// │ │ │ │ ============================================================================= │ │ │ │ 50 │ │ │ │ 51 │ │ │ │ -52#ifndef __OMREADER_HH__ │ │ │ │ -53#define __OMREADER_HH__ │ │ │ │ +52#ifndef OPENMESH_KERNELOSG_ARRAY_KERNEL_HH │ │ │ │ +53#define OPENMEHS_KERNELOSG_ARRAY_KERNEL_HH │ │ │ │ 54 │ │ │ │ 55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 57 │ │ │ │ -58// OpenMesh │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ +58#include │ │ │ │ +59// -------------------- │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include │ │ │ │ +63// -------------------- │ │ │ │ +64#include │ │ │ │ 65 │ │ │ │ -66// STD C++ │ │ │ │ -67#include │ │ │ │ -68#include │ │ │ │ +66 │ │ │ │ +67 │ │ │ │ +68//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ 69 │ │ │ │ 70 │ │ │ │ -71//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -72 │ │ │ │ +71namespace _O_p_e_n_M_e_s_h { │ │ │ │ +72namespace Kernel_OSG { │ │ │ │ 73 │ │ │ │ -74namespace _O_p_e_n_M_e_s_h { │ │ │ │ -75namespace IO { │ │ │ │ +74//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +75 │ │ │ │ 76 │ │ │ │ -77 │ │ │ │ -78//== IMPLEMENTATION │ │ │ │ -=========================================================== │ │ │ │ -79 │ │ │ │ -80 │ │ │ │ -_8_5class OPENMESHDLLEXPORT ___O_M_R_e_a_d_e_r__ : public _B_a_s_e_R_e_a_d_e_r │ │ │ │ -86{ │ │ │ │ -87public: │ │ │ │ -88 │ │ │ │ -89 ___O_M_R_e_a_d_e_r__(); │ │ │ │ -90 virtual _~___O_M_R_e_a_d_e_r__() { } │ │ │ │ -91 │ │ │ │ -_9_2 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "OpenMesh File │ │ │ │ -Format"; } │ │ │ │ -_9_3 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "om"; } │ │ │ │ -_9_4 std::string _g_e_t___m_a_g_i_c() const override { return "OM"; } │ │ │ │ -95 │ │ │ │ -96 bool read(const std::string& _filename, │ │ │ │ -97 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -98 _O_p_t_i_o_n_s& _opt ) override; │ │ │ │ +87// \see OpenMesh::ArrayHandleT │ │ │ │ +88// \see \ref mesh_type │ │ │ │ +89 │ │ │ │ +90 │ │ │ │ +91template │ │ │ │ +_9_2class _A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +93 : public OpenMesh::ArrayKernelT │ │ │ │ +94{ │ │ │ │ +95public: │ │ │ │ +96 │ │ │ │ +97 typedef _A_r_r_a_y_K_e_r_n_e_l_T_<_A_t_t_r_i_b_K_e_r_n_e_l_,_ _F_i_n_a_l_M_e_s_h_I_t_e_m_s_> _T_h_i_s; │ │ │ │ +98 typedef OpenMesh::ArrayKernelT Base; │ │ │ │ 99 │ │ │ │ -101 bool read(std::istream& _is, │ │ │ │ -102 _B_a_s_e_I_m_p_o_r_t_e_r& _bi, │ │ │ │ -103 _O_p_t_i_o_n_s& _opt ) override; │ │ │ │ -104 │ │ │ │ -105 virtual bool can_u_read(const std::string& _filename) const override; │ │ │ │ -106 virtual bool can_u_read(std::istream& _is) const; │ │ │ │ -107 │ │ │ │ -108 │ │ │ │ -109private: │ │ │ │ +100 // attributes │ │ │ │ +101// typedef typename Base::HasVertexNormals HasVertexNormals; │ │ │ │ +102// typedef typename Base::HasVertexColors HasVertexColors; │ │ │ │ +103// typedef typename Base::HasVertexTexCoords HasVertexTexCoords; │ │ │ │ +104// typedef typename Base::HasVertexStatus HasVertexStatus; │ │ │ │ +105 typedef typename Base::HasPrevHalfedge HasPrevHalfedge; │ │ │ │ +106// typedef typename Base::HasEdgeStatus HasEdgeStatus; │ │ │ │ +107// typedef typename Base::HasFaceNormals HasFaceNormals; │ │ │ │ +108// typedef typename Base::HasFaceColors HasFaceColors; │ │ │ │ +109// typedef typename Base::HasFaceStatus HasFaceStatus; │ │ │ │ 110 │ │ │ │ -111 bool supports( const OMFormat::uint8 version ) const; │ │ │ │ -112 │ │ │ │ -113 bool read_ascii(std::istream& _is, _B_a_s_e_I_m_p_o_r_t_e_r& _bi, const _O_p_t_i_o_n_s& _opt) │ │ │ │ -const; │ │ │ │ -114 bool read_binary(std::istream& _is, _B_a_s_e_I_m_p_o_r_t_e_r& _bi, const _O_p_t_i_o_n_s& _opt) │ │ │ │ -const; │ │ │ │ -115 │ │ │ │ -116 typedef OMFormat::Header Header; │ │ │ │ -117 typedef OMFormat::Chunk::Header ChunkHeader; │ │ │ │ -118 typedef OMFormat::Chunk::PropertyName PropertyName; │ │ │ │ -119 │ │ │ │ -120 // initialized/updated by read_binary*/read_ascii* │ │ │ │ -121 mutable size_t bytes_; │ │ │ │ -122 mutable _O_p_t_i_o_n_s fileOptions_; │ │ │ │ -123 mutable Header header_; │ │ │ │ -124 mutable ChunkHeader chunk_header_; │ │ │ │ -125 mutable PropertyName property_name_; │ │ │ │ -126 │ │ │ │ -127 bool read_binary_vertex_chunk( std::istream &_is, │ │ │ │ -128 _B_a_s_e_I_m_p_o_r_t_e_r &_bi, │ │ │ │ -129 const _O_p_t_i_o_n_s &_opt, │ │ │ │ -130 bool _swap) const; │ │ │ │ -131 │ │ │ │ -132 bool read_binary_face_chunk( std::istream &_is, │ │ │ │ -133 _B_a_s_e_I_m_p_o_r_t_e_r &_bi, │ │ │ │ -134 const _O_p_t_i_o_n_s &_opt, │ │ │ │ -135 bool _swap) const; │ │ │ │ -136 │ │ │ │ -137 bool read_binary_edge_chunk( std::istream &_is, │ │ │ │ -138 _B_a_s_e_I_m_p_o_r_t_e_r &_bi, │ │ │ │ -139 const _O_p_t_i_o_n_s &_opt, │ │ │ │ -140 bool _swap) const; │ │ │ │ -141 │ │ │ │ -142 bool read_binary_halfedge_chunk( std::istream &_is, │ │ │ │ -143 _B_a_s_e_I_m_p_o_r_t_e_r &_bi, │ │ │ │ -144 const _O_p_t_i_o_n_s &_opt, │ │ │ │ -145 bool _swap) const; │ │ │ │ +111 // item types │ │ │ │ +112 typedef typename FinalMeshItems::Vertex Vertex; │ │ │ │ +113 typedef typename FinalMeshItems::Halfedge Halfedge; │ │ │ │ +114 typedef typename FinalMeshItems::Edge Edge; │ │ │ │ +115 typedef typename FinalMeshItems::Face Face; │ │ │ │ +116 typedef typename FinalMeshItems::Point Point; │ │ │ │ +117 typedef typename FinalMeshItems::Normal Normal; │ │ │ │ +118 typedef typename FinalMeshItems::Color Color; │ │ │ │ +119 typedef typename FinalMeshItems::TexCoord TexCoord; │ │ │ │ +120 typedef typename FinalMeshItems::Scalar Scalar; │ │ │ │ +121 │ │ │ │ +122// // handles │ │ │ │ +123// typedef typename OpenMesh::VertexHandle VertexHandle; │ │ │ │ +124// typedef typename FinalMeshItems::HalfedgeHandle HalfedgeHandle; │ │ │ │ +125// typedef typename FinalMeshItems::EdgeHandle EdgeHandle; │ │ │ │ +126// typedef typename FinalMeshItems::FaceHandle FaceHandle; │ │ │ │ +127 │ │ │ │ +128 // iterators │ │ │ │ +129 typedef std::vector VertexContainer; │ │ │ │ +130 typedef std::vector EdgeContainer; │ │ │ │ +131 typedef std::vector FaceContainer; │ │ │ │ +132 typedef typename VertexContainer::iterator KernelVertexIter; │ │ │ │ +133 typedef typename VertexContainer::const_iterator KernelConstVertexIter; │ │ │ │ +134 typedef typename EdgeContainer::iterator KernelEdgeIter; │ │ │ │ +135 typedef typename EdgeContainer::const_iterator KernelConstEdgeIter; │ │ │ │ +136 typedef typename FaceContainer::iterator KernelFaceIter; │ │ │ │ +137 typedef typename FaceContainer::const_iterator KernelConstFaceIter; │ │ │ │ +138 │ │ │ │ +139public: │ │ │ │ +140 │ │ │ │ +141 _A_r_r_a_y_K_e_r_n_e_l_T() : Base() │ │ │ │ +142 { } │ │ │ │ +143 │ │ │ │ +144 virtual _~_A_r_r_a_y_K_e_r_n_e_l_T() │ │ │ │ +145 { } │ │ │ │ 146 │ │ │ │ -147 bool read_binary_mesh_chunk( std::istream &_is, │ │ │ │ -148 _B_a_s_e_I_m_p_o_r_t_e_r &_bi, │ │ │ │ -149 const _O_p_t_i_o_n_s &_opt, │ │ │ │ -150 bool _swap) const; │ │ │ │ -151 │ │ │ │ -152 size_t restore_binary_custom_data(std::istream& _is, │ │ │ │ -153 _B_a_s_e_P_r_o_p_e_r_t_y* _bp, │ │ │ │ -154 size_t _n_elem, │ │ │ │ -155 bool _swap) const; │ │ │ │ -156 │ │ │ │ -157 //------------------helper │ │ │ │ -158private: │ │ │ │ -159 void add_generic_property(OMFormat::Chunk::PropertyName& _property_type, │ │ │ │ -_B_a_s_e_I_m_p_o_r_t_e_r& _bi) const; │ │ │ │ -160}; │ │ │ │ -161 │ │ │ │ +147public: // replacements │ │ │ │ +148 │ │ │ │ +149 void set_halfedge_handle(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { │ │ │ │ +150 Base::set_halfedge_handle( _vh, _heh ); │ │ │ │ +151 } │ │ │ │ +152 │ │ │ │ +153 void set_halfedge_handle(_F_a_c_e_H_a_n_d_l_e _fh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { │ │ │ │ +154 Base::set_halfedge_handle( _fh, _heh ); │ │ │ │ +155 osg_sync( _fh ); │ │ │ │ +156 } │ │ │ │ +157 │ │ │ │ +158 void set_next_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _nheh) { │ │ │ │ +159 Base::set_next_halfedge_handle( _heh, _nheh ); │ │ │ │ +160 osg_sync( face_handle( _heh ) ); // ##Changed │ │ │ │ +161 } │ │ │ │ 162 │ │ │ │ -163//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ +163 void garbage_collection(bool _v=true, bool _e=true, bool _f=true); │ │ │ │ 164 │ │ │ │ -165 │ │ │ │ -167extern _OMReader_ _____O_M_R_e_a_d_e_r_I_n_s_t_a_n_c_e; │ │ │ │ -168OPENMESHDLLEXPORT _OMReader_& OMReader(); │ │ │ │ -169 │ │ │ │ -170 │ │ │ │ -171// │ │ │ │ +165protected: │ │ │ │ +166 │ │ │ │ +167 bool osg_sync( _F_a_c_e_H_a_n_d_l_e _fh ) │ │ │ │ +168 { │ │ │ │ +169 return _fh._i_s___v_a_l_i_d() │ │ │ │ +170 ? osg_sync( _fh, typename Face::IsTriangle() ) │ │ │ │ +171 : false; │ │ │ │ +172 } │ │ │ │ +173 │ │ │ │ +174private: │ │ │ │ +175 │ │ │ │ +176 bool osg_sync( _F_a_c_e_H_a_n_d_l_e _fh, GenProg::Bool2Type ) │ │ │ │ +177 { │ │ │ │ +178 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hh( halfedge_handle(_fh) ); │ │ │ │ +179 if ( !hh._i_s___v_a_l_i_d() ) return false; │ │ │ │ +180 _F_a_c_e_H_a_n_d_l_e f1( _fh._i_d_x() * 3 ); │ │ │ │ +181 set_face_indices( f1, to_vertex_handle(hh).idx() ); │ │ │ │ +182 │ │ │ │ +183 hh = next_halfedge_handle(hh); │ │ │ │ +184 if ( !hh._i_s___v_a_l_i_d() ) return false; │ │ │ │ +185 _F_a_c_e_H_a_n_d_l_e f2( f1._i_d_x()+1 ); │ │ │ │ +186 set_face_indices( f2, to_vertex_handle(hh).idx() ); │ │ │ │ +187 │ │ │ │ +188 hh = next_halfedge_handle(hh); │ │ │ │ +189 if ( !hh._i_s___v_a_l_i_d() ) return false; │ │ │ │ +190 _F_a_c_e_H_a_n_d_l_e f3( f1._i_d_x()+2 ); │ │ │ │ +191 set_face_indices( f3, to_vertex_handle(hh).idx() ); │ │ │ │ +192 │ │ │ │ +193 set_face_types ( _fh, GL_TRIANGLES ); │ │ │ │ +194 set_face_lengths( _fh, 3 ); │ │ │ │ +195 │ │ │ │ +196 return true; │ │ │ │ +197 } │ │ │ │ +198 │ │ │ │ +199 bool osg_sync( _F_a_c_e_H_a_n_d_l_e _fh, GenProg::Bool2Type ) │ │ │ │ +200 { │ │ │ │ +201 return false; │ │ │ │ +202 } │ │ │ │ +203 │ │ │ │ +204}; │ │ │ │ +205 │ │ │ │ +206 │ │ │ │ +207template │ │ │ │ +208void │ │ │ │ +209_A_r_r_a_y_K_e_r_n_e_l_T_<_A_t_t_r_i_b_K_e_r_n_e_l_,_ _F_i_n_a_l_M_e_s_h_I_t_e_m_s_>_:_: │ │ │ │ +210_g_a_r_b_a_g_e___c_o_l_l_e_c_t_i_o_n(bool _v, bool _e, bool _f) │ │ │ │ +211{ │ │ │ │ +212 Base::garbage_collection(_v, _e, _f); │ │ │ │ +213 for (size_t fidx=0; fidx < n_faces(); ++fidx) │ │ │ │ +214 osg_sync( _F_a_c_e_H_a_n_d_l_e(fidx) ); │ │ │ │ +215} │ │ │ │ +216 │ │ │ │ +217// │ │ │ │ ============================================================================= │ │ │ │ -172} // namespace IO │ │ │ │ -173} // namespace OpenMesh │ │ │ │ -174// │ │ │ │ +218} // namespace Kernel_OSG │ │ │ │ +219} // namespace OpenMesh │ │ │ │ +220// │ │ │ │ ============================================================================= │ │ │ │ -175#endif │ │ │ │ -176// │ │ │ │ +221#endif // OPENMESH_ARRAY_KERNEL_HH defined │ │ │ │ +222// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_____O_M_R_e_a_d_e_r_I_n_s_t_a_n_c_e │ │ │ │ -_OMReader_ __OMReaderInstance │ │ │ │ -Declare the single entity of the OM reader. │ │ │ │ -DDeeffiinniittiioonn OMReader.cc:75 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ -Base class for importer modules. │ │ │ │ -DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_R_e_a_d_e_r │ │ │ │ -Base class for reader modules. │ │ │ │ -DDeeffiinniittiioonn BaseReader.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_M_R_e_a_d_e_r__ │ │ │ │ -Implementation of the OM format reader. │ │ │ │ -DDeeffiinniittiioonn OMReader.hh:86 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_M_R_e_a_d_e_r___:_:_g_e_t___m_a_g_i_c │ │ │ │ -std::string get_magic() const override │ │ │ │ -Return magic bits used to determine file format. │ │ │ │ -DDeeffiinniittiioonn OMReader.hh:94 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_M_R_e_a_d_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Returns a string with the accepted file extensions separated by a whitespace │ │ │ │ -and in small caps. │ │ │ │ -DDeeffiinniittiioonn OMReader.hh:93 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_M_R_e_a_d_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Returns a brief description of the file type that can be parsed. │ │ │ │ -DDeeffiinniittiioonn OMReader.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_P_r_o_p_e_r_t_y │ │ │ │ -Abstract class defining the basic interface of a dynamic property. │ │ │ │ -DDeeffiinniittiioonn BaseProperty.hh:61 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ +bool is_valid() const │ │ │ │ +The handle is valid iff the index is not negative. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ +int idx() const │ │ │ │ +Get the underlying index of this handle. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_K_e_r_n_e_l___O_S_G_:_:_A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Mesh kernel using arrays for mesh item storage. │ │ │ │ +DDeeffiinniittiioonn ArrayKernelT.hh:94 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00578_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/IOInstances.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/gen/iterators_header.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
IOInstances.hh
│ │ │ +
iterators_header.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,83 +138,53 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper file for static builds
│ │ │ +
44#ifndef OPENMESH_ITERATORS_HH
│ │ │ +
45#define OPENMESH_ITERATORS_HH
│ │ │ +
46
│ │ │ +
47//=============================================================================
│ │ │
48//
│ │ │ -
49// In opposite to dynamic builds where the instance of every reader module
│ │ │ -
50// is generated within the OpenMesh library, static builds only instanciate
│ │ │ -
51// objects that are at least referenced once. As all reader modules are
│ │ │ -
52// never used directly, they will not be part of a static build, hence
│ │ │ -
53// this file.
│ │ │ -
54//
│ │ │ -
55//=============================================================================
│ │ │ +
49// Iterators for PolyMesh/TriMesh
│ │ │ +
50//
│ │ │ +
51//=============================================================================
│ │ │ +
52
│ │ │ +
53
│ │ │ +
54
│ │ │ +
55//== INCLUDES =================================================================
│ │ │
56
│ │ │ -
57
│ │ │ -
58#ifndef __IOINSTANCES_HH__
│ │ │ -
59#define __IOINSTANCES_HH__
│ │ │ +
57#include <OpenMesh/Core/System/config.h>
│ │ │ +
58#include <OpenMesh/Core/Attributes/Status.hh>
│ │ │ +
59#include <cassert>
│ │ │
60
│ │ │ -
61#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN)
│ │ │ -
62
│ │ │ -
63//=============================================================================
│ │ │ -
64
│ │ │ -
65#include <OpenMesh/Core/System/config.h>
│ │ │ +
61
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │ +
63
│ │ │ +
64namespace OpenMesh {
│ │ │ +
65namespace Iterators {
│ │ │
66
│ │ │ -
67#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ -
68#include <OpenMesh/Core/IO/reader/OBJReader.hh>
│ │ │ -
69#include <OpenMesh/Core/IO/reader/OFFReader.hh>
│ │ │ -
70#include <OpenMesh/Core/IO/reader/PLYReader.hh>
│ │ │ -
71#include <OpenMesh/Core/IO/reader/STLReader.hh>
│ │ │ -
72#include <OpenMesh/Core/IO/reader/OMReader.hh>
│ │ │ -
73
│ │ │ -
74#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ -
75#include <OpenMesh/Core/IO/writer/OBJWriter.hh>
│ │ │ -
76#include <OpenMesh/Core/IO/writer/OFFWriter.hh>
│ │ │ -
77#include <OpenMesh/Core/IO/writer/STLWriter.hh>
│ │ │ -
78#include <OpenMesh/Core/IO/writer/OMWriter.hh>
│ │ │ -
79#include <OpenMesh/Core/IO/writer/PLYWriter.hh>
│ │ │ -
80#include <OpenMesh/Core/IO/writer/VTKWriter.hh>
│ │ │ +
67
│ │ │ +
68//== FORWARD DECLARATIONS =====================================================
│ │ │ +
69
│ │ │ +
70
│ │ │ +
71template <class Mesh> class VertexIterT;
│ │ │ +
72template <class Mesh> class ConstVertexIterT;
│ │ │ +
73template <class Mesh> class HalfedgeIterT;
│ │ │ +
74template <class Mesh> class ConstHalfedgeIterT;
│ │ │ +
75template <class Mesh> class EdgeIterT;
│ │ │ +
76template <class Mesh> class ConstEdgeIterT;
│ │ │ +
77template <class Mesh> class FaceIterT;
│ │ │ +
78template <class Mesh> class ConstFaceIterT;
│ │ │ +
79
│ │ │ +
80
│ │ │
81
│ │ │ -
82//=== NAMESPACES ==============================================================
│ │ │ -
83
│ │ │ -
84namespace OpenMesh {
│ │ │ -
85namespace IO {
│ │ │ -
86
│ │ │ -
87//=============================================================================
│ │ │ -
88
│ │ │ -
89
│ │ │ -
90// Instanciate every Reader module
│ │ │ -
91static BaseReader* OFFReaderInstance = &OFFReader();
│ │ │ -
92static BaseReader* OBJReaderInstance = &OBJReader();
│ │ │ -
93static BaseReader* PLYReaderInstance = &PLYReader();
│ │ │ -
94static BaseReader* STLReaderInstance = &STLReader();
│ │ │ -
95static BaseReader* OMReaderInstance = &OMReader();
│ │ │ -
96
│ │ │ -
97// Instanciate every writer module
│ │ │ -
98static BaseWriter* OBJWriterInstance = &OBJWriter();
│ │ │ -
99static BaseWriter* OFFWriterInstance = &OFFWriter();
│ │ │ -
100static BaseWriter* STLWriterInstance = &STLWriter();
│ │ │ -
101static BaseWriter* OMWriterInstance = &OMWriter();
│ │ │ -
102static BaseWriter* PLYWriterInstance = &PLYWriter();
│ │ │ -
103static BaseWriter* VTKWriterInstance = &VTKWriter();
│ │ │ -
104
│ │ │ -
105
│ │ │ -
106//=============================================================================
│ │ │ -
107} // namespace IO
│ │ │ -
108} // namespace OpenMesh
│ │ │ -
109//=============================================================================
│ │ │ -
110#endif // static ?
│ │ │ -
111#endif //__IOINSTANCES_HH__
│ │ │ -
112//=============================================================================
│ │ │ +
82
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -IOInstances.hh │ │ │ │ +iterators_header.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,91 +47,58 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ +44#ifndef OPENMESH_ITERATORS_HH │ │ │ │ +45#define OPENMESH_ITERATORS_HH │ │ │ │ +46 │ │ │ │ +47// │ │ │ │ ============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper file for static builds │ │ │ │ 48// │ │ │ │ -49// In opposite to dynamic builds where the instance of every reader module │ │ │ │ -50// is generated within the OpenMesh library, static builds only instanciate │ │ │ │ -51// objects that are at least referenced once. As all reader modules are │ │ │ │ -52// never used directly, they will not be part of a static build, hence │ │ │ │ -53// this file. │ │ │ │ -54// │ │ │ │ -55// │ │ │ │ -============================================================================= │ │ │ │ +49// Iterators for PolyMesh/TriMesh │ │ │ │ +50// │ │ │ │ +51// │ │ │ │ +============================================================================= │ │ │ │ +52 │ │ │ │ +53 │ │ │ │ +54 │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 56 │ │ │ │ -57 │ │ │ │ -58#ifndef __IOINSTANCES_HH__ │ │ │ │ -59#define __IOINSTANCES_HH__ │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59#include │ │ │ │ 60 │ │ │ │ -61#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN) │ │ │ │ -62 │ │ │ │ -63// │ │ │ │ -============================================================================= │ │ │ │ -64 │ │ │ │ -65#include │ │ │ │ +61 │ │ │ │ +62//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +63 │ │ │ │ +64namespace _O_p_e_n_M_e_s_h { │ │ │ │ +65namespace Iterators { │ │ │ │ 66 │ │ │ │ -67#include │ │ │ │ -68#include │ │ │ │ -69#include │ │ │ │ -70#include │ │ │ │ -71#include │ │ │ │ -72#include │ │ │ │ -73 │ │ │ │ -74#include │ │ │ │ -75#include │ │ │ │ -76#include │ │ │ │ -77#include │ │ │ │ -78#include │ │ │ │ -79#include │ │ │ │ -80#include │ │ │ │ +67 │ │ │ │ +68//== FORWARD DECLARATIONS │ │ │ │ +===================================================== │ │ │ │ +69 │ │ │ │ +70 │ │ │ │ +71template class VertexIterT; │ │ │ │ +72template class ConstVertexIterT; │ │ │ │ +73template class HalfedgeIterT; │ │ │ │ +74template class ConstHalfedgeIterT; │ │ │ │ +75template class EdgeIterT; │ │ │ │ +76template class ConstEdgeIterT; │ │ │ │ +77template class FaceIterT; │ │ │ │ +78template class ConstFaceIterT; │ │ │ │ +79 │ │ │ │ +80 │ │ │ │ 81 │ │ │ │ -82//=== NAMESPACES │ │ │ │ -============================================================== │ │ │ │ -83 │ │ │ │ -84namespace _O_p_e_n_M_e_s_h { │ │ │ │ -85namespace IO { │ │ │ │ -86 │ │ │ │ -87// │ │ │ │ -============================================================================= │ │ │ │ -88 │ │ │ │ -89 │ │ │ │ -90// Instanciate every Reader module │ │ │ │ -91static BaseReader* OFFReaderInstance = &OFFReader(); │ │ │ │ -92static BaseReader* OBJReaderInstance = &OBJReader(); │ │ │ │ -93static BaseReader* PLYReaderInstance = &PLYReader(); │ │ │ │ -94static BaseReader* STLReaderInstance = &STLReader(); │ │ │ │ -95static BaseReader* OMReaderInstance = &OMReader(); │ │ │ │ -96 │ │ │ │ -97// Instanciate every writer module │ │ │ │ -98static BaseWriter* OBJWriterInstance = &OBJWriter(); │ │ │ │ -99static BaseWriter* OFFWriterInstance = &OFFWriter(); │ │ │ │ -100static BaseWriter* STLWriterInstance = &STLWriter(); │ │ │ │ -101static BaseWriter* OMWriterInstance = &OMWriter(); │ │ │ │ -102static BaseWriter* PLYWriterInstance = &PLYWriter(); │ │ │ │ -103static BaseWriter* VTKWriterInstance = &VTKWriter(); │ │ │ │ -104 │ │ │ │ -105 │ │ │ │ -106// │ │ │ │ -============================================================================= │ │ │ │ -107} // namespace IO │ │ │ │ -108} // namespace OpenMesh │ │ │ │ -109// │ │ │ │ -============================================================================= │ │ │ │ -110#endif // static ? │ │ │ │ -111#endif //__IOINSTANCES_HH__ │ │ │ │ -112// │ │ │ │ -============================================================================= │ │ │ │ +82 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00584_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/StoreRestore.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/gen/iterators_template.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,167 +92,194 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
StoreRestore.hh
│ │ │ +
iterators_template.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ -
2 * *
│ │ │ -
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ -
5 * Department of Computer Graphics and Multimedia *
│ │ │ -
6 * All rights reserved. *
│ │ │ -
7 * www.openmesh.org *
│ │ │ -
8 * *
│ │ │ -
9 *---------------------------------------------------------------------------*
│ │ │ -
10 * This file is part of OpenMesh. *
│ │ │ -
11 *---------------------------------------------------------------------------*
│ │ │ -
12 * *
│ │ │ -
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ -
14 * modification, are permitted provided that the following conditions *
│ │ │ -
15 * are met: *
│ │ │ -
16 * *
│ │ │ -
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ -
18 * this list of conditions and the following disclaimer. *
│ │ │ -
19 * *
│ │ │ -
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ -
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ -
22 * documentation and/or other materials provided with the distribution. *
│ │ │ -
23 * *
│ │ │ -
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ -
25 * contributors may be used to endorse or promote products derived from *
│ │ │ -
26 * this software without specific prior written permission. *
│ │ │ -
27 * *
│ │ │ -
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ -
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ -
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ -
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ -
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ -
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ -
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ -
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ -
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ -
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ -
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ -
39 * *
│ │ │ -
40 * ========================================================================= */
│ │ │ -
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51#ifndef OPENMESH_STORERESTORE_HH
│ │ │ -
52#define OPENMESH_STORERESTORE_HH
│ │ │ +
1//== CLASS DEFINITION =========================================================
│ │ │ +
2
│ │ │ +
3
│ │ │ +
8template <class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
10{
│ │ │ +
11public:
│ │ │ +
12
│ │ │ +
13
│ │ │ +
14 //--- Typedefs ---
│ │ │ +
15
│ │ │ +
16 typedef TargetType value_type;
│ │ │ +
17 typedef TargetHandle value_handle;
│ │ │ +
18
│ │ │ +
19#if IsConst
│ │ │ +
20 typedef const value_type& reference;
│ │ │ +
21 typedef const value_type* pointer;
│ │ │ +
22 typedef const Mesh* mesh_ptr;
│ │ │ +
23 typedef const Mesh& mesh_ref;
│ │ │ +
24#else
│ │ │ +
25 typedef value_type& reference;
│ │ │ +
26 typedef value_type* pointer;
│ │ │ +
27 typedef Mesh* mesh_ptr;
│ │ │ +
28 typedef Mesh& mesh_ref;
│ │ │ +
29#endif
│ │ │ +
30
│ │ │ +
31
│ │ │ +
32
│ │ │ +
33
│ │ │ +
│ │ │ + │ │ │ +
36 : mesh_(0), skip_bits_(0)
│ │ │ +
37 {}
│ │ │ +
│ │ │ +
38
│ │ │ +
39
│ │ │ +
│ │ │ +
41 IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)
│ │ │ +
42 : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0)
│ │ │ +
43 {
│ │ │ +
44 if (_skip) enable_skipping();
│ │ │ +
45 }
│ │ │ +
│ │ │ +
46
│ │ │ +
47
│ │ │ +
│ │ │ +
49 IteratorT(const IteratorT& _rhs)
│ │ │ +
50 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_)
│ │ │ +
51 {}
│ │ │ +
│ │ │ +
52
│ │ │
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ -
56
│ │ │ -
57#include <stdexcept>
│ │ │ -
58#include <OpenMesh/Core/System/config.h>
│ │ │ -
59#include <OpenMesh/Core/IO/SR_binary.hh>
│ │ │ -
60#include <OpenMesh/Core/IO/SR_binary_spec.hh>
│ │ │ -
61
│ │ │ -
62//== NAMESPACES ===============================================================
│ │ │ +
│ │ │ + │ │ │ +
56 {
│ │ │ +
57 mesh_ = _rhs.mesh_;
│ │ │ +
58 hnd_ = _rhs.hnd_;
│ │ │ +
59 skip_bits_ = _rhs.skip_bits_;
│ │ │ +
60 return *this;
│ │ │ +
61 }
│ │ │ +
│ │ │ +
62
│ │ │
63
│ │ │ -
64namespace OpenMesh {
│ │ │ -
65namespace IO {
│ │ │ -
66
│ │ │ -
67
│ │ │ -
68//=============================================================================
│ │ │ -
69
│ │ │ -
70
│ │ │ -
75
│ │ │ -
76
│ │ │ -
77//-----------------------------------------------------------------------------
│ │ │ -
78// StoreRestore definitions
│ │ │ -
79
│ │ │ -
80template <typename T> inline
│ │ │ -
│ │ │ -
81bool is_streamable(void)
│ │ │ - │ │ │ -
│ │ │ -
83
│ │ │ -
84template <typename T> inline
│ │ │ -
│ │ │ -
85bool is_streamable( const T& )
│ │ │ - │ │ │ -
│ │ │ -
87
│ │ │ -
88template <typename T> inline
│ │ │ -
│ │ │ -
89size_t size_of( const T& _v )
│ │ │ -
90{ return binary< T >::size_of(_v); }
│ │ │ -
│ │ │ -
91
│ │ │ -
92template <typename T> inline
│ │ │ -
│ │ │ -
93size_t size_of( const std::vector<T> & _v, bool _store_size = true)
│ │ │ -
94{ return binary< std::vector<T> >::size_of(_v, _store_size); }
│ │ │ -
│ │ │ -
95
│ │ │ -
96template <typename T> inline
│ │ │ -
│ │ │ -
97size_t size_of(void)
│ │ │ -
98{ return binary< T >::size_of(); }
│ │ │ -
│ │ │ -
99
│ │ │ -
100template <typename T> inline
│ │ │ -
│ │ │ -
101size_t size_of(bool _store_size)
│ │ │ -
102{ return binary< std::vector<T> >::size_of(_store_size); }
│ │ │ -
│ │ │ -
103
│ │ │ -
104template <typename T> inline
│ │ │ -
│ │ │ -
105size_t store( std::ostream& _os, const T& _v, bool _swap =false)
│ │ │ -
106{ return binary< T >::store( _os, _v, _swap ); }
│ │ │ -
│ │ │ -
107
│ │ │ -
108template <typename T> inline
│ │ │ -
│ │ │ -
109size_t store( std::ostream& _os, const std::vector<T>& _v, bool _swap=false, bool _store_size = true)
│ │ │ -
110{ return binary< std::vector<T> >::store( _os, _v, _swap, _store_size); }
│ │ │ -
│ │ │ -
111
│ │ │ -
112template <typename T> inline
│ │ │ -
│ │ │ -
113size_t restore( std::istream& _is, T& _v, bool _swap = false)
│ │ │ -
114{ return binary< T >::restore( _is, _v, _swap ); }
│ │ │ -
│ │ │ -
115
│ │ │ -
116template <typename T> inline
│ │ │ -
│ │ │ -
117size_t restore( std::istream& _is, std::vector<T>& _v, bool _swap=false, bool _restore_size = true)
│ │ │ -
118{ return binary< std::vector<T> >::restore( _is, _v, _swap, _restore_size); }
│ │ │ -
│ │ │ -
119
│ │ │ -
121
│ │ │ -
122
│ │ │ -
123//=============================================================================
│ │ │ -
124} // namespace IO
│ │ │ -
125} // namespace OpenMesh
│ │ │ -
126//=============================================================================
│ │ │ -
127#endif // OPENMESH_MESHREADER_HH defined
│ │ │ -
128//=============================================================================
│ │ │ -
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
size_t size_of(void)
Binary read a short from _is and perform byte swapping if _swap is true.
Definition StoreRestore.hh:97
│ │ │ -
bool is_streamable(void)
Binary read a short from _is and perform byte swapping if _swap is true.
Definition StoreRestore.hh:81
│ │ │ -
The struct defines how to store and restore the type T.
Definition SR_binary.hh:97
│ │ │ -
static size_t restore(std::istream &, value_type &, bool=false, bool=true)
Restore a value of T and return the number of bytes read.
Definition SR_binary.hh:125
│ │ │ -
static size_t store(std::ostream &, const value_type &, bool=false, bool=true)
Store a value of T and return the number of bytes written.
Definition SR_binary.hh:113
│ │ │ -
static size_t size_of(void)
What's the size of T? If it depends on the actual value (e.g. for vectors) return UnknownSize.
Definition SR_binary.hh:104
│ │ │ +
64#if IsConst
│ │ │ +
65
│ │ │ +
67 IteratorT(const NonConstIterT<Mesh>& _rhs)
│ │ │ +
68 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_)
│ │ │ +
69 {}
│ │ │ +
70
│ │ │ +
71
│ │ │ +
73 IteratorT& operator=(const NonConstIterT<Mesh>& _rhs)
│ │ │ +
74 {
│ │ │ +
75 mesh_ = _rhs.mesh_;
│ │ │ +
76 hnd_ = _rhs.hnd_;
│ │ │ +
77 skip_bits_ = _rhs.skip_bits_;
│ │ │ +
78 return *this;
│ │ │ +
79 }
│ │ │ +
80
│ │ │ +
81#else
│ │ │ +
82 friend class ConstIterT<Mesh>;
│ │ │ +
83#endif
│ │ │ +
84
│ │ │ +
85
│ │ │ +
87 reference operator*() const { return mesh_->deref(hnd_); }
│ │ │ +
88
│ │ │ +
90 pointer operator->() const { return &(mesh_->deref(hnd_)); }
│ │ │ +
91
│ │ │ +
93 value_handle handle() const { return hnd_; }
│ │ │ +
94
│ │ │ +
96 operator value_handle() const { return hnd_; }
│ │ │ +
97
│ │ │ +
│ │ │ +
99 bool operator==(const IteratorT& _rhs) const
│ │ │ +
100 { return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_)); }
│ │ │ +
│ │ │ +
101
│ │ │ +
│ │ │ +
103 bool operator!=(const IteratorT& _rhs) const
│ │ │ +
104 { return !operator==(_rhs); }
│ │ │ +
│ │ │ +
105
│ │ │ +
│ │ │ + │ │ │ +
108 { hnd_.__increment(); if (skip_bits_) skip_fwd(); return *this; }
│ │ │ +
│ │ │ +
109
│ │ │ +
│ │ │ + │ │ │ +
112 { hnd_.__decrement(); if (skip_bits_) skip_bwd(); return *this; }
│ │ │ +
│ │ │ +
113
│ │ │ +
114
│ │ │ +
│ │ │ + │ │ │ +
117 {
│ │ │ +
118 if (mesh_ && mesh_->has_element_status())
│ │ │ +
119 {
│ │ │ +
120 Attributes::StatusInfo status;
│ │ │ +
121 status.set_deleted(true);
│ │ │ +
122 status.set_hidden(true);
│ │ │ +
123 skip_bits_ = status.bits();
│ │ │ +
124 skip_fwd();
│ │ │ +
125 }
│ │ │ +
126 else skip_bits_ = 0;
│ │ │ +
127 }
│ │ │ +
│ │ │ +
128
│ │ │ +
129
│ │ │ +
131 void disable_skipping() { skip_bits_ = 0; }
│ │ │ +
132
│ │ │ +
133
│ │ │ +
134
│ │ │ +
135private:
│ │ │ +
136
│ │ │ +
137 void skip_fwd()
│ │ │ +
138 {
│ │ │ +
139 assert(mesh_ && skip_bits_);
│ │ │ +
140 while ((hnd_.idx() < (signed) mesh_->n_elements()) &&
│ │ │ +
141 (mesh_->status(hnd_).bits() & skip_bits_))
│ │ │ +
142 hnd_.__increment();
│ │ │ +
143 }
│ │ │ +
144
│ │ │ +
145
│ │ │ +
146 void skip_bwd()
│ │ │ +
147 {
│ │ │ +
148 assert(mesh_ && skip_bits_);
│ │ │ +
149 while ((hnd_.idx() >= 0) &&
│ │ │ +
150 (mesh_->status(hnd_).bits() & skip_bits_))
│ │ │ +
151 hnd_.__decrement();
│ │ │ +
152 }
│ │ │ +
153
│ │ │ +
154
│ │ │ +
155
│ │ │ +
156private:
│ │ │ +
157 mesh_ptr mesh_;
│ │ │ +
158 value_handle hnd_;
│ │ │ +
159 unsigned int skip_bits_;
│ │ │ +
160};
│ │ │ +
│ │ │ +
161
│ │ │ +
162
│ │ │ +
Linear iterator.
Definition iterators_template.hh:10
│ │ │ +
bool operator!=(const IteratorT &_rhs) const
Not equal?
Definition iterators_template.hh:103
│ │ │ +
IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)
Construct with mesh and a target handle.
Definition iterators_template.hh:41
│ │ │ +
IteratorT & operator=(const IteratorT< Mesh > &_rhs)
Assignment operator.
Definition iterators_template.hh:55
│ │ │ +
IteratorT()
Default constructor.
Definition iterators_template.hh:35
│ │ │ +
void disable_skipping()
Turn on skipping: automatically skip deleted/hidden elements.
Definition iterators_template.hh:131
│ │ │ +
IteratorT & operator++()
Standard pre-increment operator.
Definition iterators_template.hh:107
│ │ │ +
IteratorT & operator--()
Standard pre-decrement operator.
Definition iterators_template.hh:111
│ │ │ +
bool operator==(const IteratorT &_rhs) const
Are two iterators equal? Only valid if they refer to the same mesh!
Definition iterators_template.hh:99
│ │ │ +
IteratorT(const IteratorT &_rhs)
Copy constructor.
Definition iterators_template.hh:49
│ │ │ +
reference operator*() const
Standard dereferencing operator.
Definition iterators_template.hh:87
│ │ │ +
value_handle handle() const
Get the handle of the item the iterator refers to.
Definition iterators_template.hh:93
│ │ │ +
void enable_skipping()
Turn on skipping: automatically skip deleted/hidden elements.
Definition iterators_template.hh:116
│ │ │ +
pointer operator->() const
Standard pointer operator.
Definition iterators_template.hh:90
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,176 +1,209 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -StoreRestore.hh │ │ │ │ -1/* ========================================================================= * │ │ │ │ -2 * * │ │ │ │ -3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ -5 * Department of Computer Graphics and Multimedia * │ │ │ │ -6 * All rights reserved. * │ │ │ │ -7 * www.openmesh.org * │ │ │ │ -8 * * │ │ │ │ -9 *---------------------------------------------------------------------------* │ │ │ │ -10 * This file is part of OpenMesh. * │ │ │ │ -11 *--------------------------------------------------------------------------- │ │ │ │ -* │ │ │ │ -12 * * │ │ │ │ -13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ -14 * modification, are permitted provided that the following conditions * │ │ │ │ -15 * are met: * │ │ │ │ -16 * * │ │ │ │ -17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ -* │ │ │ │ -18 * this list of conditions and the following disclaimer. * │ │ │ │ -19 * * │ │ │ │ -20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ -21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ -22 * documentation and/or other materials provided with the distribution. * │ │ │ │ -23 * * │ │ │ │ -24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ -25 * contributors may be used to endorse or promote products derived from * │ │ │ │ -26 * this software without specific prior written permission. * │ │ │ │ -27 * * │ │ │ │ -28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ -29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ -* │ │ │ │ -30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ -31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ -* │ │ │ │ -32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ -33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ -34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ -35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ -36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ -37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ -38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ -39 * * │ │ │ │ -40 * ========================================================================= │ │ │ │ -*/ │ │ │ │ -41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_STORERESTORE_HH │ │ │ │ -52#define OPENMESH_STORERESTORE_HH │ │ │ │ +iterators_template.hh │ │ │ │ +1//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +2 │ │ │ │ +3 │ │ │ │ +8template │ │ │ │ +_9class _I_t_e_r_a_t_o_r_T │ │ │ │ +10{ │ │ │ │ +11public: │ │ │ │ +12 │ │ │ │ +13 │ │ │ │ +14 //--- Typedefs --- │ │ │ │ +15 │ │ │ │ +16 typedef TargetType value_type; │ │ │ │ +17 typedef TargetHandle value_handle; │ │ │ │ +18 │ │ │ │ +19#if IsConst │ │ │ │ +20 typedef const value_type& reference; │ │ │ │ +21 typedef const value_type* pointer; │ │ │ │ +22 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ +23 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ +24#else │ │ │ │ +25 typedef value_type& reference; │ │ │ │ +26 typedef value_type* pointer; │ │ │ │ +27 typedef _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ +28 typedef _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ +29#endif │ │ │ │ +30 │ │ │ │ +31 │ │ │ │ +32 │ │ │ │ +33 │ │ │ │ +_3_5 _I_t_e_r_a_t_o_r_T() │ │ │ │ +36 : mesh_(0), skip_bits_(0) │ │ │ │ +37 {} │ │ │ │ +38 │ │ │ │ +39 │ │ │ │ +_4_1 _I_t_e_r_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, value_handle _hnd, bool _skip=false) │ │ │ │ +42 : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0) │ │ │ │ +43 { │ │ │ │ +44 if (_skip) _e_n_a_b_l_e___s_k_i_p_p_i_n_g(); │ │ │ │ +45 } │ │ │ │ +46 │ │ │ │ +47 │ │ │ │ +_4_9 _I_t_e_r_a_t_o_r_T(const _I_t_e_r_a_t_o_r_T& _rhs) │ │ │ │ +50 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_) │ │ │ │ +51 {} │ │ │ │ +52 │ │ │ │ 53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61 │ │ │ │ -62//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ +_5_5 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const _I_t_e_r_a_t_o_r_T_<_M_e_s_h_>& _rhs) │ │ │ │ +56 { │ │ │ │ +57 mesh_ = _rhs.mesh_; │ │ │ │ +58 hnd_ = _rhs.hnd_; │ │ │ │ +59 skip_bits_ = _rhs.skip_bits_; │ │ │ │ +60 return *this; │ │ │ │ +61 } │ │ │ │ +62 │ │ │ │ 63 │ │ │ │ -64namespace _O_p_e_n_M_e_s_h { │ │ │ │ -65namespace IO { │ │ │ │ -66 │ │ │ │ -67 │ │ │ │ -68// │ │ │ │ -============================================================================= │ │ │ │ -69 │ │ │ │ +64#if IsConst │ │ │ │ +65 │ │ │ │ +67 _I_t_e_r_a_t_o_r_T(const NonConstIterT& _rhs) │ │ │ │ +68 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_) │ │ │ │ +69 {} │ │ │ │ 70 │ │ │ │ -75 │ │ │ │ -76 │ │ │ │ -77//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -78// StoreRestore definitions │ │ │ │ -79 │ │ │ │ -80template inline │ │ │ │ -_8_1bool _i_s___s_t_r_e_a_m_a_b_l_e(void) │ │ │ │ -82{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_i_s___s_t_r_e_a_m_a_b_l_e; } │ │ │ │ -83 │ │ │ │ -84template inline │ │ │ │ -_8_5bool _i_s___s_t_r_e_a_m_a_b_l_e( const T& ) │ │ │ │ -86{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_i_s___s_t_r_e_a_m_a_b_l_e; } │ │ │ │ -87 │ │ │ │ -88template inline │ │ │ │ -_8_9size_t _s_i_z_e___o_f( const T& _v ) │ │ │ │ -90{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_s_i_z_e___o_f(_v); } │ │ │ │ +71 │ │ │ │ +73 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const NonConstIterT& _rhs) │ │ │ │ +74 { │ │ │ │ +75 mesh_ = _rhs.mesh_; │ │ │ │ +76 hnd_ = _rhs.hnd_; │ │ │ │ +77 skip_bits_ = _rhs.skip_bits_; │ │ │ │ +78 return *this; │ │ │ │ +79 } │ │ │ │ +80 │ │ │ │ +81#else │ │ │ │ +82 friend class ConstIterT; │ │ │ │ +83#endif │ │ │ │ +84 │ │ │ │ +85 │ │ │ │ +_8_7 reference _o_p_e_r_a_t_o_r_*() const { return mesh_->deref(hnd_); } │ │ │ │ +88 │ │ │ │ +_9_0 pointer _o_p_e_r_a_t_o_r_-_>() const { return &(mesh_->deref(hnd_)); } │ │ │ │ 91 │ │ │ │ -92template inline │ │ │ │ -_9_3size_t _s_i_z_e___o_f( const std::vector & _v, bool _store_size = true) │ │ │ │ -94{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >_:_:_s_i_z_e___o_f(_v, _store_size); } │ │ │ │ -95 │ │ │ │ -96template inline │ │ │ │ -_9_7size_t _s_i_z_e___o_f(void) │ │ │ │ -98{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_s_i_z_e___o_f(); } │ │ │ │ -99 │ │ │ │ -100template inline │ │ │ │ -_1_0_1size_t _s_i_z_e___o_f(bool _store_size) │ │ │ │ -102{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >_:_:_s_i_z_e___o_f(_store_size); } │ │ │ │ -103 │ │ │ │ -104template inline │ │ │ │ -_1_0_5size_t store( std::ostream& _os, const T& _v, bool _swap =false) │ │ │ │ -106{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_s_t_o_r_e( _os, _v, _swap ); } │ │ │ │ -107 │ │ │ │ -108template inline │ │ │ │ -_1_0_9size_t store( std::ostream& _os, const std::vector& _v, bool _swap=false, │ │ │ │ -bool _store_size = true) │ │ │ │ -110{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >::store( _os, _v, _swap, _store_size); } │ │ │ │ -111 │ │ │ │ -112template inline │ │ │ │ -_1_1_3size_t restore( std::istream& _is, T& _v, bool _swap = false) │ │ │ │ -114{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_r_e_s_t_o_r_e( _is, _v, _swap ); } │ │ │ │ -115 │ │ │ │ -116template inline │ │ │ │ -_1_1_7size_t restore( std::istream& _is, std::vector& _v, bool _swap=false, │ │ │ │ -bool _restore_size = true) │ │ │ │ -118{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >::restore( _is, _v, _swap, _restore_size); │ │ │ │ -} │ │ │ │ -119 │ │ │ │ -121 │ │ │ │ -122 │ │ │ │ -123// │ │ │ │ -============================================================================= │ │ │ │ -124} // namespace IO │ │ │ │ -125} // namespace OpenMesh │ │ │ │ -126// │ │ │ │ -============================================================================= │ │ │ │ -127#endif // OPENMESH_MESHREADER_HH defined │ │ │ │ -128// │ │ │ │ -============================================================================= │ │ │ │ -_O_p_e_n_M_e_s_h │ │ │ │ -Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ -different mesh kernels ... │ │ │ │ -DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_s_i_z_e___o_f │ │ │ │ -size_t size_of(void) │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn StoreRestore.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_s___s_t_r_e_a_m_a_b_l_e │ │ │ │ -bool is_streamable(void) │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn StoreRestore.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y │ │ │ │ -The struct defines how to store and restore the type T. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_r_e_s_t_o_r_e │ │ │ │ -static size_t restore(std::istream &, value_type &, bool=false, bool=true) │ │ │ │ -Restore a value of T and return the number of bytes read. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:125 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_t_o_r_e │ │ │ │ -static size_t store(std::ostream &, const value_type &, bool=false, bool=true) │ │ │ │ -Store a value of T and return the number of bytes written. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:113 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_i_z_e___o_f │ │ │ │ -static size_t size_of(void) │ │ │ │ -What's the size of T? If it depends on the actual value (e.g. for vectors) │ │ │ │ -return UnknownSize. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:104 │ │ │ │ +_9_3 value_handle _h_a_n_d_l_e() const { return hnd_; } │ │ │ │ +94 │ │ │ │ +_9_6 operator value_handle() const { return hnd_; } │ │ │ │ +97 │ │ │ │ +_9_9 bool _o_p_e_r_a_t_o_r_=_=(const _I_t_e_r_a_t_o_r_T& _rhs) const │ │ │ │ +100 { return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_)); } │ │ │ │ +101 │ │ │ │ +_1_0_3 bool _o_p_e_r_a_t_o_r_!_=(const _I_t_e_r_a_t_o_r_T& _rhs) const │ │ │ │ +104 { return !_o_p_e_r_a_t_o_r_=_=(_rhs); } │ │ │ │ +105 │ │ │ │ +_1_0_7 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ +108 { hnd_.__increment(); if (skip_bits_) skip_fwd(); return *this; } │ │ │ │ +109 │ │ │ │ +_1_1_1 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ +112 { hnd_.__decrement(); if (skip_bits_) skip_bwd(); return *this; } │ │ │ │ +113 │ │ │ │ +114 │ │ │ │ +_1_1_6 void _e_n_a_b_l_e___s_k_i_p_p_i_n_g() │ │ │ │ +117 { │ │ │ │ +118 if (mesh_ && mesh_->has_element_status()) │ │ │ │ +119 { │ │ │ │ +120 Attributes::StatusInfo status; │ │ │ │ +121 status.set_deleted(true); │ │ │ │ +122 status.set_hidden(true); │ │ │ │ +123 skip_bits_ = status.bits(); │ │ │ │ +124 skip_fwd(); │ │ │ │ +125 } │ │ │ │ +126 else skip_bits_ = 0; │ │ │ │ +127 } │ │ │ │ +128 │ │ │ │ +129 │ │ │ │ +_1_3_1 void _d_i_s_a_b_l_e___s_k_i_p_p_i_n_g() { skip_bits_ = 0; } │ │ │ │ +132 │ │ │ │ +133 │ │ │ │ +134 │ │ │ │ +135private: │ │ │ │ +136 │ │ │ │ +137 void skip_fwd() │ │ │ │ +138 { │ │ │ │ +139 assert(mesh_ && skip_bits_); │ │ │ │ +140 while ((hnd_.idx() < (signed) mesh_->n_elements()) && │ │ │ │ +141 (mesh_->status(hnd_).bits() & skip_bits_)) │ │ │ │ +142 hnd_.__increment(); │ │ │ │ +143 } │ │ │ │ +144 │ │ │ │ +145 │ │ │ │ +146 void skip_bwd() │ │ │ │ +147 { │ │ │ │ +148 assert(mesh_ && skip_bits_); │ │ │ │ +149 while ((hnd_.idx() >= 0) && │ │ │ │ +150 (mesh_->status(hnd_).bits() & skip_bits_)) │ │ │ │ +151 hnd_.__decrement(); │ │ │ │ +152 } │ │ │ │ +153 │ │ │ │ +154 │ │ │ │ +155 │ │ │ │ +156private: │ │ │ │ +157 mesh_ptr mesh_; │ │ │ │ +158 value_handle hnd_; │ │ │ │ +159 unsigned int skip_bits_; │ │ │ │ +160}; │ │ │ │ +161 │ │ │ │ +162 │ │ │ │ +_I_t_e_r_a_t_o_r_T │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:10 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ +bool operator!=(const IteratorT &_rhs) const │ │ │ │ +Not equal? │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:103 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_I_t_e_r_a_t_o_r_T │ │ │ │ +IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false) │ │ │ │ +Construct with mesh and a target handle. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:41 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ +IteratorT & operator=(const IteratorT< Mesh > &_rhs) │ │ │ │ +Assignment operator. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:55 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_I_t_e_r_a_t_o_r_T │ │ │ │ +IteratorT() │ │ │ │ +Default constructor. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:35 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_d_i_s_a_b_l_e___s_k_i_p_p_i_n_g │ │ │ │ +void disable_skipping() │ │ │ │ +Turn on skipping: automatically skip deleted/hidden elements. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:131 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ +IteratorT & operator++() │ │ │ │ +Standard pre-increment operator. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:107 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ +IteratorT & operator--() │ │ │ │ +Standard pre-decrement operator. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:111 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +bool operator==(const IteratorT &_rhs) const │ │ │ │ +Are two iterators equal? Only valid if they refer to the same mesh! │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:99 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_I_t_e_r_a_t_o_r_T │ │ │ │ +IteratorT(const IteratorT &_rhs) │ │ │ │ +Copy constructor. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:49 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +reference operator*() const │ │ │ │ +Standard dereferencing operator. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:87 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_h_a_n_d_l_e │ │ │ │ +value_handle handle() const │ │ │ │ +Get the handle of the item the iterator refers to. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:93 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_e_n_a_b_l_e___s_k_i_p_p_i_n_g │ │ │ │ +void enable_skipping() │ │ │ │ +Turn on skipping: automatically skip deleted/hidden elements. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:116 │ │ │ │ +_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ +pointer operator->() const │ │ │ │ +Standard pointer operator. │ │ │ │ +DDeeffiinniittiioonn iterators_template.hh:90 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00587_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/SR_rbo.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/gen/circulators_template.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,293 +92,224 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SR_rbo.hh
│ │ │ +
circulators_template.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ -
2 * *
│ │ │ -
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ -
5 * Department of Computer Graphics and Multimedia *
│ │ │ -
6 * All rights reserved. *
│ │ │ -
7 * www.openmesh.org *
│ │ │ -
8 * *
│ │ │ -
9 *---------------------------------------------------------------------------*
│ │ │ -
10 * This file is part of OpenMesh. *
│ │ │ -
11 *---------------------------------------------------------------------------*
│ │ │ -
12 * *
│ │ │ -
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ -
14 * modification, are permitted provided that the following conditions *
│ │ │ -
15 * are met: *
│ │ │ -
16 * *
│ │ │ -
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ -
18 * this list of conditions and the following disclaimer. *
│ │ │ -
19 * *
│ │ │ -
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ -
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ -
22 * documentation and/or other materials provided with the distribution. *
│ │ │ -
23 * *
│ │ │ -
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ -
25 * contributors may be used to endorse or promote products derived from *
│ │ │ -
26 * this software without specific prior written permission. *
│ │ │ -
27 * *
│ │ │ -
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ -
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ -
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ -
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ -
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ -
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ -
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ -
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ -
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ -
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ -
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ -
39 * *
│ │ │ -
40 * ========================================================================= */
│ │ │ -
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51#ifndef OPENMESH_SR_RBO_HH
│ │ │ -
52#define OPENMESH_SR_RBO_HH
│ │ │ -
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
1//== CLASS DEFINITION =========================================================
│ │ │ +
2
│ │ │ +
3
│ │ │ +
8template <class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
10{
│ │ │ +
11 public:
│ │ │ +
12
│ │ │ +
13
│ │ │ +
14 //--- Typedefs ---
│ │ │ +
15
│ │ │ +
16 typedef typename Mesh::HalfedgeHandle HalfedgeHandle;
│ │ │ +
17
│ │ │ +
18 typedef TargetType value_type;
│ │ │ +
19 typedef TargetHandle value_handle;
│ │ │ +
20
│ │ │ +
21#if IsConst
│ │ │ +
22 typedef const Mesh& mesh_ref;
│ │ │ +
23 typedef const Mesh* mesh_ptr;
│ │ │ +
24 typedef const TargetType& reference;
│ │ │ +
25 typedef const TargetType* pointer;
│ │ │ +
26#else
│ │ │ +
27 typedef Mesh& mesh_ref;
│ │ │ +
28 typedef Mesh* mesh_ptr;
│ │ │ +
29 typedef TargetType& reference;
│ │ │ +
30 typedef TargetType* pointer;
│ │ │ +
31#endif
│ │ │ +
32
│ │ │ +
33
│ │ │ +
34
│ │ │ +
36 CirculatorT() : mesh_(0), active_(false) {}
│ │ │ +
37
│ │ │ +
38
│ │ │ +
│ │ │ +
40 CirculatorT(mesh_ref _mesh, SourceHandle _start) :
│ │ │ +
41 mesh_(&_mesh),
│ │ │ +
42 start_(_mesh.halfedge_handle(_start)),
│ │ │ +
43 heh_(start_),
│ │ │ +
44 active_(false)
│ │ │ +
45 { post_init; }
│ │ │ +
│ │ │ +
46
│ │ │ +
47
│ │ │ +
│ │ │ +
49 CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh) :
│ │ │ +
50 mesh_(&_mesh),
│ │ │ +
51 start_(_heh),
│ │ │ +
52 heh_(_heh),
│ │ │ +
53 active_(false)
│ │ │ +
54 { post_init; }
│ │ │ +
│ │ │ +
55
│ │ │
56
│ │ │ -
57#include <OpenMesh/Core/System/config.h>
│ │ │ -
58// -------------------- STL
│ │ │ -
59#if defined(OM_CC_MIPS)
│ │ │ -
60# include <stdio.h> // size_t
│ │ │ -
61#else
│ │ │ -
62# include <cstdio> // size_t
│ │ │ -
63#endif
│ │ │ -
64#include <algorithm>
│ │ │ -
65#include <typeinfo>
│ │ │ -
66// -------------------- OpenMesh
│ │ │ - │ │ │ -
68#include <OpenMesh/Core/IO/SR_types.hh>
│ │ │ -
69#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
70
│ │ │ -
71//== NAMESPACES ===============================================================
│ │ │ -
72
│ │ │ -
73namespace OpenMesh {
│ │ │ -
74namespace IO {
│ │ │ +
│ │ │ +
58 CirculatorT(const CirculatorT& _rhs) :
│ │ │ +
59 mesh_(_rhs.mesh_),
│ │ │ +
60 start_(_rhs.start_),
│ │ │ +
61 heh_(_rhs.heh_),
│ │ │ +
62 active_(_rhs.active_)
│ │ │ +
63 { post_init; }
│ │ │ +
│ │ │ +
64
│ │ │ +
65
│ │ │ +
│ │ │ + │ │ │ +
68 {
│ │ │ +
69 mesh_ = _rhs.mesh_;
│ │ │ +
70 start_ = _rhs.start_;
│ │ │ +
71 heh_ = _rhs.heh_;
│ │ │ +
72 active_ = _rhs.active_;
│ │ │ +
73 return *this;
│ │ │ +
74 }
│ │ │ +
│ │ │
75
│ │ │
76
│ │ │ -
77//=============================================================================
│ │ │ -
78
│ │ │ -
79
│ │ │ -
84
│ │ │ +
77#if IsConst
│ │ │ +
79 CirculatorT(const NonConstCircT<Mesh>& _rhs) :
│ │ │ +
80 mesh_(_rhs.mesh_),
│ │ │ +
81 start_(_rhs.start_),
│ │ │ +
82 heh_(_rhs.heh_),
│ │ │ +
83 active_(_rhs.active_)
│ │ │ +
84 { post_init; }
│ │ │
85
│ │ │ -
86//-----------------------------------------------------------------------------
│ │ │ -
87
│ │ │ -
91template < size_t N > inline
│ │ │ - │ │ │ -
93
│ │ │ -
94template <> inline
│ │ │ - │ │ │ -
96
│ │ │ -
97
│ │ │ -
98template <> inline
│ │ │ -
│ │ │ - │ │ │ -
100{
│ │ │ -
101 _val[0] ^= _val[1]; _val[1] ^= _val[0]; _val[0] ^= _val[1];
│ │ │ -
102}
│ │ │ -
│ │ │ -
103
│ │ │ -
104
│ │ │ -
105template <> inline
│ │ │ -
│ │ │ - │ │ │ -
107{
│ │ │ -
108 _val[0] ^= _val[3]; _val[3] ^= _val[0]; _val[0] ^= _val[3]; // 0 <-> 3
│ │ │ -
109 _val[1] ^= _val[2]; _val[2] ^= _val[1]; _val[1] ^= _val[2]; // 1 <-> 2
│ │ │ -
110}
│ │ │ -
│ │ │ -
111
│ │ │ -
112
│ │ │ -
113template <> inline
│ │ │ -
│ │ │ - │ │ │ -
115{
│ │ │ -
116 _val[0] ^= _val[7]; _val[7] ^= _val[0]; _val[0] ^= _val[7]; // 0 <-> 7
│ │ │ -
117 _val[1] ^= _val[6]; _val[6] ^= _val[1]; _val[1] ^= _val[6]; // 1 <-> 6
│ │ │ -
118 _val[2] ^= _val[5]; _val[5] ^= _val[2]; _val[2] ^= _val[5]; // 2 <-> 5
│ │ │ -
119 _val[3] ^= _val[4]; _val[4] ^= _val[3]; _val[3] ^= _val[4]; // 3 <-> 4
│ │ │ -
120}
│ │ │ -
│ │ │ -
121
│ │ │ -
122
│ │ │ -
123template <> inline
│ │ │ -
│ │ │ - │ │ │ -
125{
│ │ │ -
126 _val[0] ^= _val[11]; _val[11] ^= _val[0]; _val[0] ^= _val[11]; // 0 <-> 11
│ │ │ -
127 _val[1] ^= _val[10]; _val[10] ^= _val[1]; _val[1] ^= _val[10]; // 1 <-> 10
│ │ │ -
128 _val[2] ^= _val[ 9]; _val[ 9] ^= _val[2]; _val[2] ^= _val[ 9]; // 2 <-> 9
│ │ │ -
129 _val[3] ^= _val[ 8]; _val[ 8] ^= _val[3]; _val[3] ^= _val[ 8]; // 3 <-> 8
│ │ │ -
130 _val[4] ^= _val[ 7]; _val[ 7] ^= _val[4]; _val[4] ^= _val[ 7]; // 4 <-> 7
│ │ │ -
131 _val[5] ^= _val[ 6]; _val[ 6] ^= _val[5]; _val[5] ^= _val[ 6]; // 5 <-> 6
│ │ │ -
132}
│ │ │ +
86
│ │ │ +
88 CirculatorT& operator=(const NonConstCircT<Mesh>& _rhs)
│ │ │ +
89 {
│ │ │ +
90 mesh_ = _rhs.mesh_;
│ │ │ +
91 start_ = _rhs.start_;
│ │ │ +
92 heh_ = _rhs.heh_;
│ │ │ +
93 active_ = _rhs.active_;
│ │ │ +
94 return *this;
│ │ │ +
95 }
│ │ │ +
96#else
│ │ │ +
97 friend class ConstCircT<Mesh>;
│ │ │ +
98#endif
│ │ │ +
99
│ │ │ +
100
│ │ │ +
│ │ │ +
102 bool operator==(const CirculatorT& _rhs) const {
│ │ │ +
103 return ((mesh_ == _rhs.mesh_) &&
│ │ │ +
104 (start_ == _rhs.start_) &&
│ │ │ +
105 (heh_ == _rhs.heh_) &&
│ │ │ +
106 (active_ == _rhs.active_));
│ │ │ +
107 }
│ │ │ +
│ │ │ +
108
│ │ │ +
109
│ │ │ +
│ │ │ +
111 bool operator!=(const CirculatorT& _rhs) const {
│ │ │ +
112 return !operator==(_rhs);
│ │ │ +
113 }
│ │ │ +
│ │ │ +
114
│ │ │ +
115
│ │ │ +
│ │ │ + │ │ │ +
118 assert(mesh_);
│ │ │ +
119 active_ = true;
│ │ │ +
120 increment;
│ │ │ +
121 return *this;
│ │ │ +
122 }
│ │ │ +
│ │ │ +
123
│ │ │ +
124
│ │ │ +
│ │ │ + │ │ │ +
127 assert(mesh_);
│ │ │ +
128 active_ = true;
│ │ │ +
129 decrement;
│ │ │ +
130 return *this;
│ │ │ +
131 }
│ │ │
│ │ │ +
132
│ │ │
133
│ │ │ -
134
│ │ │ -
135template <> inline
│ │ │ -
│ │ │ - │ │ │ -
137{
│ │ │ - │ │ │ - │ │ │ -
140 std::swap(*(uint64_t*)_val, *(((uint64_t*)_val)+1));
│ │ │ -
141}
│ │ │ +
│ │ │ +
138 HalfedgeHandle current_halfedge_handle() const {
│ │ │ +
139 return heh_;
│ │ │ +
140 }
│ │ │
│ │ │ +
141
│ │ │
142
│ │ │ -
143
│ │ │ -
144//-----------------------------------------------------------------------------
│ │ │ -
145// wrapper for byte reordering
│ │ │ -
146
│ │ │ -
147// reverting pointers makes no sense, hence forbid it.
│ │ │ -
150template <typename T> inline T* reverse_byte_order(T* t);
│ │ │ -
151// Should never reach this point. If so, then some operator were not
│ │ │ -
152// overloaded. Especially check for IO::binary<> specialization on
│ │ │ -
153// custom data types.
│ │ │ -
154
│ │ │ -
155
│ │ │ -
│ │ │ - │ │ │ -
157{
│ │ │ -
158 // we should never reach this point
│ │ │ -
159 assert(false);
│ │ │ -
160}
│ │ │ -
│ │ │ -
161
│ │ │ -
162// default action for byte reversal: cause an error to avoid
│ │ │ -
163// surprising behaviour!
│ │ │ -
│ │ │ -
164template <typename T> T& reverse_byte_order( T& _t )
│ │ │ -
165{
│ │ │ -
166 omerr() << "Not defined for type " << typeid(T).name() << std::endl;
│ │ │ - │ │ │ -
168 return _t;
│ │ │ -
169}
│ │ │ +
│ │ │ +
144 TargetHandle handle() const {
│ │ │ +
145 assert(mesh_);
│ │ │ +
146 return get_handle;
│ │ │ +
147 }
│ │ │ +
│ │ │ +
148
│ │ │ +
149
│ │ │ +
│ │ │ +
151 operator TargetHandle() const {
│ │ │ +
152 assert(mesh_);
│ │ │ +
153 return get_handle;
│ │ │ +
154 }
│ │ │ +
│ │ │ +
155
│ │ │ +
156
│ │ │ +
│ │ │ +
158 reference operator*() const {
│ │ │ +
159 assert(mesh_);
│ │ │ +
160 return mesh_->deref(handle());
│ │ │ +
161 }
│ │ │ +
│ │ │ +
162
│ │ │ +
163
│ │ │ +
│ │ │ +
165 pointer operator->() const {
│ │ │ +
166 assert(mesh_);
│ │ │ +
167 return &mesh_->deref(handle());
│ │ │ +
168 }
│ │ │
│ │ │ +
169
│ │ │
170
│ │ │ -
171template <> inline bool& reverse_byte_order(bool & _t) { return _t; }
│ │ │ -
172template <> inline char& reverse_byte_order(char & _t) { return _t; }
│ │ │ -
173#if defined(OM_CC_GCC)
│ │ │ -
174template <> inline signed char& reverse_byte_order(signed char & _t) { return _t; }
│ │ │ -
175#endif
│ │ │ -
176template <> inline uchar& reverse_byte_order(uchar& _t) { return _t; }
│ │ │ -
177
│ │ │ -
178// Instead do specializations for the necessary types
│ │ │ -
179#define REVERSE_FUNDAMENTAL_TYPE( T ) \
│ │ │ -
180 template <> inline T& reverse_byte_order( T& _t ) {\
│ │ │ -
181 _reverse_byte_order_N<sizeof(T)>( reinterpret_cast<uint8_t*>(&_t) ); \
│ │ │ -
182 return _t; \
│ │ │ -
183 }
│ │ │ -
184
│ │ │ -
185// REVERSE_FUNDAMENTAL_TYPE(bool)
│ │ │ -
186// REVERSE_FUNDAMENTAL_TYPE(char)
│ │ │ -
187// REVERSE_FUNDAMENTAL_TYPE(uchar)
│ │ │ -
188REVERSE_FUNDAMENTAL_TYPE(int16_t)
│ │ │ -
189REVERSE_FUNDAMENTAL_TYPE(uint16_t)
│ │ │ -
190// REVERSE_FUNDAMENTAL_TYPE(int)
│ │ │ -
191// REVERSE_FUNDAMENTAL_TYPE(uint)
│ │ │ -
192
│ │ │ -
193REVERSE_FUNDAMENTAL_TYPE(unsigned long)
│ │ │ -
194REVERSE_FUNDAMENTAL_TYPE(int32_t)
│ │ │ -
195REVERSE_FUNDAMENTAL_TYPE(uint32_t)
│ │ │ -
196REVERSE_FUNDAMENTAL_TYPE(int64_t)
│ │ │ -
197REVERSE_FUNDAMENTAL_TYPE(uint64_t)
│ │ │ -
198REVERSE_FUNDAMENTAL_TYPE(float)
│ │ │ -
199REVERSE_FUNDAMENTAL_TYPE(double)
│ │ │ -
200REVERSE_FUNDAMENTAL_TYPE(long double)
│ │ │ -
201
│ │ │ -
202#undef REVERSE_FUNDAMENTAL_TYPE
│ │ │ -
203
│ │ │ -
204#if 0
│ │ │ -
205
│ │ │ -
206#define REVERSE_VECTORT_TYPE( T ) \
│ │ │ -
207 template <> inline T& reverse_byte_order(T& _v) {\
│ │ │ -
208 for (size_t i; i< T::size_; ++i) \
│ │ │ -
209 _reverse_byte_order_N< sizeof(T::value_type) >( reinterpret_cast<uint8_t*>(&_v[i])); \
│ │ │ -
210 return _v; \
│ │ │ -
211 }
│ │ │ -
212
│ │ │ -
213#define REVERSE_VECTORT_TYPES( N ) \
│ │ │ -
214 REVERSE_VECTORT_TYPE( Vec##N##c ) \
│ │ │ -
215 REVERSE_VECTORT_TYPE( Vec##N##uc ) \
│ │ │ -
216 REVERSE_VECTORT_TYPE( Vec##N##s ) \
│ │ │ -
217 REVERSE_VECTORT_TYPE( Vec##N##us ) \
│ │ │ -
218 REVERSE_VECTORT_TYPE( Vec##N##i ) \
│ │ │ -
219 REVERSE_VECTORT_TYPE( Vec##N##ui ) \
│ │ │ -
220 REVERSE_VECTORT_TYPE( Vec##N##f ) \
│ │ │ -
221 REVERSE_VECTORT_TYPE( Vec##N##d ) \
│ │ │ -
222
│ │ │ -
223REVERSE_VECTORT_TYPES(1)
│ │ │ -
224REVERSE_VECTORT_TYPES(2)
│ │ │ -
225REVERSE_VECTORT_TYPES(3)
│ │ │ -
226REVERSE_VECTORT_TYPES(4)
│ │ │ -
227REVERSE_VECTORT_TYPES(6)
│ │ │ -
228
│ │ │ -
229#undef REVERSE_VECTORT_TYPES
│ │ │ -
230#undef REVERSE_VECTORT_TYPE
│ │ │ -
231
│ │ │ -
232#endif
│ │ │ -
233
│ │ │ -
234template <typename T> inline
│ │ │ -
│ │ │ - │ │ │ -
236{
│ │ │ -
237 compile_timer_error__const_means_const(a);
│ │ │ -
238 return a;
│ │ │ -
239}
│ │ │ -
│ │ │ -
240
│ │ │ -
241
│ │ │ -
243
│ │ │ -
244
│ │ │ -
245//=============================================================================
│ │ │ -
246} // namespace IO
│ │ │ -
247} // namespace OpenMesh
│ │ │ -
248//=============================================================================
│ │ │ -
249#endif // OPENMESH_SR_RBO_HH defined
│ │ │ -
250//=============================================================================
│ │ │ -
251
│ │ │ -
This file provides the streams omlog, omout, and omerr.
│ │ │ -
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
T * reverse_byte_order(T *t)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
│ │ │ -
short int16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
void _reverse_byte_order_N< 16 >(uint8_t *_val)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:136
│ │ │ -
void compile_time_error__no_fundamental_type()
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:156
│ │ │ -
void _reverse_byte_order_N< 1 >(uint8_t *)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:95
│ │ │ -
void _reverse_byte_order_N< 8 >(uint8_t *_val)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:114
│ │ │ -
unsigned char uchar
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:76
│ │ │ -
void _reverse_byte_order_N< 12 >(uint8_t *_val)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:124
│ │ │ -
unsigned long long uint64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
unsigned int uint32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
void _reverse_byte_order_N(uint8_t *_val)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
│ │ │ -
void _reverse_byte_order_N< 4 >(uint8_t *_val)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:106
│ │ │ -
long long int64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ -
void _reverse_byte_order_N< 2 >(uint8_t *_val)
this does not compile for g++3.4 and higher, hence we comment the function body which will result in ...
Definition SR_rbo.hh:99
│ │ │ -
unsigned short uint16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ -
int int32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ -
unsigned char uint8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ +
│ │ │ +
177 operator bool() const {
│ │ │ +
178 return heh_.is_valid() && ((start_ != heh_) || (!active_));
│ │ │ +
179 }
│ │ │ +
│ │ │ +
180
│ │ │ +
181
│ │ │ +
182private:
│ │ │ +
183
│ │ │ +
184 mesh_ptr mesh_;
│ │ │ +
185 HalfedgeHandle start_, heh_;
│ │ │ +
186 bool active_;
│ │ │ +
187};
│ │ │ +
│ │ │ +
188
│ │ │ +
189
│ │ │ +
190
│ │ │ +
Circulator.
Definition circulators_template.hh:10
│ │ │ +
CirculatorT & operator++()
Pre-Increment (next cw target)
Definition circulators_template.hh:117
│ │ │ +
CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh)
Construct with mesh and start halfedge.
Definition circulators_template.hh:49
│ │ │ +
bool operator==(const CirculatorT &_rhs) const
Equal ?
Definition circulators_template.hh:102
│ │ │ +
reference operator*() const
Return a reference to the current target.
Definition circulators_template.hh:158
│ │ │ +
CirculatorT(const CirculatorT &_rhs)
Copy constructor.
Definition circulators_template.hh:58
│ │ │ +
CirculatorT()
Default constructor.
Definition circulators_template.hh:36
│ │ │ +
CirculatorT & operator--()
Pre-Decrement (next ccw target)
Definition circulators_template.hh:126
│ │ │ +
HalfedgeHandle current_halfedge_handle() const
Get the current halfedge.
Definition circulators_template.hh:138
│ │ │ +
TargetHandle handle() const
Return the handle of the current target.
Definition circulators_template.hh:144
│ │ │ +
pointer operator->() const
Return a pointer to the current target.
Definition circulators_template.hh:165
│ │ │ +
CirculatorT & operator=(const CirculatorT< Mesh > &_rhs)
Assignment operator.
Definition circulators_template.hh:67
│ │ │ +
CirculatorT(mesh_ref _mesh, SourceHandle _start)
Construct with mesh and a SourceHandle.
Definition circulators_template.hh:40
│ │ │ +
bool operator!=(const CirculatorT &_rhs) const
Not equal ?
Definition circulators_template.hh:111
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,347 +1,232 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SR_rbo.hh │ │ │ │ -1/* ========================================================================= * │ │ │ │ -2 * * │ │ │ │ -3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ -5 * Department of Computer Graphics and Multimedia * │ │ │ │ -6 * All rights reserved. * │ │ │ │ -7 * www.openmesh.org * │ │ │ │ -8 * * │ │ │ │ -9 *---------------------------------------------------------------------------* │ │ │ │ -10 * This file is part of OpenMesh. * │ │ │ │ -11 *--------------------------------------------------------------------------- │ │ │ │ -* │ │ │ │ -12 * * │ │ │ │ -13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ -14 * modification, are permitted provided that the following conditions * │ │ │ │ -15 * are met: * │ │ │ │ -16 * * │ │ │ │ -17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ -* │ │ │ │ -18 * this list of conditions and the following disclaimer. * │ │ │ │ -19 * * │ │ │ │ -20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ -21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ -22 * documentation and/or other materials provided with the distribution. * │ │ │ │ -23 * * │ │ │ │ -24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ -25 * contributors may be used to endorse or promote products derived from * │ │ │ │ -26 * this software without specific prior written permission. * │ │ │ │ -27 * * │ │ │ │ -28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ -29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ -* │ │ │ │ -30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ -31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ -* │ │ │ │ -32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ -33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ -34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ -35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ -36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ -37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ -38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ -39 * * │ │ │ │ -40 * ========================================================================= │ │ │ │ -*/ │ │ │ │ -41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_SR_RBO_HH │ │ │ │ -52#define OPENMESH_SR_RBO_HH │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +circulators_template.hh │ │ │ │ +1//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +2 │ │ │ │ +3 │ │ │ │ +8template │ │ │ │ +_9class _C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +10{ │ │ │ │ +11 public: │ │ │ │ +12 │ │ │ │ +13 │ │ │ │ +14 //--- Typedefs --- │ │ │ │ +15 │ │ │ │ +16 typedef typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e HalfedgeHandle; │ │ │ │ +17 │ │ │ │ +18 typedef TargetType value_type; │ │ │ │ +19 typedef TargetHandle value_handle; │ │ │ │ +20 │ │ │ │ +21#if IsConst │ │ │ │ +22 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ +23 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ +24 typedef const TargetType& reference; │ │ │ │ +25 typedef const TargetType* pointer; │ │ │ │ +26#else │ │ │ │ +27 typedef _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ +28 typedef _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ +29 typedef TargetType& reference; │ │ │ │ +30 typedef TargetType* pointer; │ │ │ │ +31#endif │ │ │ │ +32 │ │ │ │ +33 │ │ │ │ +34 │ │ │ │ +_3_6 _C_i_r_c_u_l_a_t_o_r_T() : mesh_(0), active_(false) {} │ │ │ │ +37 │ │ │ │ +38 │ │ │ │ +_4_0 _C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, SourceHandle _start) : │ │ │ │ +41 mesh_(&_mesh), │ │ │ │ +42 start_(_mesh.halfedge_handle(_start)), │ │ │ │ +43 heh_(start_), │ │ │ │ +44 active_(false) │ │ │ │ +45 { post_init; } │ │ │ │ +46 │ │ │ │ +47 │ │ │ │ +_4_9 _C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, HalfedgeHandle _heh) : │ │ │ │ +50 mesh_(&_mesh), │ │ │ │ +51 start_(_heh), │ │ │ │ +52 heh_(_heh), │ │ │ │ +53 active_(false) │ │ │ │ +54 { post_init; } │ │ │ │ +55 │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ -58// -------------------- STL │ │ │ │ -59#if defined(OM_CC_MIPS) │ │ │ │ -60# include // size_t │ │ │ │ -61#else │ │ │ │ -62# include // size_t │ │ │ │ -63#endif │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66// -------------------- OpenMesh │ │ │ │ -67#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ -68#include │ │ │ │ -69#include │ │ │ │ -70 │ │ │ │ -71//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -72 │ │ │ │ -73namespace _O_p_e_n_M_e_s_h { │ │ │ │ -74namespace IO { │ │ │ │ +_5_8 _C_i_r_c_u_l_a_t_o_r_T(const _C_i_r_c_u_l_a_t_o_r_T& _rhs) : │ │ │ │ +59 mesh_(_rhs.mesh_), │ │ │ │ +60 start_(_rhs.start_), │ │ │ │ +61 heh_(_rhs.heh_), │ │ │ │ +62 active_(_rhs.active_) │ │ │ │ +63 { post_init; } │ │ │ │ +64 │ │ │ │ +65 │ │ │ │ +_6_7 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const _C_i_r_c_u_l_a_t_o_r_T_<_M_e_s_h_>& _rhs) │ │ │ │ +68 { │ │ │ │ +69 mesh_ = _rhs.mesh_; │ │ │ │ +70 start_ = _rhs.start_; │ │ │ │ +71 heh_ = _rhs.heh_; │ │ │ │ +72 active_ = _rhs.active_; │ │ │ │ +73 return *this; │ │ │ │ +74 } │ │ │ │ 75 │ │ │ │ 76 │ │ │ │ -77// │ │ │ │ -============================================================================= │ │ │ │ -78 │ │ │ │ -79 │ │ │ │ -84 │ │ │ │ +77#if IsConst │ │ │ │ +79 _C_i_r_c_u_l_a_t_o_r_T(const NonConstCircT& _rhs) : │ │ │ │ +80 mesh_(_rhs.mesh_), │ │ │ │ +81 start_(_rhs.start_), │ │ │ │ +82 heh_(_rhs.heh_), │ │ │ │ +83 active_(_rhs.active_) │ │ │ │ +84 { post_init; } │ │ │ │ 85 │ │ │ │ -86//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -87 │ │ │ │ -91template < size_t N > inline │ │ │ │ -_9_2void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N(_u_i_n_t_8___t* _val); │ │ │ │ -93 │ │ │ │ -94template <> inline │ │ │ │ -_9_5void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_1_>(_u_i_n_t_8___t* /*_val*/) { } │ │ │ │ -96 │ │ │ │ -97 │ │ │ │ -98template <> inline │ │ │ │ -_9_9void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_2_>(_u_i_n_t_8___t* _val) │ │ │ │ -100{ │ │ │ │ -101 _val[0] ^= _val[1]; _val[1] ^= _val[0]; _val[0] ^= _val[1]; │ │ │ │ -102} │ │ │ │ -103 │ │ │ │ -104 │ │ │ │ -105template <> inline │ │ │ │ -_1_0_6void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_4_>(_u_i_n_t_8___t* _val) │ │ │ │ -107{ │ │ │ │ -108 _val[0] ^= _val[3]; _val[3] ^= _val[0]; _val[0] ^= _val[3]; // 0 <-> 3 │ │ │ │ -109 _val[1] ^= _val[2]; _val[2] ^= _val[1]; _val[1] ^= _val[2]; // 1 <-> 2 │ │ │ │ -110} │ │ │ │ -111 │ │ │ │ -112 │ │ │ │ -113template <> inline │ │ │ │ -_1_1_4void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_8_>(_u_i_n_t_8___t* _val) │ │ │ │ -115{ │ │ │ │ -116 _val[0] ^= _val[7]; _val[7] ^= _val[0]; _val[0] ^= _val[7]; // 0 <-> 7 │ │ │ │ -117 _val[1] ^= _val[6]; _val[6] ^= _val[1]; _val[1] ^= _val[6]; // 1 <-> 6 │ │ │ │ -118 _val[2] ^= _val[5]; _val[5] ^= _val[2]; _val[2] ^= _val[5]; // 2 <-> 5 │ │ │ │ -119 _val[3] ^= _val[4]; _val[4] ^= _val[3]; _val[3] ^= _val[4]; // 3 <-> 4 │ │ │ │ -120} │ │ │ │ -121 │ │ │ │ -122 │ │ │ │ -123template <> inline │ │ │ │ -_1_2_4void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_1_2_>(_u_i_n_t_8___t* _val) │ │ │ │ -125{ │ │ │ │ -126 _val[0] ^= _val[11]; _val[11] ^= _val[0]; _val[0] ^= _val[11]; // 0 <-> 11 │ │ │ │ -127 _val[1] ^= _val[10]; _val[10] ^= _val[1]; _val[1] ^= _val[10]; // 1 <-> 10 │ │ │ │ -128 _val[2] ^= _val[ 9]; _val[ 9] ^= _val[2]; _val[2] ^= _val[ 9]; // 2 <-> 9 │ │ │ │ -129 _val[3] ^= _val[ 8]; _val[ 8] ^= _val[3]; _val[3] ^= _val[ 8]; // 3 <-> 8 │ │ │ │ -130 _val[4] ^= _val[ 7]; _val[ 7] ^= _val[4]; _val[4] ^= _val[ 7]; // 4 <-> 7 │ │ │ │ -131 _val[5] ^= _val[ 6]; _val[ 6] ^= _val[5]; _val[5] ^= _val[ 6]; // 5 <-> 6 │ │ │ │ -132} │ │ │ │ +86 │ │ │ │ +88 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const NonConstCircT& _rhs) │ │ │ │ +89 { │ │ │ │ +90 mesh_ = _rhs.mesh_; │ │ │ │ +91 start_ = _rhs.start_; │ │ │ │ +92 heh_ = _rhs.heh_; │ │ │ │ +93 active_ = _rhs.active_; │ │ │ │ +94 return *this; │ │ │ │ +95 } │ │ │ │ +96#else │ │ │ │ +97 friend class ConstCircT; │ │ │ │ +98#endif │ │ │ │ +99 │ │ │ │ +100 │ │ │ │ +_1_0_2 bool _o_p_e_r_a_t_o_r_=_=(const _C_i_r_c_u_l_a_t_o_r_T& _rhs) const { │ │ │ │ +103 return ((mesh_ == _rhs.mesh_) && │ │ │ │ +104 (start_ == _rhs.start_) && │ │ │ │ +105 (heh_ == _rhs.heh_) && │ │ │ │ +106 (active_ == _rhs.active_)); │ │ │ │ +107 } │ │ │ │ +108 │ │ │ │ +109 │ │ │ │ +_1_1_1 bool _o_p_e_r_a_t_o_r_!_=(const _C_i_r_c_u_l_a_t_o_r_T& _rhs) const { │ │ │ │ +112 return !_o_p_e_r_a_t_o_r_=_=(_rhs); │ │ │ │ +113 } │ │ │ │ +114 │ │ │ │ +115 │ │ │ │ +_1_1_7 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_+_+() { │ │ │ │ +118 assert(mesh_); │ │ │ │ +119 active_ = true; │ │ │ │ +120 increment; │ │ │ │ +121 return *this; │ │ │ │ +122 } │ │ │ │ +123 │ │ │ │ +124 │ │ │ │ +_1_2_6 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_-_-() { │ │ │ │ +127 assert(mesh_); │ │ │ │ +128 active_ = true; │ │ │ │ +129 decrement; │ │ │ │ +130 return *this; │ │ │ │ +131 } │ │ │ │ +132 │ │ │ │ 133 │ │ │ │ -134 │ │ │ │ -135template <> inline │ │ │ │ -_1_3_6void ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_1_6_>(_u_i_n_t_8___t* _val) │ │ │ │ -137{ │ │ │ │ -138 ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_8_>(_val); │ │ │ │ -139 ___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_8_>(_val+8); │ │ │ │ -140 std::swap(*(_u_i_n_t_6_4___t*)_val, *(((_u_i_n_t_6_4___t*)_val)+1)); │ │ │ │ -141} │ │ │ │ +_1_3_8 HalfedgeHandle _c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e() const { │ │ │ │ +139 return heh_; │ │ │ │ +140 } │ │ │ │ +141 │ │ │ │ 142 │ │ │ │ -143 │ │ │ │ -144//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -145// wrapper for byte reordering │ │ │ │ -146 │ │ │ │ -147// reverting pointers makes no sense, hence forbid it. │ │ │ │ -_1_5_0template inline T* _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r(T* t); │ │ │ │ -151// Should never reach this point. If so, then some operator were not │ │ │ │ -152// overloaded. Especially check for IO::binary<> specialization on │ │ │ │ -153// custom data types. │ │ │ │ -154 │ │ │ │ +_1_4_4 TargetHandle _h_a_n_d_l_e() const { │ │ │ │ +145 assert(mesh_); │ │ │ │ +146 return get_handle; │ │ │ │ +147 } │ │ │ │ +148 │ │ │ │ +149 │ │ │ │ +_1_5_1 operator TargetHandle() const { │ │ │ │ +152 assert(mesh_); │ │ │ │ +153 return get_handle; │ │ │ │ +154 } │ │ │ │ 155 │ │ │ │ -_1_5_6inline void _c_o_m_p_i_l_e___t_i_m_e___e_r_r_o_r_____n_o___f_u_n_d_a_m_e_n_t_a_l___t_y_p_e() │ │ │ │ -157{ │ │ │ │ -158 // we should never reach this point │ │ │ │ -159 assert(false); │ │ │ │ -160} │ │ │ │ -161 │ │ │ │ -162// default action for byte reversal: cause an error to avoid │ │ │ │ -163// surprising behaviour! │ │ │ │ -_1_6_4template T& _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r( T& _t ) │ │ │ │ -165{ │ │ │ │ -166 omerr() << "Not defined for type " << typeid(T).name() << std::endl; │ │ │ │ -167 _c_o_m_p_i_l_e___t_i_m_e___e_r_r_o_r_____n_o___f_u_n_d_a_m_e_n_t_a_l___t_y_p_e(); │ │ │ │ -168 return _t; │ │ │ │ -169} │ │ │ │ +156 │ │ │ │ +_1_5_8 reference _o_p_e_r_a_t_o_r_*() const { │ │ │ │ +159 assert(mesh_); │ │ │ │ +160 return mesh_->deref(_h_a_n_d_l_e()); │ │ │ │ +161 } │ │ │ │ +162 │ │ │ │ +163 │ │ │ │ +_1_6_5 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ +166 assert(mesh_); │ │ │ │ +167 return &mesh_->deref(_h_a_n_d_l_e()); │ │ │ │ +168 } │ │ │ │ +169 │ │ │ │ 170 │ │ │ │ -_1_7_1template <> inline bool& _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r(bool & _t) { return _t; } │ │ │ │ -_1_7_2template <> inline char& _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r(char & _t) { return _t; } │ │ │ │ -173#if defined(OM_CC_GCC) │ │ │ │ -174template <> inline signed char& _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r(signed char & _t) │ │ │ │ -{ return _t; } │ │ │ │ -175#endif │ │ │ │ -_1_7_6template <> inline _u_c_h_a_r& _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r(_u_c_h_a_r& _t) { return _t; } │ │ │ │ -177 │ │ │ │ -178// Instead do specializations for the necessary types │ │ │ │ -179#define REVERSE_FUNDAMENTAL_TYPE( T ) \ │ │ │ │ -180 template <> inline T& reverse_byte_order( T& _t ) {\ │ │ │ │ -181 _reverse_byte_order_N( reinterpret_cast(&_t) ); \ │ │ │ │ -182 return _t; \ │ │ │ │ -183 } │ │ │ │ -184 │ │ │ │ -185// REVERSE_FUNDAMENTAL_TYPE(bool) │ │ │ │ -186// REVERSE_FUNDAMENTAL_TYPE(char) │ │ │ │ -187// REVERSE_FUNDAMENTAL_TYPE(uchar) │ │ │ │ -_1_8_8REVERSE_FUNDAMENTAL_TYPE(_i_n_t_1_6___t) │ │ │ │ -_1_8_9REVERSE_FUNDAMENTAL_TYPE(_u_i_n_t_1_6___t) │ │ │ │ -190// REVERSE_FUNDAMENTAL_TYPE(int) │ │ │ │ -191// REVERSE_FUNDAMENTAL_TYPE(uint) │ │ │ │ -192 │ │ │ │ -_1_9_3REVERSE_FUNDAMENTAL_TYPE(unsigned long) │ │ │ │ -_1_9_4REVERSE_FUNDAMENTAL_TYPE(_i_n_t_3_2___t) │ │ │ │ -_1_9_5REVERSE_FUNDAMENTAL_TYPE(_u_i_n_t_3_2___t) │ │ │ │ -_1_9_6REVERSE_FUNDAMENTAL_TYPE(_i_n_t_6_4___t) │ │ │ │ -_1_9_7REVERSE_FUNDAMENTAL_TYPE(_u_i_n_t_6_4___t) │ │ │ │ -_1_9_8REVERSE_FUNDAMENTAL_TYPE(float) │ │ │ │ -_1_9_9REVERSE_FUNDAMENTAL_TYPE(double) │ │ │ │ -_2_0_0REVERSE_FUNDAMENTAL_TYPE(long double) │ │ │ │ -201 │ │ │ │ -202#undef REVERSE_FUNDAMENTAL_TYPE │ │ │ │ -203 │ │ │ │ -204#if 0 │ │ │ │ -205 │ │ │ │ -206#define REVERSE_VECTORT_TYPE( T ) \ │ │ │ │ -207 template <> inline T& reverse_byte_order(T& _v) {\ │ │ │ │ -208 for (size_t i; i< T::size_; ++i) \ │ │ │ │ -209 _reverse_byte_order_N< sizeof(T::value_type) >( reinterpret_cast │ │ │ │ -(&_v[i])); \ │ │ │ │ -210 return _v; \ │ │ │ │ -211 } │ │ │ │ -212 │ │ │ │ -213#define REVERSE_VECTORT_TYPES( N ) \ │ │ │ │ -214 REVERSE_VECTORT_TYPE( Vec##N##c ) \ │ │ │ │ -215 REVERSE_VECTORT_TYPE( Vec##N##uc ) \ │ │ │ │ -216 REVERSE_VECTORT_TYPE( Vec##N##s ) \ │ │ │ │ -217 REVERSE_VECTORT_TYPE( Vec##N##us ) \ │ │ │ │ -218 REVERSE_VECTORT_TYPE( Vec##N##i ) \ │ │ │ │ -219 REVERSE_VECTORT_TYPE( Vec##N##ui ) \ │ │ │ │ -220 REVERSE_VECTORT_TYPE( Vec##N##f ) \ │ │ │ │ -221 REVERSE_VECTORT_TYPE( Vec##N##d ) \ │ │ │ │ -222 │ │ │ │ -223REVERSE_VECTORT_TYPES(1) │ │ │ │ -224REVERSE_VECTORT_TYPES(2) │ │ │ │ -225REVERSE_VECTORT_TYPES(3) │ │ │ │ -226REVERSE_VECTORT_TYPES(4) │ │ │ │ -227REVERSE_VECTORT_TYPES(6) │ │ │ │ -228 │ │ │ │ -229#undef REVERSE_VECTORT_TYPES │ │ │ │ -230#undef REVERSE_VECTORT_TYPE │ │ │ │ -231 │ │ │ │ -232#endif │ │ │ │ -233 │ │ │ │ -234template inline │ │ │ │ -_2_3_5T _r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r(const T& a) │ │ │ │ -236{ │ │ │ │ -237 compile_timer_error__const_means_const(a); │ │ │ │ -238 return a; │ │ │ │ -239} │ │ │ │ -240 │ │ │ │ -241 │ │ │ │ -243 │ │ │ │ -244 │ │ │ │ -245// │ │ │ │ -============================================================================= │ │ │ │ -246} // namespace IO │ │ │ │ -247} // namespace OpenMesh │ │ │ │ -248// │ │ │ │ -============================================================================= │ │ │ │ -249#endif // OPENMESH_SR_RBO_HH defined │ │ │ │ -250// │ │ │ │ -============================================================================= │ │ │ │ -251 │ │ │ │ -_o_m_s_t_r_e_a_m_._h_h │ │ │ │ -This file provides the streams omlog, omout, and omerr. │ │ │ │ -_O_p_e_n_M_e_s_h │ │ │ │ -Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ -different mesh kernels ... │ │ │ │ -DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r │ │ │ │ -T * reverse_byte_order(T *t) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_1_6___t │ │ │ │ -short int16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_ _1_6_ _> │ │ │ │ -void _reverse_byte_order_N< 16 >(uint8_t *_val) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_c_o_m_p_i_l_e___t_i_m_e___e_r_r_o_r_____n_o___f_u_n_d_a_m_e_n_t_a_l___t_y_p_e │ │ │ │ -void compile_time_error__no_fundamental_type() │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:156 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_ _1_ _> │ │ │ │ -void _reverse_byte_order_N< 1 >(uint8_t *) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_ _8_ _> │ │ │ │ -void _reverse_byte_order_N< 8 >(uint8_t *_val) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:114 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_c_h_a_r │ │ │ │ -unsigned char uchar │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:76 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_ _1_2_ _> │ │ │ │ -void _reverse_byte_order_N< 12 >(uint8_t *_val) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:124 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_6_4___t │ │ │ │ -unsigned long long uint64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_3_2___t │ │ │ │ -unsigned int uint32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N │ │ │ │ -void _reverse_byte_order_N(uint8_t *_val) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_ _4_ _> │ │ │ │ -void _reverse_byte_order_N< 4 >(uint8_t *_val) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:106 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_6_4___t │ │ │ │ -long long int64_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___r_e_v_e_r_s_e___b_y_t_e___o_r_d_e_r___N_<_ _2_ _> │ │ │ │ -void _reverse_byte_order_N< 2 >(uint8_t *_val) │ │ │ │ -this does not compile for g++3.4 and higher, hence we comment the function body │ │ │ │ -which will result in ... │ │ │ │ -DDeeffiinniittiioonn SR_rbo.hh:99 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_1_6___t │ │ │ │ -unsigned short uint16_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_3_2___t │ │ │ │ -int int32_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_8___t │ │ │ │ -unsigned char uint8_t │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ +_1_7_7 operator bool() const { │ │ │ │ +178 return heh_.is_valid() && ((start_ != heh_) || (!active_)); │ │ │ │ +179 } │ │ │ │ +180 │ │ │ │ +181 │ │ │ │ +182private: │ │ │ │ +183 │ │ │ │ +184 mesh_ptr mesh_; │ │ │ │ +185 HalfedgeHandle start_, heh_; │ │ │ │ +186 bool active_; │ │ │ │ +187}; │ │ │ │ +188 │ │ │ │ +189 │ │ │ │ +190 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:10 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ +CirculatorT & operator++() │ │ │ │ +Pre-Increment (next cw target) │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:117 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh) │ │ │ │ +Construct with mesh and start halfedge. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:49 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +bool operator==(const CirculatorT &_rhs) const │ │ │ │ +Equal ? │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:102 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +reference operator*() const │ │ │ │ +Return a reference to the current target. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:158 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +CirculatorT(const CirculatorT &_rhs) │ │ │ │ +Copy constructor. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:58 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +CirculatorT() │ │ │ │ +Default constructor. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:36 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ +CirculatorT & operator--() │ │ │ │ +Pre-Decrement (next ccw target) │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:126 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +HalfedgeHandle current_halfedge_handle() const │ │ │ │ +Get the current halfedge. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:138 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_h_a_n_d_l_e │ │ │ │ +TargetHandle handle() const │ │ │ │ +Return the handle of the current target. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:144 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ +pointer operator->() const │ │ │ │ +Return a pointer to the current target. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:165 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ +CirculatorT & operator=(const CirculatorT< Mesh > &_rhs) │ │ │ │ +Assignment operator. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:67 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +CirculatorT(mesh_ref _mesh, SourceHandle _start) │ │ │ │ +Construct with mesh and a SourceHandle. │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:40 │ │ │ │ +_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ +bool operator!=(const CirculatorT &_rhs) const │ │ │ │ +Not equal ? │ │ │ │ +DDeeffiinniittiioonn circulators_template.hh:111 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00590_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/MeshIO.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/CirculatorsT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │
│ │ │ -
MeshIO.hh
│ │ │ +
CirculatorsT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -137,162 +137,664 @@ │ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │ -
43
│ │ │ +
43#pragma once
│ │ │
44
│ │ │ -
45#ifndef OM_MESHIO_HH
│ │ │ -
46#define OM_MESHIO_HH
│ │ │ -
47
│ │ │ -
48
│ │ │ -
49//=== INCLUDES ================================================================
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Vertex, Face, and Edge circulators for PolyMesh/TriMesh
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │
50
│ │ │ -
51// -------------------- system settings
│ │ │ -
52#include <OpenMesh/Core/System/config.h>
│ │ │ -
53
│ │ │ -
54// -------------------- OpenMesh
│ │ │ -
55#include <OpenMesh/Core/IO/SR_store.hh>
│ │ │ -
56#include <OpenMesh/Core/IO/IOManager.hh>
│ │ │ -
57#include <OpenMesh/Core/IO/importer/ImporterT.hh>
│ │ │ -
58#include <OpenMesh/Core/IO/exporter/ExporterT.hh>
│ │ │ +
51
│ │ │ +
52
│ │ │ +
53//== INCLUDES =================================================================
│ │ │ +
54
│ │ │ +
55#include <OpenMesh/Core/System/config.h>
│ │ │ +
56#include <cassert>
│ │ │ +
57#include <cstddef>
│ │ │ +
58#include <iterator>
│ │ │
59
│ │ │ -
60
│ │ │ -
61//== NAMESPACES ==============================================================
│ │ │ -
62
│ │ │ -
63namespace OpenMesh {
│ │ │ -
64namespace IO {
│ │ │ +
60//== NAMESPACES ===============================================================
│ │ │ +
61
│ │ │ +
62namespace OpenMesh {
│ │ │ +
63
│ │ │ +
64template <typename> class CirculatorRange;
│ │ │
65
│ │ │ -
66
│ │ │ -
67//=== IMPLEMENTATION ==========================================================
│ │ │ -
68
│ │ │ -
69
│ │ │ -
75
│ │ │ -
76
│ │ │ -
77//-----------------------------------------------------------------------------
│ │ │ -
78
│ │ │ -
79
│ │ │ -
93template <class Mesh>
│ │ │ -
94bool
│ │ │ -
│ │ │ - │ │ │ -
96 const std::string& _filename)
│ │ │ -
97{
│ │ │ -
98 Options opt;
│ │ │ -
99 return read_mesh(_mesh, _filename, opt, true);
│ │ │ -
100}
│ │ │ -
│ │ │ -
101
│ │ │ -
102
│ │ │ -
123template <class Mesh>
│ │ │ -
124bool
│ │ │ -
│ │ │ - │ │ │ -
126 const std::string& _filename,
│ │ │ -
127 Options& _opt,
│ │ │ -
128 bool _clear = true)
│ │ │ -
129{
│ │ │ -
130 if (_clear) _mesh.clear();
│ │ │ -
131 ImporterT<Mesh> importer(_mesh);
│ │ │ -
132 return IOManager().read(_filename, importer, _opt);
│ │ │ -
133}
│ │ │ -
│ │ │ -
134
│ │ │ -
135
│ │ │ -
155template <class Mesh>
│ │ │ -
156bool
│ │ │ -
│ │ │ - │ │ │ -
158 std::istream& _is,
│ │ │ -
159 const std::string& _ext,
│ │ │ -
160 Options& _opt,
│ │ │ -
161 bool _clear = true)
│ │ │ -
162{
│ │ │ -
163 if (_clear) _mesh.clear();
│ │ │ -
164 ImporterT<Mesh> importer(_mesh);
│ │ │ -
165 return IOManager().read(_is,_ext, importer, _opt);
│ │ │ -
166}
│ │ │ -
│ │ │ -
167
│ │ │ -
168
│ │ │ -
169
│ │ │ -
170//-----------------------------------------------------------------------------
│ │ │ -
171
│ │ │ -
172
│ │ │ -
189template <class Mesh>
│ │ │ -
│ │ │ -
190bool write_mesh(const Mesh& _mesh,
│ │ │ -
191 const std::string& _filename,
│ │ │ - │ │ │ -
193 std::streamsize _precision = 6)
│ │ │ -
194{
│ │ │ -
195 ExporterT<Mesh> exporter(_mesh);
│ │ │ -
196 return IOManager().write(_filename, exporter, _opt, _precision);
│ │ │ -
197}
│ │ │ -
│ │ │ -
198
│ │ │ -
199
│ │ │ -
200//-----------------------------------------------------------------------------
│ │ │ -
201
│ │ │ -
202
│ │ │ -
221template <class Mesh>
│ │ │ -
│ │ │ -
222bool write_mesh(const Mesh& _mesh,
│ │ │ -
223 std::ostream& _os,
│ │ │ -
224 const std::string& _ext,
│ │ │ - │ │ │ -
226 std::streamsize _precision = 6)
│ │ │ -
227{
│ │ │ -
228 ExporterT<Mesh> exporter(_mesh);
│ │ │ -
229 return IOManager().write(_os,_ext, exporter, _opt, _precision);
│ │ │ -
230}
│ │ │ -
│ │ │ -
231
│ │ │ -
232
│ │ │ -
233//-----------------------------------------------------------------------------
│ │ │ -
234
│ │ │ -
250template <class Mesh>
│ │ │ -
│ │ │ -
251size_t binary_size(const Mesh& _mesh,
│ │ │ -
252 const std::string& _ext,
│ │ │ - │ │ │ -
254{
│ │ │ -
255 ExporterT<Mesh> exporter(_mesh);
│ │ │ -
256 return IOManager().binary_size(_ext, exporter, _opt);
│ │ │ -
257}
│ │ │ +
66namespace Iterators {
│ │ │ +
67
│ │ │ +
68template<class Mesh, class CenterEntityHandle, bool CW>
│ │ │ +
│ │ │ + │ │ │ +
70 public:
│ │ │ +
71 static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter);
│ │ │ +
72 static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter);
│ │ │ +
73};
│ │ │ +
│ │ │ +
74
│ │ │ +
75template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
77 public:
│ │ │ +
78 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
79 heh = mesh->cw_rotated_halfedge_handle(heh);
│ │ │ +
80 if (heh == start) ++lap_counter;
│ │ │ +
81 }
│ │ │ +
82 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
83 if (heh == start) --lap_counter;
│ │ │ +
84 heh = mesh->ccw_rotated_halfedge_handle(heh);
│ │ │ +
85 }
│ │ │ +
86};
│ │ │ +
│ │ │ +
87
│ │ │ +
88template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
90 public:
│ │ │ +
91 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
92 heh = mesh->next_halfedge_handle(heh);
│ │ │ +
93 if (heh == start) ++lap_counter;
│ │ │ +
94 }
│ │ │ +
95 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
96 if (heh == start) --lap_counter;
│ │ │ +
97 heh = mesh->prev_halfedge_handle(heh);
│ │ │ +
98 }
│ │ │ +
99};
│ │ │ +
│ │ │ +
100
│ │ │ +
101template<class Mesh, bool CW>
│ │ │ +
│ │ │ + │ │ │ +
103 public:
│ │ │ +
104 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
105 heh = mesh->opposite_halfedge_handle(heh);
│ │ │ +
106 if (heh == start) ++lap_counter;
│ │ │ +
107 }
│ │ │ +
108 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
109 if (heh == start) --lap_counter;
│ │ │ +
110 heh = mesh->opposite_halfedge_handle(heh);
│ │ │ +
111 }
│ │ │ +
112};
│ │ │ +
│ │ │ +
113
│ │ │ +
115// CCW
│ │ │ +
116
│ │ │ +
117template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
119 public:
│ │ │ +
120 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
121 heh = mesh->ccw_rotated_halfedge_handle(heh);
│ │ │ +
122 if (heh == start) ++lap_counter;
│ │ │ +
123 }
│ │ │ +
124 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
125 if (heh == start) --lap_counter;
│ │ │ +
126 heh = mesh->cw_rotated_halfedge_handle(heh);
│ │ │ +
127 }
│ │ │ +
128};
│ │ │ +
│ │ │ +
129
│ │ │ +
130template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
132 public:
│ │ │ +
133 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
134 heh = mesh->prev_halfedge_handle(heh);
│ │ │ +
135 if (heh == start) ++lap_counter;
│ │ │ +
136 }
│ │ │ +
137 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
138 if (heh == start) --lap_counter;
│ │ │ +
139 heh = mesh->next_halfedge_handle(heh);
│ │ │ +
140 }
│ │ │ +
141};
│ │ │ +
│ │ │ +
143
│ │ │ +
144template<class Mesh, class CenterEntityHandle, class ValueHandle>
│ │ │ +
│ │ │ + │ │ │ +
146 public:
│ │ │ +
147 //inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int &lap_counter);
│ │ │ +
148};
│ │ │ +
│ │ │ +
149
│ │ │ +
150template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
152 public:
│ │ │ +
153 inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {
│ │ │ +
154 return mesh->face_handle(mesh->opposite_halfedge_handle(heh)).is_valid();
│ │ │ +
155 }
│ │ │ +
156};
│ │ │ +
│ │ │ +
157
│ │ │ +
158template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
160 public:
│ │ │ +
161 inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {
│ │ │ +
162 return mesh->face_handle(heh).is_valid();
│ │ │ +
163 }
│ │ │ +
164};
│ │ │ +
│ │ │ +
165
│ │ │ +
166template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
168 public:
│ │ │ +
169 inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {
│ │ │ +
170 return mesh->face_handle(heh).is_valid();
│ │ │ +
171 }
│ │ │ +
172};
│ │ │ +
│ │ │ +
173
│ │ │ +
174template<class Mesh, class CenterEntityHandle, class ValueHandle, bool CW = true>
│ │ │ +
│ │ │ + │ │ │ +
176 public:
│ │ │ +
177 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) {
│ │ │ +
178 return ( heh.is_valid() && (lap_counter == 0 ) );
│ │ │ +
179 }
│ │ │ +
180 inline static void init(const Mesh* mesh, typename Mesh::HalfedgeHandle& heh, typename Mesh::HalfedgeHandle& start, int& lap_counter, bool adjust_for_ccw)
│ │ │ +
181 {
│ │ │ +
182 if (!CW) // TODO: constexpr if
│ │ │ +
183 {
│ │ │ +
184 if (adjust_for_ccw)
│ │ │ +
185 {
│ │ │ +
186 // increment current heh and start so that cw and ccw version dont start with the same element but ranges are actually reversed
│ │ │ +
187 int lc = lap_counter;
│ │ │ +
188 increment(mesh, heh, start, lap_counter);
│ │ │ +
189 start = heh;
│ │ │ +
190 lap_counter = lc;
│ │ │ +
191 }
│ │ │ +
192 }
│ │ │ +
193 }
│ │ │ +
194
│ │ │ +
195 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ + │ │ │ +
197 }
│ │ │ +
198 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ + │ │ │ +
200 }
│ │ │ +
201};
│ │ │
│ │ │ -
258
│ │ │ +
202
│ │ │ +
203template<class Mesh, class CenterEntityHandle, bool CW>
│ │ │ +
│ │ │ +
204class GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle, CW> {
│ │ │ +
205 public:
│ │ │ + │ │ │ +
207
│ │ │ +
208 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) {
│ │ │ +
209 return ( heh.is_valid() && (lap_counter == 0));
│ │ │ +
210 }
│ │ │ +
211 inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter, bool adjust_for_ccw)
│ │ │ +
212 {
│ │ │ +
213 if (!CW) // TODO: constexpr if
│ │ │ +
214 {
│ │ │ +
215 if (adjust_for_ccw)
│ │ │ +
216 {
│ │ │ +
217 // increment current heh and start so that cw and ccw version dont start with the same element but ranges are actually reversed
│ │ │ +
218 int lc = lap_counter;
│ │ │ +
219 increment(mesh, heh, start, lap_counter);
│ │ │ +
220 start = heh;
│ │ │ +
221 lap_counter = lc;
│ │ │ +
222 }
│ │ │ +
223 }
│ │ │ +
224 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0 )
│ │ │ +
225 increment(mesh, heh, start, lap_counter);
│ │ │ +
226 };
│ │ │ +
227 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
228 do {
│ │ │ + │ │ │ +
230 } while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ +
231 }
│ │ │ +
232 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
233 do {
│ │ │ + │ │ │ +
235 } while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ +
236 }
│ │ │ +
237};
│ │ │ +
│ │ │ +
238
│ │ │ +
239template<class Mesh>
│ │ │ +
│ │ │ + │ │ │ +
241 public:
│ │ │ +
242 typedef const Mesh* mesh_ptr;
│ │ │ +
243 typedef const Mesh& mesh_ref;
│ │ │ +
244
│ │ │ +
245 template <typename> friend class OpenMesh::CirculatorRange;
│ │ │ +
246
│ │ │ +
247 public:
│ │ │ +
248 GenericCirculatorBaseT() : mesh_(0), lap_counter_(0) {}
│ │ │ +
249
│ │ │ +
250 GenericCirculatorBaseT(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) :
│ │ │ +
251 mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast<int>(end && heh.is_valid())) {}
│ │ │ +
252
│ │ │ + │ │ │ +
254 mesh_(rhs.mesh_), start_(rhs.start_), heh_(rhs.heh_), lap_counter_(rhs.lap_counter_) {}
│ │ │ +
255
│ │ │ +
256 inline typename Mesh::FaceHandle toFaceHandle() const {
│ │ │ +
257 return mesh_->face_handle(heh_);
│ │ │ +
258 }
│ │ │
259
│ │ │ -
260//-----------------------------------------------------------------------------
│ │ │ -
261
│ │ │ +
260 inline typename Mesh::FaceHandle toOppositeFaceHandle() const {
│ │ │ +
261 return mesh_->face_handle(toOppositeHalfedgeHandle());
│ │ │ +
262 }
│ │ │
263
│ │ │ -
264
│ │ │ -
265//=============================================================================
│ │ │ -
266} // namespace IO
│ │ │ -
267} // namespace OpenMesh
│ │ │ -
268//=============================================================================
│ │ │ -
269#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN)
│ │ │ -
270# include <OpenMesh/Core/IO/IOInstances.hh>
│ │ │ -
271#endif
│ │ │ -
272//=============================================================================
│ │ │ -
273#endif
│ │ │ -
274//=============================================================================
│ │ │ +
264 inline typename Mesh::EdgeHandle toEdgeHandle() const {
│ │ │ +
265 return mesh_->edge_handle(heh_);
│ │ │ +
266 }
│ │ │ +
267
│ │ │ +
268 inline typename Mesh::HalfedgeHandle toHalfedgeHandle() const {
│ │ │ +
269 return heh_;
│ │ │ +
270 }
│ │ │ +
271
│ │ │ +
272 inline typename Mesh::HalfedgeHandle toOppositeHalfedgeHandle() const {
│ │ │ +
273 return mesh_->opposite_halfedge_handle(heh_);
│ │ │ +
274 }
│ │ │ +
275
│ │ │ +
276 inline typename Mesh::VertexHandle toVertexHandle() const {
│ │ │ +
277 return mesh_->to_vertex_handle(heh_);
│ │ │ +
278 }
│ │ │ +
279
│ │ │ +
280 inline GenericCirculatorBaseT &operator=(const GenericCirculatorBaseT &rhs) {
│ │ │ +
281 mesh_ = rhs.mesh_;
│ │ │ +
282 start_ = rhs.start_;
│ │ │ +
283 heh_ = rhs.heh_;
│ │ │ +
284 lap_counter_ = rhs.lap_counter_;
│ │ │ +
285 return *this;
│ │ │ +
286 }
│ │ │ +
287
│ │ │ +
288 inline bool operator==(const GenericCirculatorBaseT &rhs) const {
│ │ │ +
289 return mesh_ == rhs.mesh_ && start_ == rhs.start_ && heh_ == rhs.heh_ && lap_counter_ == rhs.lap_counter_;
│ │ │ +
290 }
│ │ │ +
291
│ │ │ +
292 inline bool operator!=(const GenericCirculatorBaseT &rhs) const {
│ │ │ +
293 return !operator==(rhs);
│ │ │ +
294 }
│ │ │ +
295
│ │ │ +
296 protected:
│ │ │ +
297 mesh_ptr mesh_;
│ │ │ +
298 typename Mesh::HalfedgeHandle start_, heh_;
│ │ │ +
299 int lap_counter_;
│ │ │ +
300};
│ │ │ +
│ │ │ +
301
│ │ │ +
302//template<class Mesh, class CenterEntityHandle, class ValueHandle,
│ │ │ +
303// ValueHandle (GenericCirculatorBaseT<Mesh>::*Handle2Value)() const, bool CW = true >
│ │ │ +
304template <typename GenericCirculatorT_TraitsT, bool CW = true>
│ │ │ +
│ │ │ +
305class GenericCirculatorT : protected GenericCirculatorBaseT<typename GenericCirculatorT_TraitsT::Mesh> {
│ │ │ +
306 public:
│ │ │ +
307 using Mesh = typename GenericCirculatorT_TraitsT::Mesh;
│ │ │ +
308 using value_type = typename GenericCirculatorT_TraitsT::ValueHandle;
│ │ │ +
309 using CenterEntityHandle = typename GenericCirculatorT_TraitsT::CenterEntityHandle;
│ │ │ +
310
│ │ │ +
311 using smart_value_type = decltype(make_smart(std::declval<value_type>(), std::declval<Mesh>()));
│ │ │ +
312
│ │ │ +
313 typedef std::ptrdiff_t difference_type;
│ │ │ +
314 typedef const value_type& reference;
│ │ │ +
315 typedef const smart_value_type* pointer;
│ │ │ +
316 typedef std::bidirectional_iterator_tag iterator_category;
│ │ │ +
317
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
321
│ │ │ +
322 template <typename> friend class OpenMesh::CirculatorRange;
│ │ │ +
323
│ │ │ +
324 public:
│ │ │ + │ │ │ +
326 GenericCirculatorT(mesh_ref mesh, CenterEntityHandle start, bool end = false) :
│ │ │ +
327 GenericCirculatorBaseT<Mesh>(mesh, mesh.halfedge_handle(start), end)
│ │ │ +
328 {
│ │ │ +
329 bool adjust_for_ccw = true;
│ │ │ +
330 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_, adjust_for_ccw);
│ │ │ +
331 }
│ │ │ +
332 GenericCirculatorT(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) :
│ │ │ +
333 GenericCirculatorBaseT<Mesh>(mesh, heh, end)
│ │ │ +
334 {
│ │ │ +
335 bool adjust_for_ccw = false; // if iterator is initialized with specific heh, we want to start there
│ │ │ +
336 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_, adjust_for_ccw);
│ │ │ +
337 }
│ │ │ + │ │ │ +
339
│ │ │ +
340 friend class GenericCirculatorT<GenericCirculatorT_TraitsT,!CW>;
│ │ │ + │ │ │ + │ │ │ +
343
│ │ │ +
344 GenericCirculatorT& operator++() {
│ │ │ +
345 assert(this->mesh_);
│ │ │ +
346 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ +
347 return *this;
│ │ │ +
348 }
│ │ │ +
349 GenericCirculatorT& operator--() {
│ │ │ +
350 assert(this->mesh_);
│ │ │ +
351 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ +
352 return *this;
│ │ │ +
353 }
│ │ │ +
354
│ │ │ +
│ │ │ + │ │ │ +
357 assert(this->mesh_);
│ │ │ +
358 GenericCirculatorT cpy(*this);
│ │ │ +
359 ++(*this);
│ │ │ +
360 return cpy;
│ │ │ +
361 }
│ │ │ +
│ │ │ +
362
│ │ │ +
│ │ │ + │ │ │ +
365 assert(this->mesh_);
│ │ │ +
366 GenericCirculatorT cpy(*this);
│ │ │ +
367 --(*this);
│ │ │ +
368 return cpy;
│ │ │ +
369 }
│ │ │ +
│ │ │ +
370
│ │ │ +
│ │ │ +
372 smart_value_type operator*() const {
│ │ │ +
373#ifndef NDEBUG
│ │ │ +
374 assert(this->heh_.is_valid());
│ │ │ +
375 value_type res = GenericCirculatorT_TraitsT::toHandle(this->mesh_, this->heh_);
│ │ │ +
376 assert(res.is_valid());
│ │ │ +
377 return make_smart(res, this->mesh_);
│ │ │ +
378#else
│ │ │ +
379 return make_smart(GenericCirculatorT_TraitsT::toHandle(this->mesh_, this->heh_), this->mesh_);
│ │ │ +
380#endif
│ │ │ +
381 }
│ │ │ +
│ │ │ +
382
│ │ │ +
│ │ │ +
391 pointer operator->() const {
│ │ │ +
392 pointer_deref_value = **this;
│ │ │ +
393 return &pointer_deref_value;
│ │ │ +
394 }
│ │ │ +
│ │ │ +
395
│ │ │ +
396 GenericCirculatorT &operator=(const GenericCirculatorT &rhs) {
│ │ │ + │ │ │ +
398 return *this;
│ │ │ +
399 };
│ │ │ +
400
│ │ │ +
401 bool operator==(const GenericCirculatorT &rhs) const {
│ │ │ +
402 return GenericCirculatorBaseT<Mesh>::operator==(rhs);
│ │ │ +
403 }
│ │ │ +
404
│ │ │ +
405 bool operator!=(const GenericCirculatorT &rhs) const {
│ │ │ +
406 return GenericCirculatorBaseT<Mesh>::operator!=(rhs);
│ │ │ +
407 }
│ │ │ +
408
│ │ │ +
409 bool is_valid() const {
│ │ │ +
410 return GenericCirculator_ValueHandleFns::is_valid(this->heh_, this->lap_counter_);
│ │ │ +
411 }
│ │ │ +
412
│ │ │ +
413 template<typename STREAM>
│ │ │ +
414 friend STREAM &operator<< (STREAM &s, const GenericCirculatorT &self) {
│ │ │ +
415 return s << self.mesh_ << ", " << self.start_.idx() << ", " << self.heh_.idx() << ", " << self.lap_counter_;
│ │ │ +
416 }
│ │ │ +
417
│ │ │ +
418 private:
│ │ │ +
419 mutable smart_value_type pointer_deref_value;
│ │ │ +
420};
│ │ │ +
│ │ │ +
421
│ │ │ +
426// OLD CIRCULATORS
│ │ │ +
427// deprecated circulators, will be removed soon
│ │ │ +
428// if you remove these circulators and go to the old ones, PLEASE ENABLE FOLLOWING UNITTESTS:
│ │ │ +
429//
│ │ │ +
430// OpenMeshTrimeshCirculatorVertexIHalfEdge.VertexIHalfEdgeIterCheckInvalidationAtEnds
│ │ │ +
431// OpenMeshTrimeshCirculatorVertexEdge.VertexEdgeIterCheckInvalidationAtEnds
│ │ │ +
432// OpenMeshTrimeshCirculatorVertexVertex.VertexVertexIterCheckInvalidationAtEnds
│ │ │ +
433// OpenMeshTrimeshCirculatorVertexOHalfEdge.VertexOHalfEdgeIterCheckInvalidationAtEnds
│ │ │ +
434// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterCheckInvalidationAtEnds
│ │ │ +
435// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterWithoutHolesDecrement
│ │ │ +
436// OpenMeshTrimeshCirculatorFaceEdge.FaceEdgeIterCheckInvalidationAtEnds
│ │ │ +
437// OpenMeshTrimeshCirculatorFaceFace.FaceFaceIterCheckInvalidationAtEnds
│ │ │ +
438// OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterWithoutHolesIncrement
│ │ │ +
439// OpenMeshTrimeshCirculatorFaceVertex.FaceVertexIterCheckInvalidationAtEnds
│ │ │ +
440// OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterCheckInvalidationAtEnds
│ │ │ +
441//
│ │ │ +
442
│ │ │ +
443template<class Mesh, class CenterEntityHandle, class ValueHandle>
│ │ │ +
│ │ │ + │ │ │ +
445 public:
│ │ │ +
446 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh,const typename Mesh::HalfedgeHandle &start, const int lap_counter) {
│ │ │ +
447 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )) );
│ │ │ +
448 }
│ │ │ +
449 inline static void init(const Mesh*, typename Mesh::HalfedgeHandle&, typename Mesh::HalfedgeHandle&, int&) {};
│ │ │ +
450 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ + │ │ │ +
452 }
│ │ │ +
453 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ + │ │ │ +
455 }
│ │ │ +
456};
│ │ │ +
│ │ │ +
457
│ │ │ +
458template<class Mesh, class CenterEntityHandle>
│ │ │ +
│ │ │ + │ │ │ +
460 public:
│ │ │ + │ │ │ +
462
│ │ │ +
463 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int lap_counter) {
│ │ │ +
464 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )));
│ │ │ +
465 }
│ │ │ +
466 inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
467 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0 )
│ │ │ +
468 increment(mesh, heh, start, lap_counter);
│ │ │ +
469 };
│ │ │ +
470 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
471 do {
│ │ │ + │ │ │ +
473 } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ +
474 }
│ │ │ +
475 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ +
476 do {
│ │ │ + │ │ │ +
478 } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ +
479 }
│ │ │ +
480};
│ │ │ +
│ │ │ +
481
│ │ │ +
482template <typename GenericCirculatorT_DEPRECATED_TraitsT>
│ │ │ +
│ │ │ +
483class GenericCirculatorT_DEPRECATED : protected GenericCirculatorBaseT<typename GenericCirculatorT_DEPRECATED_TraitsT::Mesh> {
│ │ │ +
484 public:
│ │ │ +
485 using Mesh = typename GenericCirculatorT_DEPRECATED_TraitsT::Mesh;
│ │ │ +
486 using CenterEntityHandle = typename GenericCirculatorT_DEPRECATED_TraitsT::CenterEntityHandle;
│ │ │ +
487 using value_type = typename GenericCirculatorT_DEPRECATED_TraitsT::ValueHandle;
│ │ │ +
488 using smart_value_type = decltype (make_smart(std::declval<value_type>(), std::declval<Mesh>()));
│ │ │ +
489
│ │ │ +
490 typedef std::ptrdiff_t difference_type;
│ │ │ +
491 typedef const value_type& reference;
│ │ │ +
492 typedef const smart_value_type* pointer;
│ │ │ +
493 typedef std::bidirectional_iterator_tag iterator_category;
│ │ │ +
494
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
498
│ │ │ +
499 template <typename> friend class OpenMesh::CirculatorRange;
│ │ │ +
500
│ │ │ +
501 public:
│ │ │ + │ │ │ +
503 GenericCirculatorT_DEPRECATED(mesh_ref mesh, CenterEntityHandle start, bool end = false) :
│ │ │ +
504 GenericCirculatorBaseT<Mesh>(mesh, mesh.halfedge_handle(start), end) {
│ │ │ +
505
│ │ │ +
506 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ +
507 }
│ │ │ +
508 GenericCirculatorT_DEPRECATED(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) :
│ │ │ +
509 GenericCirculatorBaseT<Mesh>(mesh, heh, end) {
│ │ │ +
510
│ │ │ +
511 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ +
512 }
│ │ │ + │ │ │ +
514
│ │ │ +
515 GenericCirculatorT_DEPRECATED& operator++() {
│ │ │ +
516 assert(this->mesh_);
│ │ │ +
517 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ +
518 return *this;
│ │ │ +
519 }
│ │ │ +
520#ifndef NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ +
521#define DECREMENT_DEPRECATED_WARNINGS_TEXT "The current decrement operator has the unintended behavior that it stays\
│ │ │ +
522 valid when iterating below the start and will visit the first entity\
│ │ │ +
523 twice before getting invalid. Furthermore it gets valid again, if you\
│ │ │ +
524 increment at the end.\
│ │ │ +
525 When you are sure that you don't iterate below the start anywhere in\
│ │ │ +
526 your code or rely on this behaviour, you can disable this warning by\
│ │ │ +
527 setting the define NO_DECREMENT_DEPRECATED_WARNINGS at the command line (or enable it via the\
│ │ │ +
528 cmake flags).\
│ │ │ +
529 To be save, you can use the CW/CCW circulator definitions, which behave\
│ │ │ +
530 the same as the original ones, without the previously mentioned issues."
│ │ │ +
531
│ │ │ +
532 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT )
│ │ │ +
533#endif // NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ +
534 GenericCirculatorT_DEPRECATED& operator--() {
│ │ │ +
535 assert(this->mesh_);
│ │ │ +
536 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ +
537 return *this;
│ │ │ +
538 }
│ │ │ +
539
│ │ │ +
│ │ │ + │ │ │ +
542 assert(this->mesh_);
│ │ │ + │ │ │ +
544 ++(*this);
│ │ │ +
545 return cpy;
│ │ │ +
546 }
│ │ │ +
│ │ │ +
547
│ │ │ +
549#ifndef NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ +
550 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT )
│ │ │ +
551#undef DECREMENT_DEPRECATED_WARNINGS_TEXT
│ │ │ +
552#endif //NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ +
│ │ │ + │ │ │ +
554 assert(this->mesh_);
│ │ │ + │ │ │ +
556 --(*this);
│ │ │ +
557 return cpy;
│ │ │ +
558 }
│ │ │ +
│ │ │ +
559
│ │ │ +
│ │ │ +
561 smart_value_type operator*() const {
│ │ │ +
562#ifndef NDEBUG
│ │ │ +
563 assert(this->heh_.is_valid());
│ │ │ +
564 value_type res = (GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this->mesh_, this->heh_));
│ │ │ +
565 assert(res.is_valid());
│ │ │ +
566 return make_smart(res, this->mesh_);
│ │ │ +
567#else
│ │ │ +
568 return make_smart(GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this->mesh_, this->heh_), this->mesh_);
│ │ │ +
569#endif
│ │ │ +
570 }
│ │ │ +
│ │ │ +
571
│ │ │ +
│ │ │ +
580 pointer operator->() const {
│ │ │ +
581 pointer_deref_value = **this;
│ │ │ +
582 return &pointer_deref_value;
│ │ │ +
583 }
│ │ │ +
│ │ │ +
584
│ │ │ + │ │ │ + │ │ │ +
587 return *this;
│ │ │ +
588 };
│ │ │ +
589
│ │ │ +
590 bool operator==(const GenericCirculatorT_DEPRECATED &rhs) const {
│ │ │ +
591 return GenericCirculatorBaseT<Mesh>::operator==(rhs);
│ │ │ +
592 }
│ │ │ +
593
│ │ │ +
594 bool operator!=(const GenericCirculatorT_DEPRECATED &rhs) const {
│ │ │ +
595 return GenericCirculatorBaseT<Mesh>::operator!=(rhs);
│ │ │ +
596 }
│ │ │ +
597
│ │ │ +
598 bool is_valid() const {
│ │ │ +
599 return GenericCirculator_ValueHandleFns::is_valid(this->heh_,this->start_, this->lap_counter_);
│ │ │ +
600 }
│ │ │ +
601
│ │ │ +
602 OM_DEPRECATED("current_halfedge_handle() is an implementation detail and should not be accessed from outside the iterator class.")
│ │ │ +
│ │ │ +
608 const typename Mesh::HalfedgeHandle &current_halfedge_handle() const {
│ │ │ +
609 return this->heh_;
│ │ │ +
610 }
│ │ │ +
│ │ │ +
611
│ │ │ +
612 OM_DEPRECATED("Do not use this error prone implicit cast. Compare to end-iterator or use is_valid(), instead.")
│ │ │ +
│ │ │ +
618 operator bool() const {
│ │ │ +
619 return is_valid();
│ │ │ +
620 }
│ │ │ +
│ │ │ +
621
│ │ │ +
627 OM_DEPRECATED("This function clutters your code. Use dereferencing operators -> and * instead.")
│ │ │ +
│ │ │ +
628 smart_value_type handle() const {
│ │ │ +
629 return **this;
│ │ │ +
630 }
│ │ │ +
│ │ │ +
631
│ │ │ +
638 OM_DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.")
│ │ │ +
│ │ │ +
639 operator value_type() const {
│ │ │ +
640 return **this;
│ │ │ +
641 }
│ │ │ +
│ │ │ +
642
│ │ │ +
643 template<typename STREAM>
│ │ │ +
644 friend STREAM &operator<< (STREAM &s, const GenericCirculatorT_DEPRECATED &self) {
│ │ │ +
645 return s << self.mesh_ << ", " << self.start_.idx() << ", " << self.heh_.idx() << ", " << self.lap_counter_;
│ │ │ +
646 }
│ │ │ +
647
│ │ │ +
648 private:
│ │ │ +
649 mutable smart_value_type pointer_deref_value;
│ │ │ +
650};
│ │ │ +
│ │ │ +
651
│ │ │ +
652} // namespace Iterators
│ │ │ +
653} // namespace OpenMesh
│ │ │ +
654
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options _opt=Options::Default)
Get binary size of data.
Definition MeshIO.hh:251
│ │ │ -
bool write_mesh(const Mesh &_mesh, const std::string &_filename, Options _opt=Options::Default, std::streamsize _precision=6)
Write a mesh to the file _filename.
Definition MeshIO.hh:190
│ │ │ -
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
Definition MeshIO.hh:95
│ │ │ -
This class template provides an exporter module for OpenMesh meshes.
Definition ExporterT.hh:85
│ │ │ -
This class template provides an importer module for OpenMesh meshes.
Definition ImporterT.hh:81
│ │ │ -
bool write(const std::string &_filename, BaseExporter &_be, Options _opt=Options::Default, std::streamsize _precision=6)
Write a mesh to file _filename.
Definition IOManager.cc:143
│ │ │ -
bool read(const std::string &_filename, BaseImporter &_bi, Options &_opt)
Read a mesh from file _filename.
Definition IOManager.cc:87
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
@ Default
By default write persistent custom properties.
Definition Options.hh:117
│ │ │ +
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ +
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
Definition CirculatorsT.hh:240
│ │ │ +
Definition CirculatorsT.hh:305
│ │ │ +
smart_value_type operator*() const
Standard dereferencing operator.
Definition CirculatorsT.hh:372
│ │ │ +
GenericCirculatorT operator++(int)
Post-increment.
Definition CirculatorsT.hh:356
│ │ │ +
GenericCirculatorT operator--(int)
Post-decrement.
Definition CirculatorsT.hh:364
│ │ │ +
pointer operator->() const
Pointer dereferentiation.
Definition CirculatorsT.hh:391
│ │ │ + │ │ │ + │ │ │ +
GenericCirculatorT_DEPRECATED operator++(int)
Post-increment.
Definition CirculatorsT.hh:541
│ │ │ +
const Mesh::HalfedgeHandle & current_halfedge_handle() const
Definition CirculatorsT.hh:608
│ │ │ +
pointer operator->() const
Pointer dereferentiation.
Definition CirculatorsT.hh:580
│ │ │ +
GenericCirculatorT_DEPRECATED operator--(int)
Post-decrement.
Definition CirculatorsT.hh:553
│ │ │ +
smart_value_type operator*() const
Standard dereferencing operator.
Definition CirculatorsT.hh:561
│ │ │ +
smart_value_type handle() const
Return the handle of the current target.
Definition CirculatorsT.hh:628
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -MeshIO.hh │ │ │ │ +CirculatorsT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -46,190 +46,805 @@ │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ -43 │ │ │ │ +43#pragma once │ │ │ │ 44 │ │ │ │ -45#ifndef OM_MESHIO_HH │ │ │ │ -46#define OM_MESHIO_HH │ │ │ │ -47 │ │ │ │ -48 │ │ │ │ -49//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Vertex, Face, and Edge circulators for PolyMesh/TriMesh │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ 50 │ │ │ │ -51// -------------------- system settings │ │ │ │ -52#include │ │ │ │ -53 │ │ │ │ -54// -------------------- OpenMesh │ │ │ │ -55#include │ │ │ │ -56#include │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ +51 │ │ │ │ +52 │ │ │ │ +53//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +54 │ │ │ │ +55#include │ │ │ │ +56#include │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ 59 │ │ │ │ -60 │ │ │ │ -61//== NAMESPACES │ │ │ │ -============================================================== │ │ │ │ -62 │ │ │ │ -63namespace _O_p_e_n_M_e_s_h { │ │ │ │ -64namespace IO { │ │ │ │ +60//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +61 │ │ │ │ +62namespace _O_p_e_n_M_e_s_h { │ │ │ │ +63 │ │ │ │ +64template class CirculatorRange; │ │ │ │ 65 │ │ │ │ -66 │ │ │ │ -67//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -68 │ │ │ │ -69 │ │ │ │ -75 │ │ │ │ -76 │ │ │ │ -77//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -78 │ │ │ │ -79 │ │ │ │ -93template │ │ │ │ -94bool │ │ │ │ -_9_5_r_e_a_d___m_e_s_h(_M_e_s_h& _mesh, │ │ │ │ -96 const std::string& _filename) │ │ │ │ -97{ │ │ │ │ -98 _O_p_t_i_o_n_s opt; │ │ │ │ -99 return _r_e_a_d___m_e_s_h(_mesh, _filename, opt, true); │ │ │ │ -100} │ │ │ │ -101 │ │ │ │ -102 │ │ │ │ -123template │ │ │ │ -124bool │ │ │ │ -_1_2_5_r_e_a_d___m_e_s_h(_M_e_s_h& _mesh, │ │ │ │ -126 const std::string& _filename, │ │ │ │ -127 _O_p_t_i_o_n_s& _opt, │ │ │ │ -128 bool _clear = true) │ │ │ │ -129{ │ │ │ │ -130 if (_clear) _mesh.clear(); │ │ │ │ -131 _I_m_p_o_r_t_e_r_T_<_M_e_s_h_> importer(_mesh); │ │ │ │ -132 return IOManager()._r_e_a_d(_filename, importer, _opt); │ │ │ │ -133} │ │ │ │ -134 │ │ │ │ -135 │ │ │ │ -155template │ │ │ │ -156bool │ │ │ │ -_1_5_7_r_e_a_d___m_e_s_h(_M_e_s_h& _mesh, │ │ │ │ -158 std::istream& _is, │ │ │ │ -159 const std::string& _ext, │ │ │ │ -160 _O_p_t_i_o_n_s& _opt, │ │ │ │ -161 bool _clear = true) │ │ │ │ -162{ │ │ │ │ -163 if (_clear) _mesh.clear(); │ │ │ │ -164 _I_m_p_o_r_t_e_r_T_<_M_e_s_h_> importer(_mesh); │ │ │ │ -165 return IOManager()._r_e_a_d(_is,_ext, importer, _opt); │ │ │ │ -166} │ │ │ │ -167 │ │ │ │ -168 │ │ │ │ -169 │ │ │ │ -170//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -171 │ │ │ │ -172 │ │ │ │ -189template │ │ │ │ -_1_9_0bool _w_r_i_t_e___m_e_s_h(const _M_e_s_h& _mesh, │ │ │ │ -191 const std::string& _filename, │ │ │ │ -192 _O_p_t_i_o_n_s _opt = _O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t, │ │ │ │ -193 std::streamsize _precision = 6) │ │ │ │ -194{ │ │ │ │ -195 _E_x_p_o_r_t_e_r_T_<_M_e_s_h_> exporter(_mesh); │ │ │ │ -196 return IOManager()._w_r_i_t_e(_filename, exporter, _opt, _precision); │ │ │ │ -197} │ │ │ │ -198 │ │ │ │ -199 │ │ │ │ -200//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -201 │ │ │ │ +66namespace Iterators { │ │ │ │ +67 │ │ │ │ +68template │ │ │ │ +_6_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T { │ │ │ │ +70 public: │ │ │ │ +71 static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, │ │ │ │ +const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter); │ │ │ │ +72 static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, │ │ │ │ +const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter); │ │ │ │ +73}; │ │ │ │ +74 │ │ │ │ +75template │ │ │ │ +_7_6class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_V_e_r_t_e_x_H_a_n_d_l_e, │ │ │ │ +true> { │ │ │ │ +77 public: │ │ │ │ +78 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +79 heh = mesh->cw_rotated_halfedge_handle(heh); │ │ │ │ +80 if (heh == start) ++lap_counter; │ │ │ │ +81 } │ │ │ │ +82 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +83 if (heh == start) --lap_counter; │ │ │ │ +84 heh = mesh->ccw_rotated_halfedge_handle(heh); │ │ │ │ +85 } │ │ │ │ +86}; │ │ │ │ +87 │ │ │ │ +88template │ │ │ │ +_8_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_F_a_c_e_H_a_n_d_l_e, │ │ │ │ +true> { │ │ │ │ +90 public: │ │ │ │ +91 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +92 heh = mesh->next_halfedge_handle(heh); │ │ │ │ +93 if (heh == start) ++lap_counter; │ │ │ │ +94 } │ │ │ │ +95 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +96 if (heh == start) --lap_counter; │ │ │ │ +97 heh = mesh->prev_halfedge_handle(heh); │ │ │ │ +98 } │ │ │ │ +99}; │ │ │ │ +100 │ │ │ │ +101template │ │ │ │ +_1_0_2class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_E_d_g_e_H_a_n_d_l_e, │ │ │ │ +CW> { │ │ │ │ +103 public: │ │ │ │ +104 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +105 heh = mesh->opposite_halfedge_handle(heh); │ │ │ │ +106 if (heh == start) ++lap_counter; │ │ │ │ +107 } │ │ │ │ +108 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +109 if (heh == start) --lap_counter; │ │ │ │ +110 heh = mesh->opposite_halfedge_handle(heh); │ │ │ │ +111 } │ │ │ │ +112}; │ │ │ │ +113 │ │ │ │ +115// CCW │ │ │ │ +116 │ │ │ │ +117template │ │ │ │ +_1_1_8class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_V_e_r_t_e_x_H_a_n_d_l_e, │ │ │ │ +false> { │ │ │ │ +119 public: │ │ │ │ +120 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +121 heh = mesh->ccw_rotated_halfedge_handle(heh); │ │ │ │ +122 if (heh == start) ++lap_counter; │ │ │ │ +123 } │ │ │ │ +124 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +125 if (heh == start) --lap_counter; │ │ │ │ +126 heh = mesh->cw_rotated_halfedge_handle(heh); │ │ │ │ +127 } │ │ │ │ +128}; │ │ │ │ +129 │ │ │ │ +130template │ │ │ │ +_1_3_1class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_F_a_c_e_H_a_n_d_l_e, │ │ │ │ +false> { │ │ │ │ +132 public: │ │ │ │ +133 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +134 heh = mesh->prev_halfedge_handle(heh); │ │ │ │ +135 if (heh == start) ++lap_counter; │ │ │ │ +136 } │ │ │ │ +137 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +138 if (heh == start) --lap_counter; │ │ │ │ +139 heh = mesh->next_halfedge_handle(heh); │ │ │ │ +140 } │ │ │ │ +141}; │ │ │ │ +143 │ │ │ │ +144template │ │ │ │ +_1_4_5class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T { │ │ │ │ +146 public: │ │ │ │ +147 //inline static bool isDereferenciable(const Mesh *mesh, const typename │ │ │ │ +Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const │ │ │ │ +int &lap_counter); │ │ │ │ +148}; │ │ │ │ +149 │ │ │ │ +150template │ │ │ │ +_1_5_1class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T<_M_e_s_h, typename _M_e_s_h:: │ │ │ │ +_F_a_c_e_H_a_n_d_l_e, typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ +152 public: │ │ │ │ +153 inline static bool isDereferenciable(const _M_e_s_h *mesh, const typename │ │ │ │ +_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh) { │ │ │ │ +154 return mesh->face_handle(mesh->opposite_halfedge_handle(heh)).is_valid(); │ │ │ │ +155 } │ │ │ │ +156}; │ │ │ │ +157 │ │ │ │ +158template │ │ │ │ +_1_5_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T<_M_e_s_h, typename _M_e_s_h:: │ │ │ │ +_V_e_r_t_e_x_H_a_n_d_l_e, typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ +160 public: │ │ │ │ +161 inline static bool isDereferenciable(const _M_e_s_h *mesh, const typename │ │ │ │ +_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh) { │ │ │ │ +162 return mesh->face_handle(heh).is_valid(); │ │ │ │ +163 } │ │ │ │ +164}; │ │ │ │ +165 │ │ │ │ +166template │ │ │ │ +_1_6_7class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T<_M_e_s_h, typename _M_e_s_h:: │ │ │ │ +_E_d_g_e_H_a_n_d_l_e, typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ +168 public: │ │ │ │ +169 inline static bool isDereferenciable(const _M_e_s_h *mesh, const typename │ │ │ │ +_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh) { │ │ │ │ +170 return mesh->face_handle(heh).is_valid(); │ │ │ │ +171 } │ │ │ │ +172}; │ │ │ │ +173 │ │ │ │ +174template │ │ │ │ +_1_7_5class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T { │ │ │ │ +176 public: │ │ │ │ +177 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const │ │ │ │ +int lap_counter) { │ │ │ │ +178 return ( heh.is_valid() && (lap_counter == 0 ) ); │ │ │ │ +179 } │ │ │ │ +180 inline static void init(const _M_e_s_h* mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& │ │ │ │ +heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& start, int& lap_counter, bool │ │ │ │ +adjust_for_ccw) │ │ │ │ +181 { │ │ │ │ +182 if (!CW) // TODO: constexpr if │ │ │ │ +183 { │ │ │ │ +184 if (adjust_for_ccw) │ │ │ │ +185 { │ │ │ │ +186 // increment current heh and start so that cw and ccw version dont start │ │ │ │ +with the same element but ranges are actually reversed │ │ │ │ +187 int lc = lap_counter; │ │ │ │ +188 increment(mesh, heh, start, lap_counter); │ │ │ │ +189 start = heh; │ │ │ │ +190 lap_counter = lc; │ │ │ │ +191 } │ │ │ │ +192 } │ │ │ │ +193 } │ │ │ │ +194 │ │ │ │ +195 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +196 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ +(mesh, heh, start, lap_counter); │ │ │ │ +197 } │ │ │ │ +198 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +199 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ +(mesh, heh, start, lap_counter); │ │ │ │ +200 } │ │ │ │ +201}; │ │ │ │ 202 │ │ │ │ -221template │ │ │ │ -_2_2_2bool _w_r_i_t_e___m_e_s_h(const _M_e_s_h& _mesh, │ │ │ │ -223 std::ostream& _os, │ │ │ │ -224 const std::string& _ext, │ │ │ │ -225 _O_p_t_i_o_n_s _opt = _O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t, │ │ │ │ -226 std::streamsize _precision = 6) │ │ │ │ -227{ │ │ │ │ -228 _E_x_p_o_r_t_e_r_T_<_M_e_s_h_> exporter(_mesh); │ │ │ │ -229 return IOManager()._w_r_i_t_e(_os,_ext, exporter, _opt, _precision); │ │ │ │ -230} │ │ │ │ -231 │ │ │ │ -232 │ │ │ │ -233//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -234 │ │ │ │ -250template │ │ │ │ -_2_5_1size_t _b_i_n_a_r_y___s_i_z_e(const _M_e_s_h& _mesh, │ │ │ │ -252 const std::string& _ext, │ │ │ │ -253 _O_p_t_i_o_n_s _opt = _O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t) │ │ │ │ -254{ │ │ │ │ -255 _E_x_p_o_r_t_e_r_T_<_M_e_s_h_> exporter(_mesh); │ │ │ │ -256 return IOManager().binary_size(_ext, exporter, _opt); │ │ │ │ -257} │ │ │ │ -258 │ │ │ │ +203template │ │ │ │ +_2_0_4class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T<_M_e_s_h, CenterEntityHandle, typename │ │ │ │ +_M_e_s_h::_F_a_c_e_H_a_n_d_l_e, CW> { │ │ │ │ +205 public: │ │ │ │ +206 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T_<_M_e_s_h_, │ │ │ │ +_C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_y_p_e_n_a_m_e_ _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e_> │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k; │ │ │ │ +207 │ │ │ │ +208 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const │ │ │ │ +int lap_counter) { │ │ │ │ +209 return ( heh.is_valid() && (lap_counter == 0)); │ │ │ │ +210 } │ │ │ │ +211 inline static void init(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +&heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter, bool │ │ │ │ +adjust_for_ccw) │ │ │ │ +212 { │ │ │ │ +213 if (!CW) // TODO: constexpr if │ │ │ │ +214 { │ │ │ │ +215 if (adjust_for_ccw) │ │ │ │ +216 { │ │ │ │ +217 // increment current heh and start so that cw and ccw version dont start │ │ │ │ +with the same element but ranges are actually reversed │ │ │ │ +218 int lc = lap_counter; │ │ │ │ +219 increment(mesh, heh, start, lap_counter); │ │ │ │ +220 start = heh; │ │ │ │ +221 lap_counter = lc; │ │ │ │ +222 } │ │ │ │ +223 } │ │ │ │ +224 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck:: │ │ │ │ +isDereferenciable(mesh, heh) && lap_counter == 0 ) │ │ │ │ +225 increment(mesh, heh, start, lap_counter); │ │ │ │ +226 }; │ │ │ │ +227 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +228 do { │ │ │ │ +229 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ +(mesh, heh, start, lap_counter); │ │ │ │ +230 } while (is_valid(heh, lap_counter) && │ │ │ │ +!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ +231 } │ │ │ │ +232 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +233 do { │ │ │ │ +234 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ +(mesh, heh, start, lap_counter); │ │ │ │ +235 } while (is_valid(heh, lap_counter) && │ │ │ │ +!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ +236 } │ │ │ │ +237}; │ │ │ │ +238 │ │ │ │ +239template │ │ │ │ +_2_4_0class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T { │ │ │ │ +241 public: │ │ │ │ +242 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ +243 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ +244 │ │ │ │ +245 template friend class _O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ +246 │ │ │ │ +247 public: │ │ │ │ +248 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T() : mesh_(0), lap_counter_(0) {} │ │ │ │ +249 │ │ │ │ +250 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T(_m_e_s_h___r_e_f mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, │ │ │ │ +bool end = false) : │ │ │ │ +251 mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast(end && │ │ │ │ +heh.is_valid())) {} │ │ │ │ +252 │ │ │ │ +253 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) : │ │ │ │ +254 mesh_(rhs.mesh_), start_(rhs.start_), heh_(rhs.heh_), lap_counter_ │ │ │ │ +(rhs.lap_counter_) {} │ │ │ │ +255 │ │ │ │ +256 inline typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e toFaceHandle() const { │ │ │ │ +257 return mesh_->face_handle(heh_); │ │ │ │ +258 } │ │ │ │ 259 │ │ │ │ -260//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -261 │ │ │ │ +260 inline typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e toOppositeFaceHandle() const { │ │ │ │ +261 return mesh_->face_handle(toOppositeHalfedgeHandle()); │ │ │ │ +262 } │ │ │ │ 263 │ │ │ │ -264 │ │ │ │ -265// │ │ │ │ -============================================================================= │ │ │ │ -266} // namespace IO │ │ │ │ -267} // namespace OpenMesh │ │ │ │ -268// │ │ │ │ -============================================================================= │ │ │ │ -269#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN) │ │ │ │ -270# include │ │ │ │ -271#endif │ │ │ │ -272// │ │ │ │ -============================================================================= │ │ │ │ -273#endif │ │ │ │ -274// │ │ │ │ -============================================================================= │ │ │ │ +264 inline typename _M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e toEdgeHandle() const { │ │ │ │ +265 return mesh_->edge_handle(heh_); │ │ │ │ +266 } │ │ │ │ +267 │ │ │ │ +268 inline typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e toHalfedgeHandle() const { │ │ │ │ +269 return heh_; │ │ │ │ +270 } │ │ │ │ +271 │ │ │ │ +272 inline typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e toOppositeHalfedgeHandle() const { │ │ │ │ +273 return mesh_->opposite_halfedge_handle(heh_); │ │ │ │ +274 } │ │ │ │ +275 │ │ │ │ +276 inline typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e toVertexHandle() const { │ │ │ │ +277 return mesh_->to_vertex_handle(heh_); │ │ │ │ +278 } │ │ │ │ +279 │ │ │ │ +280 inline _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &operator=(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) │ │ │ │ +{ │ │ │ │ +281 mesh_ = rhs.mesh_; │ │ │ │ +282 start_ = rhs.start_; │ │ │ │ +283 heh_ = rhs.heh_; │ │ │ │ +284 lap_counter_ = rhs.lap_counter_; │ │ │ │ +285 return *this; │ │ │ │ +286 } │ │ │ │ +287 │ │ │ │ +288 inline bool operator==(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) const { │ │ │ │ +289 return mesh_ == rhs.mesh_ && start_ == rhs.start_ && heh_ == rhs.heh_ && │ │ │ │ +lap_counter_ == rhs.lap_counter_; │ │ │ │ +290 } │ │ │ │ +291 │ │ │ │ +292 inline bool operator!=(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) const { │ │ │ │ +293 return !operator==(rhs); │ │ │ │ +294 } │ │ │ │ +295 │ │ │ │ +296 protected: │ │ │ │ +297 _m_e_s_h___p_t_r mesh_; │ │ │ │ +298 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e start_, heh_; │ │ │ │ +299 int lap_counter_; │ │ │ │ +300}; │ │ │ │ +301 │ │ │ │ +302//template::*Handle2Value)() const, bool │ │ │ │ +CW = true > │ │ │ │ +304template │ │ │ │ +_3_0_5class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T : protected _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T { │ │ │ │ +306 public: │ │ │ │ +307 using Mesh = typename GenericCirculatorT_TraitsT::Mesh; │ │ │ │ +308 using value_type = typename GenericCirculatorT_TraitsT::ValueHandle; │ │ │ │ +309 using CenterEntityHandle = typename GenericCirculatorT_TraitsT:: │ │ │ │ +CenterEntityHandle; │ │ │ │ +310 │ │ │ │ +311 using smart_value_type = decltype(_m_a_k_e___s_m_a_r_t(std::declval(), │ │ │ │ +std::declval())); │ │ │ │ +312 │ │ │ │ +313 typedef std::ptrdiff_t difference_type; │ │ │ │ +314 typedef const value_type& reference; │ │ │ │ +315 typedef const smart_value_type* pointer; │ │ │ │ +316 typedef std::bidirectional_iterator_tag iterator_category; │ │ │ │ +317 │ │ │ │ +318 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___p_t_r _m_e_s_h___p_t_r; │ │ │ │ +319 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___r_e_f _m_e_s_h___r_e_f; │ │ │ │ +320 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_, │ │ │ │ +_v_a_l_u_e___t_y_p_e_,_ _C_W_> _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s; │ │ │ │ +321 │ │ │ │ +322 template friend class _O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ +323 │ │ │ │ +324 public: │ │ │ │ +325 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T() {} │ │ │ │ +326 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f mesh, CenterEntityHandle start, bool end = │ │ │ │ +false) : │ │ │ │ +327 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, mesh.halfedge_handle(start), end) │ │ │ │ +328 { │ │ │ │ +329 bool adjust_for_ccw = true; │ │ │ │ +330 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_, adjust_for_ccw); │ │ │ │ +331 } │ │ │ │ +332 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, bool │ │ │ │ +end = false) : │ │ │ │ +333 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, heh, end) │ │ │ │ +334 { │ │ │ │ +335 bool adjust_for_ccw = false; // if iterator is initialized with specific │ │ │ │ +heh, we want to start there │ │ │ │ +336 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_, adjust_for_ccw); │ │ │ │ +337 } │ │ │ │ +338 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T &rhs) : │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(rhs) {} │ │ │ │ +339 │ │ │ │ +340 friend class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T; │ │ │ │ +341 explicit _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T( const │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___T_r_a_i_t_s_T_,_!_C_W_>& rhs ) │ │ │ │ +342 :_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(rhs){} │ │ │ │ +343 │ │ │ │ +344 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T& operator++() { │ │ │ │ +345 assert(this->mesh_); │ │ │ │ +346 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_); │ │ │ │ +347 return *this; │ │ │ │ +348 } │ │ │ │ +349 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T& operator--() { │ │ │ │ +350 assert(this->mesh_); │ │ │ │ +351 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_); │ │ │ │ +352 return *this; │ │ │ │ +353 } │ │ │ │ +354 │ │ │ │ +_3_5_6 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T _o_p_e_r_a_t_o_r_+_+(int) { │ │ │ │ +357 assert(this->mesh_); │ │ │ │ +358 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T cpy(*this); │ │ │ │ +359 ++(*this); │ │ │ │ +360 return cpy; │ │ │ │ +361 } │ │ │ │ +362 │ │ │ │ +_3_6_4 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T _o_p_e_r_a_t_o_r_-_-(int) { │ │ │ │ +365 assert(this->mesh_); │ │ │ │ +366 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T cpy(*this); │ │ │ │ +367 --(*this); │ │ │ │ +368 return cpy; │ │ │ │ +369 } │ │ │ │ +370 │ │ │ │ +_3_7_2 smart_value_type _o_p_e_r_a_t_o_r_*() const { │ │ │ │ +373#ifndef NDEBUG │ │ │ │ +374 assert(this->heh_.is_valid()); │ │ │ │ +375 value_type res = GenericCirculatorT_TraitsT::toHandle(this->mesh_, this- │ │ │ │ +>heh_); │ │ │ │ +376 assert(res.is_valid()); │ │ │ │ +377 return _m_a_k_e___s_m_a_r_t(res, this->mesh_); │ │ │ │ +378#else │ │ │ │ +379 return _m_a_k_e___s_m_a_r_t(GenericCirculatorT_TraitsT::toHandle(this->mesh_, this- │ │ │ │ +>heh_), this->mesh_); │ │ │ │ +380#endif │ │ │ │ +381 } │ │ │ │ +382 │ │ │ │ +_3_9_1 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ +392 pointer_deref_value = **this; │ │ │ │ +393 return &pointer_deref_value; │ │ │ │ +394 } │ │ │ │ +395 │ │ │ │ +396 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T &operator=(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T &rhs) { │ │ │ │ +397 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_o_p_e_r_a_t_o_r_=(rhs); │ │ │ │ +398 return *this; │ │ │ │ +399 }; │ │ │ │ +400 │ │ │ │ +401 bool operator==(const GenericCirculatorT &rhs) const { │ │ │ │ +402 return GenericCirculatorBaseT::operator==(rhs); │ │ │ │ +403 } │ │ │ │ +404 │ │ │ │ +405 bool operator!=(const GenericCirculatorT &rhs) const { │ │ │ │ +406 return GenericCirculatorBaseT::operator!=(rhs); │ │ │ │ +407 } │ │ │ │ +408 │ │ │ │ +409 bool is_valid() const { │ │ │ │ +410 return GenericCirculator_ValueHandleFns::is_valid(this->heh_, this- │ │ │ │ +>lap_counter_); │ │ │ │ +411 } │ │ │ │ +412 │ │ │ │ +413 template │ │ │ │ +414 friend STREAM &operator<< (STREAM &s, const GenericCirculatorT &self) { │ │ │ │ +415 return s << self.mesh_ << ", " << self.start_.idx() << ", " << │ │ │ │ +self.heh_.idx() << ", " << self.lap_counter_; │ │ │ │ +416 } │ │ │ │ +417 │ │ │ │ +418 private: │ │ │ │ +419 mutable smart_value_type pointer_deref_value; │ │ │ │ +420}; │ │ │ │ +421 │ │ │ │ +426// OLD CIRCULATORS │ │ │ │ +427// deprecated circulators, will be removed soon │ │ │ │ +428// if you remove these circulators and go to the old ones, PLEASE ENABLE │ │ │ │ +FOLLOWING UNITTESTS: │ │ │ │ +429// │ │ │ │ +430/ │ │ │ │ +/ │ │ │ │ +OpenMeshTrimeshCirculatorVertexIHalfEdge.VertexIHalfEdgeIterCheckInvalidationAtEnds │ │ │ │ +431// OpenMeshTrimeshCirculatorVertexEdge.VertexEdgeIterCheckInvalidationAtEnds │ │ │ │ +432/ │ │ │ │ +/ OpenMeshTrimeshCirculatorVertexVertex.VertexVertexIterCheckInvalidationAtEnds │ │ │ │ +433/ │ │ │ │ +/ │ │ │ │ +OpenMeshTrimeshCirculatorVertexOHalfEdge.VertexOHalfEdgeIterCheckInvalidationAtEnds │ │ │ │ +434// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterCheckInvalidationAtEnds │ │ │ │ +435// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterWithoutHolesDecrement │ │ │ │ +436// OpenMeshTrimeshCirculatorFaceEdge.FaceEdgeIterCheckInvalidationAtEnds │ │ │ │ +437// OpenMeshTrimeshCirculatorFaceFace.FaceFaceIterCheckInvalidationAtEnds │ │ │ │ +438/ │ │ │ │ +/ OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterWithoutHolesIncrement │ │ │ │ +439// OpenMeshTrimeshCirculatorFaceVertex.FaceVertexIterCheckInvalidationAtEnds │ │ │ │ +440/ │ │ │ │ +/ OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterCheckInvalidationAtEnds │ │ │ │ +441// │ │ │ │ +442 │ │ │ │ +443template │ │ │ │ +_4_4_4class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D { │ │ │ │ +445 public: │ │ │ │ +446 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh,const │ │ │ │ +typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, const int lap_counter) { │ │ │ │ +447 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )) ); │ │ │ │ +448 } │ │ │ │ +449 inline static void init(const _M_e_s_h*, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e&, │ │ │ │ +typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e&, int&) {}; │ │ │ │ +450 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +451 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ +_i_n_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ +452 } │ │ │ │ +453 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +454 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ +_d_e_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ +455 } │ │ │ │ +456}; │ │ │ │ +457 │ │ │ │ +458template │ │ │ │ +_4_5_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D<_M_e_s_h, CenterEntityHandle, │ │ │ │ +typename _M_e_s_h::_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ +460 public: │ │ │ │ +461 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T_<_M_e_s_h_, │ │ │ │ +_C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_y_p_e_n_a_m_e_ _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e_> │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k; │ │ │ │ +462 │ │ │ │ +463 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const │ │ │ │ +typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, const int lap_counter) { │ │ │ │ +464 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 ))); │ │ │ │ +465 } │ │ │ │ +466 inline static void init(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ +467 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck:: │ │ │ │ +isDereferenciable(mesh, heh) && lap_counter == 0 ) │ │ │ │ +468 increment(mesh, heh, start, lap_counter); │ │ │ │ +469 }; │ │ │ │ +470 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +471 do { │ │ │ │ +472 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ +_i_n_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ +473 } while (is_valid(heh, start, lap_counter) && │ │ │ │ +!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ +474 } │ │ │ │ +475 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ +&lap_counter) { │ │ │ │ +476 do { │ │ │ │ +477 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ +_d_e_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ +478 } while (is_valid(heh, start, lap_counter) && │ │ │ │ +!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ +479 } │ │ │ │ +480}; │ │ │ │ +481 │ │ │ │ +482template │ │ │ │ +_4_8_3class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D : protected │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T { │ │ │ │ +484 public: │ │ │ │ +485 using Mesh = typename GenericCirculatorT_DEPRECATED_TraitsT::Mesh; │ │ │ │ +486 using CenterEntityHandle = typename GenericCirculatorT_DEPRECATED_TraitsT:: │ │ │ │ +CenterEntityHandle; │ │ │ │ +487 using value_type = typename GenericCirculatorT_DEPRECATED_TraitsT:: │ │ │ │ +ValueHandle; │ │ │ │ +488 using smart_value_type = decltype (_m_a_k_e___s_m_a_r_t(std::declval(), │ │ │ │ +std::declval())); │ │ │ │ +489 │ │ │ │ +490 typedef std::ptrdiff_t difference_type; │ │ │ │ +491 typedef const value_type& reference; │ │ │ │ +492 typedef const smart_value_type* pointer; │ │ │ │ +493 typedef std::bidirectional_iterator_tag iterator_category; │ │ │ │ +494 │ │ │ │ +495 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___p_t_r _m_e_s_h___p_t_r; │ │ │ │ +496 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___r_e_f _m_e_s_h___r_e_f; │ │ │ │ +497 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D_<_M_e_s_h_, │ │ │ │ +_C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _v_a_l_u_e___t_y_p_e_> _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s; │ │ │ │ +498 │ │ │ │ +499 template friend class _O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ +500 │ │ │ │ +501 public: │ │ │ │ +502 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D() {} │ │ │ │ +503 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D(_m_e_s_h___r_e_f mesh, CenterEntityHandle start, bool │ │ │ │ +end = false) : │ │ │ │ +504 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, mesh.halfedge_handle(start), end) { │ │ │ │ +505 │ │ │ │ +506 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_); │ │ │ │ +507 } │ │ │ │ +508 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D(_m_e_s_h___r_e_f mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +heh, bool end = false) : │ │ │ │ +509 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, heh, end) { │ │ │ │ +510 │ │ │ │ +511 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_); │ │ │ │ +512 } │ │ │ │ +513 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D &rhs) : │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(rhs) {} │ │ │ │ +514 │ │ │ │ +515 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D& operator++() { │ │ │ │ +516 assert(this->mesh_); │ │ │ │ +517 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_); │ │ │ │ +518 return *this; │ │ │ │ +519 } │ │ │ │ +520#ifndef NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ +521#define DECREMENT_DEPRECATED_WARNINGS_TEXT "The current decrement operator │ │ │ │ +has the unintended behavior that it stays\ │ │ │ │ +522 valid when iterating below the start and will visit the first entity\ │ │ │ │ +523 twice before getting invalid. Furthermore it gets valid again, if you\ │ │ │ │ +524 increment at the end.\ │ │ │ │ +525 When you are sure that you don't iterate below the start anywhere in\ │ │ │ │ +526 your code or rely on this behaviour, you can disable this warning by\ │ │ │ │ +527 setting the define NO_DECREMENT_DEPRECATED_WARNINGS at the command line (or │ │ │ │ +enable it via the\ │ │ │ │ +528 cmake flags).\ │ │ │ │ +529 To be save, you can use the CW/CCW circulator definitions, which behave\ │ │ │ │ +530 the same as the original ones, without the previously mentioned issues." │ │ │ │ +531 │ │ │ │ +532 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT ) │ │ │ │ +533#endif // NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ +534 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D& operator--() { │ │ │ │ +535 assert(this->mesh_); │ │ │ │ +536 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this- │ │ │ │ +>start_, this->lap_counter_); │ │ │ │ +537 return *this; │ │ │ │ +538 } │ │ │ │ +539 │ │ │ │ +_5_4_1 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D _o_p_e_r_a_t_o_r_+_+(int) { │ │ │ │ +542 assert(this->mesh_); │ │ │ │ +543 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D cpy(*this); │ │ │ │ +544 ++(*this); │ │ │ │ +545 return cpy; │ │ │ │ +546 } │ │ │ │ +547 │ │ │ │ +549#ifndef NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ +550 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT ) │ │ │ │ +551#undef DECREMENT_DEPRECATED_WARNINGS_TEXT │ │ │ │ +552#endif //NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ +_5_5_3 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D _o_p_e_r_a_t_o_r_-_-(int) { │ │ │ │ +554 assert(this->mesh_); │ │ │ │ +555 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D cpy(*this); │ │ │ │ +556 --(*this); │ │ │ │ +557 return cpy; │ │ │ │ +558 } │ │ │ │ +559 │ │ │ │ +_5_6_1 smart_value_type _o_p_e_r_a_t_o_r_*() const { │ │ │ │ +562#ifndef NDEBUG │ │ │ │ +563 assert(this->heh_.is_valid()); │ │ │ │ +564 value_type res = (GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this- │ │ │ │ +>mesh_, this->heh_)); │ │ │ │ +565 assert(res.is_valid()); │ │ │ │ +566 return _m_a_k_e___s_m_a_r_t(res, this->mesh_); │ │ │ │ +567#else │ │ │ │ +568 return _m_a_k_e___s_m_a_r_t(GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this- │ │ │ │ +>mesh_, this->heh_), this->mesh_); │ │ │ │ +569#endif │ │ │ │ +570 } │ │ │ │ +571 │ │ │ │ +_5_8_0 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ +581 pointer_deref_value = **this; │ │ │ │ +582 return &pointer_deref_value; │ │ │ │ +583 } │ │ │ │ +584 │ │ │ │ +585 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D &operator=(const │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D &rhs) { │ │ │ │ +586 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_o_p_e_r_a_t_o_r_=(rhs); │ │ │ │ +587 return *this; │ │ │ │ +588 }; │ │ │ │ +589 │ │ │ │ +590 bool operator==(const GenericCirculatorT_DEPRECATED &rhs) const { │ │ │ │ +591 return GenericCirculatorBaseT::operator==(rhs); │ │ │ │ +592 } │ │ │ │ +593 │ │ │ │ +594 bool operator!=(const GenericCirculatorT_DEPRECATED &rhs) const { │ │ │ │ +595 return GenericCirculatorBaseT::operator!=(rhs); │ │ │ │ +596 } │ │ │ │ +597 │ │ │ │ +598 bool is_valid() const { │ │ │ │ +599 return GenericCirculator_ValueHandleFns::is_valid(this->heh_,this->start_, │ │ │ │ +this->lap_counter_); │ │ │ │ +600 } │ │ │ │ +601 │ │ │ │ +602 OM_DEPRECATED("current_halfedge_handle() is an implementation detail and │ │ │ │ +should not be accessed from outside the iterator class.") │ │ │ │ +_6_0_8 const typename Mesh::_H_a_l_f_e_d_g_e_H_a_n_d_l_e &_c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e() const { │ │ │ │ +609 return this->heh_; │ │ │ │ +610 } │ │ │ │ +611 │ │ │ │ +612 OM_DEPRECATED("Do not use this error prone implicit cast. Compare to end- │ │ │ │ +iterator or use is_valid(), instead.") │ │ │ │ +_6_1_8 operator bool() const { │ │ │ │ +619 return is_valid(); │ │ │ │ +620 } │ │ │ │ +621 │ │ │ │ +627 OM_DEPRECATED("This function clutters your code. Use dereferencing │ │ │ │ +operators -> and * instead.") │ │ │ │ +_6_2_8 smart_value_type _h_a_n_d_l_e() const { │ │ │ │ +629 return **this; │ │ │ │ +630 } │ │ │ │ +631 │ │ │ │ +638 OM_DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing │ │ │ │ +operators -> and * instead.") │ │ │ │ +_6_3_9 operator value_type() const { │ │ │ │ +640 return **this; │ │ │ │ +641 } │ │ │ │ +642 │ │ │ │ +643 template │ │ │ │ +644 friend STREAM &operator<< (STREAM &s, const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ +&self) { │ │ │ │ +645 return s << self.mesh_ << ", " << self.start_.idx() << ", " << │ │ │ │ +self.heh_.idx() << ", " << self.lap_counter_; │ │ │ │ +646 } │ │ │ │ +647 │ │ │ │ +648 private: │ │ │ │ +649 mutable smart_value_type pointer_deref_value; │ │ │ │ +650}; │ │ │ │ +651 │ │ │ │ +652} // namespace Iterators │ │ │ │ +653} // namespace OpenMesh │ │ │ │ +654 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options │ │ │ │ -_opt=Options::Default) │ │ │ │ -Get binary size of data. │ │ │ │ -DDeeffiinniittiioonn MeshIO.hh:251 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_w_r_i_t_e___m_e_s_h │ │ │ │ -bool write_mesh(const Mesh &_mesh, const std::string &_filename, Options │ │ │ │ -_opt=Options::Default, std::streamsize _precision=6) │ │ │ │ -Write a mesh to the file _filename. │ │ │ │ -DDeeffiinniittiioonn MeshIO.hh:190 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_a_d___m_e_s_h │ │ │ │ -bool read_mesh(Mesh &_mesh, const std::string &_filename) │ │ │ │ -Read a mesh from file _filename. │ │ │ │ -DDeeffiinniittiioonn MeshIO.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_E_x_p_o_r_t_e_r_T │ │ │ │ -This class template provides an exporter module for OpenMesh meshes. │ │ │ │ -DDeeffiinniittiioonn ExporterT.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_I_m_p_o_r_t_e_r_T │ │ │ │ -This class template provides an importer module for OpenMesh meshes. │ │ │ │ -DDeeffiinniittiioonn ImporterT.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_w_r_i_t_e │ │ │ │ -bool write(const std::string &_filename, BaseExporter &_be, Options │ │ │ │ -_opt=Options::Default, std::streamsize _precision=6) │ │ │ │ -Write a mesh to file _filename. │ │ │ │ -DDeeffiinniittiioonn IOManager.cc:143 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_r_e_a_d │ │ │ │ -bool read(const std::string &_filename, BaseImporter &_bi, Options &_opt) │ │ │ │ -Read a mesh from file _filename. │ │ │ │ -DDeeffiinniittiioonn IOManager.cc:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t │ │ │ │ -@ Default │ │ │ │ -By default write persistent custom properties. │ │ │ │ -DDeeffiinniittiioonn Options.hh:117 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ +SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ +Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ +Generic class for iterator ranges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:175 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:240 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:305 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +smart_value_type operator*() const │ │ │ │ +Standard dereferencing operator. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:372 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ +GenericCirculatorT operator++(int) │ │ │ │ +Post-increment. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:356 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ +GenericCirculatorT operator--(int) │ │ │ │ +Post-decrement. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:364 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ +pointer operator->() const │ │ │ │ +Pointer dereferentiation. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:391 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:444 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:483 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ +GenericCirculatorT_DEPRECATED operator++(int) │ │ │ │ +Post-increment. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:541 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +const Mesh::HalfedgeHandle & current_halfedge_handle() const │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:608 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ +pointer operator->() const │ │ │ │ +Pointer dereferentiation. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:580 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ +GenericCirculatorT_DEPRECATED operator--(int) │ │ │ │ +Post-decrement. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:553 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +smart_value_type operator*() const │ │ │ │ +Standard dereferencing operator. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:561 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_h_a_n_d_l_e │ │ │ │ +smart_value_type handle() const │ │ │ │ +Return the handle of the current target. │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:628 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ Polygonal mesh based on the ArrayKernel. │ │ │ │ DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00593_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/exporter/ExporterT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/Status.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
ExporterT.hh
│ │ │ +
Status.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -141,415 +141,155 @@ │ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45//=============================================================================
│ │ │
46//
│ │ │ -
47// Implements an exporter module for arbitrary OpenMesh meshes
│ │ │ +
47// CLASS Status
│ │ │
48//
│ │ │
49//=============================================================================
│ │ │
50
│ │ │
51
│ │ │ -
52#ifndef __EXPORTERT_HH__
│ │ │ -
53#define __EXPORTERT_HH__
│ │ │ +
52#ifndef OPENMESH_ATTRIBUTE_STATUS_HH
│ │ │ +
53#define OPENMESH_ATTRIBUTE_STATUS_HH
│ │ │
54
│ │ │
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ +
56//== INCLUDES =================================================================
│ │ │
57
│ │ │ -
58// C++
│ │ │ -
59#include <vector>
│ │ │ +
58#include <OpenMesh/Core/System/config.h>
│ │ │ +
59
│ │ │
60
│ │ │ -
61// OpenMesh
│ │ │ -
62#include <OpenMesh/Core/System/config.h>
│ │ │ -
63#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ -
64#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
65#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ -
66#include <OpenMesh/Core/Utils/color_cast.hh>
│ │ │ -
67#include <OpenMesh/Core/Utils/Predicates.hh>
│ │ │ -
68#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ -
69#include <OpenMesh/Core/IO/OMFormat.hh>
│ │ │ +
61//== NAMESPACES ===============================================================
│ │ │ +
62
│ │ │ +
63
│ │ │ +
64namespace OpenMesh {
│ │ │ +
65namespace Attributes {
│ │ │ +
66
│ │ │ +
67
│ │ │ +
68//== CLASS DEFINITION ========================================================
│ │ │ +
69
│ │ │
70
│ │ │ -
71
│ │ │ -
72//=== NAMESPACES ==============================================================
│ │ │ -
73
│ │ │ -
74namespace OpenMesh {
│ │ │ -
75namespace IO {
│ │ │ -
76
│ │ │ -
77
│ │ │ -
78//=== EXPORTER CLASS ==========================================================
│ │ │ -
79
│ │ │ -
83template <class Mesh>
│ │ │ -
│ │ │ -
84class ExporterT : public BaseExporter
│ │ │ -
85{
│ │ │ -
86public:
│ │ │ +
│ │ │ + │ │ │ +
75
│ │ │ +
76 DELETED = 1,
│ │ │ +
77 LOCKED = 2,
│ │ │ + │ │ │ +
79 HIDDEN = 8,
│ │ │ +
80 FEATURE = 16,
│ │ │ +
81 TAGGED = 32,
│ │ │ +
82 TAGGED2 = 64,
│ │ │ + │ │ │ +
84 UNUSED = 256
│ │ │ +
85};
│ │ │ +
│ │ │ +
86
│ │ │
87
│ │ │ -
88 // Constructor
│ │ │ -
89 explicit ExporterT(const Mesh& _mesh) : mesh_(_mesh) {}
│ │ │ -
90
│ │ │ -
91
│ │ │ -
92 // get vertex data
│ │ │ -
93
│ │ │ -
94 Vec3f point(VertexHandle _vh) const override
│ │ │ -
95 {
│ │ │ -
96 return vector_cast<Vec3f>(mesh_.point(_vh));
│ │ │ -
97 }
│ │ │ -
98
│ │ │ -
99 Vec3d pointd(VertexHandle _vh) const override
│ │ │ -
100 {
│ │ │ -
101 return vector_cast<Vec3d>(mesh_.point(_vh));
│ │ │ -
102 }
│ │ │ -
103
│ │ │ -
104 bool is_point_double() const override
│ │ │ -
105 {
│ │ │ -
106 return OMFormat::is_double(typename Mesh::Point()[0]);
│ │ │ -
107 }
│ │ │ -
108
│ │ │ -
109 bool is_normal_double() const override
│ │ │ -
110 {
│ │ │ -
111 return OMFormat::is_double(typename Mesh::Normal()[0]);
│ │ │ -
112 }
│ │ │ +
│ │ │ + │ │ │ +
95{
│ │ │ +
96public:
│ │ │ +
97
│ │ │ +
98 typedef unsigned int value_type;
│ │ │ +
99
│ │ │ +
100 StatusInfo() : status_(0) {}
│ │ │ +
101
│ │ │ +
103 bool deleted() const { return is_bit_set(DELETED); }
│ │ │ +
105 void set_deleted(bool _b) { change_bit(DELETED, _b); }
│ │ │ +
106
│ │ │ +
107
│ │ │ +
109 bool locked() const { return is_bit_set(LOCKED); }
│ │ │ +
111 void set_locked(bool _b) { change_bit(LOCKED, _b); }
│ │ │ +
112
│ │ │
113
│ │ │ -
114 Vec3f normal(VertexHandle _vh) const override
│ │ │ -
115 {
│ │ │ -
116 return (mesh_.has_vertex_normals()
│ │ │ -
117 ? vector_cast<Vec3f>(mesh_.normal(_vh))
│ │ │ -
118 : Vec3f(0.0f, 0.0f, 0.0f));
│ │ │ -
119 }
│ │ │ -
120
│ │ │ -
121 Vec3d normald(VertexHandle _vh) const override
│ │ │ -
122 {
│ │ │ -
123 return (mesh_.has_vertex_normals()
│ │ │ -
124 ? vector_cast<Vec3d>(mesh_.normal(_vh))
│ │ │ -
125 : Vec3d(0.0f, 0.0f, 0.0f));
│ │ │ -
126 }
│ │ │ -
127
│ │ │ -
128 Vec3uc color(VertexHandle _vh) const override
│ │ │ -
129 {
│ │ │ -
130 return (mesh_.has_vertex_colors()
│ │ │ -
131 ? color_cast<Vec3uc>(mesh_.color(_vh))
│ │ │ -
132 : Vec3uc(0, 0, 0));
│ │ │ -
133 }
│ │ │ -
134
│ │ │ -
135 Vec4uc colorA(VertexHandle _vh) const override
│ │ │ -
136 {
│ │ │ -
137 return (mesh_.has_vertex_colors()
│ │ │ -
138 ? color_cast<Vec4uc>(mesh_.color(_vh))
│ │ │ -
139 : Vec4uc(0, 0, 0, 0));
│ │ │ -
140 }
│ │ │ -
141
│ │ │ -
142 Vec3ui colori(VertexHandle _vh) const override
│ │ │ -
143 {
│ │ │ -
144 return (mesh_.has_vertex_colors()
│ │ │ -
145 ? color_cast<Vec3ui>(mesh_.color(_vh))
│ │ │ -
146 : Vec3ui(0, 0, 0));
│ │ │ -
147 }
│ │ │ +
115 bool selected() const { return is_bit_set(SELECTED); }
│ │ │ +
117 void set_selected(bool _b) { change_bit(SELECTED, _b); }
│ │ │ +
118
│ │ │ +
119
│ │ │ +
121 bool hidden() const { return is_bit_set(HIDDEN); }
│ │ │ +
123 void set_hidden(bool _b) { change_bit(HIDDEN, _b); }
│ │ │ +
124
│ │ │ +
125
│ │ │ +
127 bool feature() const { return is_bit_set(FEATURE); }
│ │ │ +
129 void set_feature(bool _b) { change_bit(FEATURE, _b); }
│ │ │ +
130
│ │ │ +
131
│ │ │ +
133 bool tagged() const { return is_bit_set(TAGGED); }
│ │ │ +
135 void set_tagged(bool _b) { change_bit(TAGGED, _b); }
│ │ │ +
136
│ │ │ +
137
│ │ │ +
139 bool tagged2() const { return is_bit_set(TAGGED2); }
│ │ │ +
141 void set_tagged2(bool _b) { change_bit(TAGGED2, _b); }
│ │ │ +
142
│ │ │ +
143
│ │ │ + │ │ │ + │ │ │
148
│ │ │ -
149 Vec4ui colorAi(VertexHandle _vh) const override
│ │ │ -
150 {
│ │ │ -
151 return (mesh_.has_vertex_colors()
│ │ │ -
152 ? color_cast<Vec4ui>(mesh_.color(_vh))
│ │ │ -
153 : Vec4ui(0, 0, 0, 0));
│ │ │ -
154 }
│ │ │ +
149
│ │ │ +
151 unsigned int bits() const { return status_; }
│ │ │ +
153 void set_bits(unsigned int _bits) { status_ = _bits; }
│ │ │ +
154
│ │ │
155
│ │ │ -
156 Vec3f colorf(VertexHandle _vh) const override
│ │ │ -
157 {
│ │ │ -
158 return (mesh_.has_vertex_colors()
│ │ │ -
159 ? color_cast<Vec3f>(mesh_.color(_vh))
│ │ │ -
160 : Vec3f(0, 0, 0));
│ │ │ -
161 }
│ │ │ -
162
│ │ │ -
163 Vec4f colorAf(VertexHandle _vh) const override
│ │ │ -
164 {
│ │ │ -
165 return (mesh_.has_vertex_colors()
│ │ │ -
166 ? color_cast<Vec4f>(mesh_.color(_vh))
│ │ │ -
167 : Vec4f(0, 0, 0, 0));
│ │ │ -
168 }
│ │ │ -
169
│ │ │ -
170 Vec2f texcoord(VertexHandle _vh) const override
│ │ │ -
171 {
│ │ │ -
172#if defined(OM_CC_GCC) && (OM_CC_VERSION<30000)
│ │ │ -
173 // Workaround!
│ │ │ -
174 // gcc 2.95.3 exits with internal compiler error at the
│ │ │ -
175 // code below!??? **)
│ │ │ -
176 if (mesh_.has_vertex_texcoords2D())
│ │ │ -
177 return vector_cast<Vec2f>(mesh_.texcoord2D(_vh));
│ │ │ -
178 return Vec2f(0.0f, 0.0f);
│ │ │ -
179#else // **)
│ │ │ -
180 return (mesh_.has_vertex_texcoords2D()
│ │ │ -
181 ? vector_cast<Vec2f>(mesh_.texcoord2D(_vh))
│ │ │ -
182 : Vec2f(0.0f, 0.0f));
│ │ │ -
183#endif
│ │ │ -
184 }
│ │ │ -
185
│ │ │ -
186 Vec2f texcoord(HalfedgeHandle _heh) const override
│ │ │ -
187 {
│ │ │ -
188 return (mesh_.has_halfedge_texcoords2D()
│ │ │ -
189 ? vector_cast<Vec2f>(mesh_.texcoord2D(_heh))
│ │ │ -
190 : Vec2f(0.0f, 0.0f));
│ │ │ -
191 }
│ │ │ -
192
│ │ │ -
193 OpenMesh::Attributes::StatusInfo status(VertexHandle _vh) const override
│ │ │ -
194 {
│ │ │ -
195 if (mesh_.has_vertex_status())
│ │ │ -
196 return mesh_.status(_vh);
│ │ │ - │ │ │ -
198 }
│ │ │ -
199
│ │ │ -
200 // get edge data
│ │ │ -
201
│ │ │ -
202 Vec3uc color(EdgeHandle _eh) const override
│ │ │ -
203 {
│ │ │ -
204 return (mesh_.has_edge_colors()
│ │ │ -
205 ? color_cast<Vec3uc>(mesh_.color(_eh))
│ │ │ -
206 : Vec3uc(0, 0, 0));
│ │ │ -
207 }
│ │ │ -
208
│ │ │ -
209 Vec4uc colorA(EdgeHandle _eh) const override
│ │ │ -
210 {
│ │ │ -
211 return (mesh_.has_edge_colors()
│ │ │ -
212 ? color_cast<Vec4uc>(mesh_.color(_eh))
│ │ │ -
213 : Vec4uc(0, 0, 0, 0));
│ │ │ -
214 }
│ │ │ -
215
│ │ │ -
216 Vec3ui colori(EdgeHandle _eh) const override
│ │ │ -
217 {
│ │ │ -
218 return (mesh_.has_edge_colors()
│ │ │ -
219 ? color_cast<Vec3ui>(mesh_.color(_eh))
│ │ │ -
220 : Vec3ui(0, 0, 0));
│ │ │ -
221 }
│ │ │ -
222
│ │ │ -
223 Vec4ui colorAi(EdgeHandle _eh) const override
│ │ │ -
224 {
│ │ │ -
225 return (mesh_.has_edge_colors()
│ │ │ -
226 ? color_cast<Vec4ui>(mesh_.color(_eh))
│ │ │ -
227 : Vec4ui(0, 0, 0, 0));
│ │ │ -
228 }
│ │ │ -
229
│ │ │ -
230 Vec3f colorf(EdgeHandle _eh) const override
│ │ │ -
231 {
│ │ │ -
232 return (mesh_.has_vertex_colors()
│ │ │ -
233 ? color_cast<Vec3f>(mesh_.color(_eh))
│ │ │ -
234 : Vec3f(0, 0, 0));
│ │ │ -
235 }
│ │ │ -
236
│ │ │ -
237 Vec4f colorAf(EdgeHandle _eh) const override
│ │ │ -
238 {
│ │ │ -
239 return (mesh_.has_vertex_colors()
│ │ │ -
240 ? color_cast<Vec4f>(mesh_.color(_eh))
│ │ │ -
241 : Vec4f(0, 0, 0, 0));
│ │ │ -
242 }
│ │ │ -
243
│ │ │ -
244 OpenMesh::Attributes::StatusInfo status(EdgeHandle _eh) const override
│ │ │ -
245 {
│ │ │ -
246 if (mesh_.has_edge_status())
│ │ │ -
247 return mesh_.status(_eh);
│ │ │ - │ │ │ -
249 }
│ │ │ -
250
│ │ │ -
251 // get halfedge data
│ │ │ -
252
│ │ │ -
253 int get_halfedge_id(VertexHandle _vh) override
│ │ │ -
254 {
│ │ │ -
255 return mesh_.halfedge_handle(_vh).idx();
│ │ │ -
256 }
│ │ │ -
257
│ │ │ -
258 int get_halfedge_id(FaceHandle _fh) override
│ │ │ -
259 {
│ │ │ -
260 return mesh_.halfedge_handle(_fh).idx();
│ │ │ -
261 }
│ │ │ -
262
│ │ │ -
263 int get_next_halfedge_id(HalfedgeHandle _heh) override
│ │ │ -
264 {
│ │ │ -
265 return mesh_.next_halfedge_handle(_heh).idx();
│ │ │ -
266 }
│ │ │ -
267
│ │ │ -
268 int get_to_vertex_id(HalfedgeHandle _heh) override
│ │ │ -
269 {
│ │ │ -
270 return mesh_.to_vertex_handle(_heh).idx();
│ │ │ -
271 }
│ │ │ -
272
│ │ │ -
273 int get_face_id(HalfedgeHandle _heh) override
│ │ │ -
274 {
│ │ │ -
275 return mesh_.face_handle(_heh).idx();
│ │ │ -
276 }
│ │ │ -
277
│ │ │ -
278 OpenMesh::Attributes::StatusInfo status(HalfedgeHandle _heh) const override
│ │ │ -
279 {
│ │ │ -
280 if (mesh_.has_halfedge_status())
│ │ │ -
281 return mesh_.status(_heh);
│ │ │ - │ │ │ -
283 }
│ │ │ -
284
│ │ │ -
285 // get face data
│ │ │ -
286
│ │ │ -
287 unsigned int get_vhandles(FaceHandle _fh,
│ │ │ -
288 std::vector<VertexHandle>& _vhandles) const override
│ │ │ -
289 {
│ │ │ -
290 unsigned int count(0);
│ │ │ -
291 _vhandles.clear();
│ │ │ -
292 for (typename Mesh::CFVIter fv_it=mesh_.cfv_iter(_fh); fv_it.is_valid(); ++fv_it)
│ │ │ -
293 {
│ │ │ -
294 _vhandles.push_back(*fv_it);
│ │ │ -
295 ++count;
│ │ │ -
296 }
│ │ │ -
297 return count;
│ │ │ -
298 }
│ │ │ -
299
│ │ │ -
300 unsigned int get_face_texcoords(std::vector<Vec2f>& _hehandles) const override
│ │ │ -
301 {
│ │ │ -
302 unsigned int count(0);
│ │ │ -
303 _hehandles.clear();
│ │ │ -
304 for(auto heh: mesh_.halfedges().filtered(!OpenMesh::Predicates::Boundary()))
│ │ │ -
305 {
│ │ │ -
306 _hehandles.push_back(vector_cast<Vec2f>(mesh_.texcoord2D(heh)));
│ │ │ -
307 ++count;
│ │ │ -
308 }
│ │ │ -
309
│ │ │ -
310 return count;
│ │ │ -
311 }
│ │ │ -
312
│ │ │ -
│ │ │ - │ │ │ -
314 {
│ │ │ -
315 typename Mesh::ConstFaceHalfedgeIter fh_it;
│ │ │ -
316 for(fh_it = mesh_.cfh_iter(_fh); fh_it.is_valid();++fh_it)
│ │ │ -
317 {
│ │ │ -
318 if(mesh_.to_vertex_handle(*fh_it) == _vh)
│ │ │ -
319 return *fh_it;
│ │ │ -
320 }
│ │ │ -
321 return *fh_it;
│ │ │ -
322 }
│ │ │ +
157 bool is_bit_set(unsigned int _s) const { return (status_ & _s) > 0; }
│ │ │ +
159 void set_bit(unsigned int _s) { status_ |= _s; }
│ │ │ +
161 void unset_bit(unsigned int _s) { status_ &= ~_s; }
│ │ │ +
│ │ │ +
163 void change_bit(unsigned int _s, bool _b) {
│ │ │ +
164 if (_b) status_ |= _s; else status_ &= ~_s; }
│ │ │
│ │ │ -
323
│ │ │ -
324 Vec3f normal(FaceHandle _fh) const override
│ │ │ -
325 {
│ │ │ -
326 return (mesh_.has_face_normals()
│ │ │ -
327 ? vector_cast<Vec3f>(mesh_.normal(_fh))
│ │ │ -
328 : Vec3f(0.0f, 0.0f, 0.0f));
│ │ │ -
329 }
│ │ │ -
330
│ │ │ -
331 Vec3d normald(FaceHandle _fh) const override
│ │ │ -
332 {
│ │ │ -
333 return (mesh_.has_face_normals()
│ │ │ -
334 ? vector_cast<Vec3d>(mesh_.normal(_fh))
│ │ │ -
335 : Vec3d(0.0, 0.0, 0.0));
│ │ │ -
336 }
│ │ │ -
337
│ │ │ -
338 Vec3uc color(FaceHandle _fh) const override
│ │ │ -
339 {
│ │ │ -
340 return (mesh_.has_face_colors()
│ │ │ -
341 ? color_cast<Vec3uc>(mesh_.color(_fh))
│ │ │ -
342 : Vec3uc(0, 0, 0));
│ │ │ -
343 }
│ │ │ -
344
│ │ │ -
345 Vec4uc colorA(FaceHandle _fh) const override
│ │ │ -
346 {
│ │ │ -
347 return (mesh_.has_face_colors()
│ │ │ -
348 ? color_cast<Vec4uc>(mesh_.color(_fh))
│ │ │ -
349 : Vec4uc(0, 0, 0, 0));
│ │ │ -
350 }
│ │ │ -
351
│ │ │ -
352 Vec3ui colori(FaceHandle _fh) const override
│ │ │ -
353 {
│ │ │ -
354 return (mesh_.has_face_colors()
│ │ │ -
355 ? color_cast<Vec3ui>(mesh_.color(_fh))
│ │ │ -
356 : Vec3ui(0, 0, 0));
│ │ │ -
357 }
│ │ │ -
358
│ │ │ -
359 Vec4ui colorAi(FaceHandle _fh) const override
│ │ │ -
360 {
│ │ │ -
361 return (mesh_.has_face_colors()
│ │ │ -
362 ? color_cast<Vec4ui>(mesh_.color(_fh))
│ │ │ -
363 : Vec4ui(0, 0, 0, 0));
│ │ │ -
364 }
│ │ │ -
365
│ │ │ -
366 Vec3f colorf(FaceHandle _fh) const override
│ │ │ -
367 {
│ │ │ -
368 return (mesh_.has_face_colors()
│ │ │ -
369 ? color_cast<Vec3f>(mesh_.color(_fh))
│ │ │ -
370 : Vec3f(0, 0, 0));
│ │ │ -
371 }
│ │ │ -
372
│ │ │ -
373 Vec4f colorAf(FaceHandle _fh) const override
│ │ │ -
374 {
│ │ │ -
375 return (mesh_.has_face_colors()
│ │ │ -
376 ? color_cast<Vec4f>(mesh_.color(_fh))
│ │ │ -
377 : Vec4f(0, 0, 0, 0));
│ │ │ -
378 }
│ │ │ -
379
│ │ │ -
380 OpenMesh::Attributes::StatusInfo status(FaceHandle _fh) const override
│ │ │ -
381 {
│ │ │ -
382 if (mesh_.has_face_status())
│ │ │ -
383 return mesh_.status(_fh);
│ │ │ - │ │ │ -
385 }
│ │ │ -
386
│ │ │ -
387 virtual const BaseKernel* kernel() override { return &mesh_; }
│ │ │ -
388
│ │ │ -
389
│ │ │ -
390 // query number of faces, vertices, normals, texcoords
│ │ │ -
391 size_t n_vertices() const override { return mesh_.n_vertices(); }
│ │ │ -
392 size_t n_faces() const override { return mesh_.n_faces(); }
│ │ │ -
393 size_t n_edges() const override { return mesh_.n_edges(); }
│ │ │ -
394
│ │ │ -
395
│ │ │ -
396 // property information
│ │ │ -
397 bool is_triangle_mesh() const override
│ │ │ -
398 { return Mesh::is_triangles(); }
│ │ │ -
399
│ │ │ -
400 bool has_vertex_normals() const override { return mesh_.has_vertex_normals(); }
│ │ │ -
401 bool has_vertex_colors() const override { return mesh_.has_vertex_colors(); }
│ │ │ -
402 bool has_vertex_texcoords() const override { return mesh_.has_vertex_texcoords2D(); }
│ │ │ -
403 bool has_vertex_status() const override { return mesh_.has_vertex_status(); }
│ │ │ -
404 bool has_edge_colors() const override { return mesh_.has_edge_colors(); }
│ │ │ -
405 bool has_edge_status() const override { return mesh_.has_edge_status(); }
│ │ │ -
406 bool has_halfedge_status() const override { return mesh_.has_halfedge_status(); }
│ │ │ -
407 bool has_face_normals() const override { return mesh_.has_face_normals(); }
│ │ │ -
408 bool has_face_colors() const override { return mesh_.has_face_colors(); }
│ │ │ -
409 bool has_face_status() const override { return mesh_.has_face_status(); }
│ │ │ -
410
│ │ │ -
411private:
│ │ │ -
412
│ │ │ -
413 const Mesh& mesh_;
│ │ │ -
414};
│ │ │ +
165
│ │ │ +
166
│ │ │ +
167private:
│ │ │ +
168
│ │ │ +
169 value_type status_;
│ │ │ +
170};
│ │ │
│ │ │ -
415
│ │ │ -
416
│ │ │ -
417//=============================================================================
│ │ │ -
418} // namespace IO
│ │ │ -
419} // namespace OpenMesh
│ │ │ -
420//=============================================================================
│ │ │ -
421#endif
│ │ │ -
422//=============================================================================
│ │ │ +
171
│ │ │ +
172
│ │ │ +
173//=============================================================================
│ │ │ +
174} // namespace Attributes
│ │ │ +
175} // namespace OpenMesh
│ │ │ +
176//=============================================================================
│ │ │ +
177#endif // OPENMESH_ATTRIBUTE_STATUS_HH defined
│ │ │ +
178//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
VectorT< double, 3 > Vec3d
3-double vector
Definition Vector11T.hh:853
│ │ │ -
VectorT< float, 2 > Vec2f
2-float vector
Definition Vector11T.hh:834
│ │ │ -
VectorT< unsigned int, 4 > Vec4ui
4-int unsigned vector
Definition Vector11T.hh:868
│ │ │ -
VectorT< unsigned char, 3 > Vec3uc
3-byte unsigned vector
Definition Vector11T.hh:841
│ │ │ -
VectorT< float, 4 > Vec4f
4-float vector
Definition Vector11T.hh:870
│ │ │ -
VectorT< unsigned char, 4 > Vec4uc
4-byte unsigned vector
Definition Vector11T.hh:860
│ │ │ -
VectorT< unsigned int, 3 > Vec3ui
3-int unsigned vector
Definition Vector11T.hh:849
│ │ │ -
VectorT< float, 3 > Vec3f
3-float vector
Definition Vector11T.hh:851
│ │ │ - │ │ │ - │ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
This class template provides an exporter module for OpenMesh meshes.
Definition ExporterT.hh:85
│ │ │ -
HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const override
getHeh returns the HalfEdgeHandle that belongs to the face specified by _fh and has a toVertexHandle ...
Definition ExporterT.hh:313
│ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:178
│ │ │ -
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ -
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
StatusBits
Status bits used by the Status class.
Definition Status.hh:74
│ │ │ +
@ TAGGED2
Alternate bit for tagging an item.
Definition Status.hh:82
│ │ │ +
@ LOCKED
Item is locked.
Definition Status.hh:77
│ │ │ +
@ FIXEDNONMANIFOLD
Item was non-two-manifold and had to be fixed.
Definition Status.hh:83
│ │ │ +
@ DELETED
Item has been deleted.
Definition Status.hh:76
│ │ │ +
@ SELECTED
Item is selected.
Definition Status.hh:78
│ │ │ +
@ UNUSED
Unused.
Definition Status.hh:84
│ │ │ +
@ HIDDEN
Item is hidden.
Definition Status.hh:79
│ │ │ +
@ TAGGED
Item is tagged.
Definition Status.hh:81
│ │ │ +
@ FEATURE
Item is a feature or belongs to a feature.
Definition Status.hh:80
│ │ │
Add status information to a base class.
Definition Status.hh:95
│ │ │ -
Definition Predicates.hh:239
│ │ │ +
void set_fixed_nonmanifold(bool _b)
set fixed non-manifold
Definition Status.hh:147
│ │ │ +
void set_hidden(bool _b)
set hidden
Definition Status.hh:123
│ │ │ +
bool deleted() const
is deleted ?
Definition Status.hh:103
│ │ │ +
void set_selected(bool _b)
set selected
Definition Status.hh:117
│ │ │ +
void set_tagged2(bool _b)
set tagged
Definition Status.hh:141
│ │ │ +
bool tagged() const
is tagged ?
Definition Status.hh:133
│ │ │ +
bool is_bit_set(unsigned int _s) const
is a certain bit set ?
Definition Status.hh:157
│ │ │ +
void set_bits(unsigned int _bits)
set whole status at once
Definition Status.hh:153
│ │ │ +
bool locked() const
is locked ?
Definition Status.hh:109
│ │ │ +
void set_locked(bool _b)
set locked
Definition Status.hh:111
│ │ │ +
void set_deleted(bool _b)
set deleted
Definition Status.hh:105
│ │ │ +
void set_feature(bool _b)
set feature
Definition Status.hh:129
│ │ │ +
void set_bit(unsigned int _s)
set a certain bit
Definition Status.hh:159
│ │ │ +
void set_tagged(bool _b)
set tagged
Definition Status.hh:135
│ │ │ +
void change_bit(unsigned int _s, bool _b)
set or unset a certain bit
Definition Status.hh:163
│ │ │ +
bool feature() const
is feature ?
Definition Status.hh:127
│ │ │ +
bool tagged2() const
is tagged2 ? This is just one more tag info.
Definition Status.hh:139
│ │ │ +
bool fixed_nonmanifold() const
is fixed non-manifold ?
Definition Status.hh:145
│ │ │ +
unsigned int bits() const
return whole status
Definition Status.hh:151
│ │ │ +
bool selected() const
is selected ?
Definition Status.hh:115
│ │ │ +
void unset_bit(unsigned int _s)
unset a certain bit
Definition Status.hh:161
│ │ │ +
bool hidden() const
is hidden ?
Definition Status.hh:121
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -ExporterT.hh │ │ │ │ +Status.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -51,479 +51,253 @@ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45// │ │ │ │ ============================================================================= │ │ │ │ 46// │ │ │ │ -47// Implements an exporter module for arbitrary OpenMesh meshes │ │ │ │ +47// CLASS Status │ │ │ │ 48// │ │ │ │ 49// │ │ │ │ ============================================================================= │ │ │ │ 50 │ │ │ │ 51 │ │ │ │ -52#ifndef __EXPORTERT_HH__ │ │ │ │ -53#define __EXPORTERT_HH__ │ │ │ │ +52#ifndef OPENMESH_ATTRIBUTE_STATUS_HH │ │ │ │ +53#define OPENMESH_ATTRIBUTE_STATUS_HH │ │ │ │ 54 │ │ │ │ 55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 57 │ │ │ │ -58// C++ │ │ │ │ -59#include │ │ │ │ +58#include │ │ │ │ +59 │ │ │ │ 60 │ │ │ │ -61// OpenMesh │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66#include │ │ │ │ -67#include │ │ │ │ -68#include │ │ │ │ -69#include │ │ │ │ +61//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +62 │ │ │ │ +63 │ │ │ │ +64namespace _O_p_e_n_M_e_s_h { │ │ │ │ +65namespace Attributes { │ │ │ │ +66 │ │ │ │ +67 │ │ │ │ +68//== CLASS DEFINITION │ │ │ │ +======================================================== │ │ │ │ +69 │ │ │ │ 70 │ │ │ │ -71 │ │ │ │ -72//=== NAMESPACES │ │ │ │ -============================================================== │ │ │ │ -73 │ │ │ │ -74namespace _O_p_e_n_M_e_s_h { │ │ │ │ -75namespace IO { │ │ │ │ -76 │ │ │ │ -77 │ │ │ │ -78//=== EXPORTER CLASS │ │ │ │ -========================================================== │ │ │ │ -79 │ │ │ │ -83template │ │ │ │ -_8_4class _E_x_p_o_r_t_e_r_T : public _B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -85{ │ │ │ │ -86public: │ │ │ │ +_7_4enum _S_t_a_t_u_s_B_i_t_s { │ │ │ │ +75 │ │ │ │ +_7_6 _D_E_L_E_T_E_D = 1, │ │ │ │ +_7_7 _L_O_C_K_E_D = 2, │ │ │ │ +_7_8 _S_E_L_E_C_T_E_D = 4, │ │ │ │ +_7_9 _H_I_D_D_E_N = 8, │ │ │ │ +_8_0 _F_E_A_T_U_R_E = 16, │ │ │ │ +_8_1 _T_A_G_G_E_D = 32, │ │ │ │ +_8_2 _T_A_G_G_E_D_2 = 64, │ │ │ │ +_8_3 _F_I_X_E_D_N_O_N_M_A_N_I_F_O_L_D = 128, │ │ │ │ +84 _U_N_U_S_E_D = 256 │ │ │ │ +_8_5}; │ │ │ │ +86 │ │ │ │ 87 │ │ │ │ -88 // Constructor │ │ │ │ -89 explicit _E_x_p_o_r_t_e_r_T(const _M_e_s_h& _mesh) : mesh_(_mesh) {} │ │ │ │ -90 │ │ │ │ -91 │ │ │ │ -92 // get vertex data │ │ │ │ -93 │ │ │ │ -94 _V_e_c_3_f point(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -95 { │ │ │ │ -96 return vector_cast(mesh_.point(_vh)); │ │ │ │ -97 } │ │ │ │ -98 │ │ │ │ -99 _V_e_c_3_d pointd(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -100 { │ │ │ │ -101 return vector_cast(mesh_.point(_vh)); │ │ │ │ -102 } │ │ │ │ -103 │ │ │ │ -104 bool is_point_double() const override │ │ │ │ -105 { │ │ │ │ -106 return OMFormat::is_double(typename _M_e_s_h_:_:_P_o_i_n_t()[0]); │ │ │ │ -107 } │ │ │ │ -108 │ │ │ │ -109 bool is_normal_double() const override │ │ │ │ -110 { │ │ │ │ -111 return OMFormat::is_double(typename _M_e_s_h_:_:_N_o_r_m_a_l()[0]); │ │ │ │ -112 } │ │ │ │ +_9_4class _S_t_a_t_u_s_I_n_f_o │ │ │ │ +95{ │ │ │ │ +96public: │ │ │ │ +97 │ │ │ │ +98 typedef unsigned int value_type; │ │ │ │ +99 │ │ │ │ +100 _S_t_a_t_u_s_I_n_f_o() : status_(0) {} │ │ │ │ +101 │ │ │ │ +_1_0_3 bool _d_e_l_e_t_e_d() const { return _i_s___b_i_t___s_e_t(_D_E_L_E_T_E_D); } │ │ │ │ +_1_0_5 void _s_e_t___d_e_l_e_t_e_d(bool _b) { _c_h_a_n_g_e___b_i_t(_D_E_L_E_T_E_D, _b); } │ │ │ │ +106 │ │ │ │ +107 │ │ │ │ +_1_0_9 bool _l_o_c_k_e_d() const { return _i_s___b_i_t___s_e_t(_L_O_C_K_E_D); } │ │ │ │ +_1_1_1 void _s_e_t___l_o_c_k_e_d(bool _b) { _c_h_a_n_g_e___b_i_t(_L_O_C_K_E_D, _b); } │ │ │ │ +112 │ │ │ │ 113 │ │ │ │ -114 _V_e_c_3_f normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -115 { │ │ │ │ -116 return (mesh_.has_vertex_normals() │ │ │ │ -117 ? vector_cast(mesh_.normal(_vh)) │ │ │ │ -118 : _V_e_c_3_f(0.0f, 0.0f, 0.0f)); │ │ │ │ -119 } │ │ │ │ -120 │ │ │ │ -121 _V_e_c_3_d normald(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -122 { │ │ │ │ -123 return (mesh_.has_vertex_normals() │ │ │ │ -124 ? vector_cast(mesh_.normal(_vh)) │ │ │ │ -125 : _V_e_c_3_d(0.0f, 0.0f, 0.0f)); │ │ │ │ -126 } │ │ │ │ -127 │ │ │ │ -128 _V_e_c_3_u_c color(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -129 { │ │ │ │ -130 return (mesh_.has_vertex_colors() │ │ │ │ -131 ? color_cast(mesh_.color(_vh)) │ │ │ │ -132 : _V_e_c_3_u_c(0, 0, 0)); │ │ │ │ -133 } │ │ │ │ -134 │ │ │ │ -135 _V_e_c_4_u_c colorA(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -136 { │ │ │ │ -137 return (mesh_.has_vertex_colors() │ │ │ │ -138 ? color_cast(mesh_.color(_vh)) │ │ │ │ -139 : _V_e_c_4_u_c(0, 0, 0, 0)); │ │ │ │ -140 } │ │ │ │ -141 │ │ │ │ -142 _V_e_c_3_u_i colori(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -143 { │ │ │ │ -144 return (mesh_.has_vertex_colors() │ │ │ │ -145 ? color_cast(mesh_.color(_vh)) │ │ │ │ -146 : _V_e_c_3_u_i(0, 0, 0)); │ │ │ │ -147 } │ │ │ │ +_1_1_5 bool _s_e_l_e_c_t_e_d() const { return _i_s___b_i_t___s_e_t(_S_E_L_E_C_T_E_D); } │ │ │ │ +_1_1_7 void _s_e_t___s_e_l_e_c_t_e_d(bool _b) { _c_h_a_n_g_e___b_i_t(_S_E_L_E_C_T_E_D, _b); } │ │ │ │ +118 │ │ │ │ +119 │ │ │ │ +_1_2_1 bool _h_i_d_d_e_n() const { return _i_s___b_i_t___s_e_t(_H_I_D_D_E_N); } │ │ │ │ +_1_2_3 void _s_e_t___h_i_d_d_e_n(bool _b) { _c_h_a_n_g_e___b_i_t(_H_I_D_D_E_N, _b); } │ │ │ │ +124 │ │ │ │ +125 │ │ │ │ +_1_2_7 bool _f_e_a_t_u_r_e() const { return _i_s___b_i_t___s_e_t(_F_E_A_T_U_R_E); } │ │ │ │ +_1_2_9 void _s_e_t___f_e_a_t_u_r_e(bool _b) { _c_h_a_n_g_e___b_i_t(_F_E_A_T_U_R_E, _b); } │ │ │ │ +130 │ │ │ │ +131 │ │ │ │ +_1_3_3 bool _t_a_g_g_e_d() const { return _i_s___b_i_t___s_e_t(_T_A_G_G_E_D); } │ │ │ │ +_1_3_5 void _s_e_t___t_a_g_g_e_d(bool _b) { _c_h_a_n_g_e___b_i_t(_T_A_G_G_E_D, _b); } │ │ │ │ +136 │ │ │ │ +137 │ │ │ │ +_1_3_9 bool _t_a_g_g_e_d_2() const { return _i_s___b_i_t___s_e_t(_T_A_G_G_E_D_2); } │ │ │ │ +_1_4_1 void _s_e_t___t_a_g_g_e_d_2(bool _b) { _c_h_a_n_g_e___b_i_t(_T_A_G_G_E_D_2, _b); } │ │ │ │ +142 │ │ │ │ +143 │ │ │ │ +_1_4_5 bool _f_i_x_e_d___n_o_n_m_a_n_i_f_o_l_d() const { return _i_s___b_i_t___s_e_t(_F_I_X_E_D_N_O_N_M_A_N_I_F_O_L_D); } │ │ │ │ +_1_4_7 void _s_e_t___f_i_x_e_d___n_o_n_m_a_n_i_f_o_l_d(bool _b) { _c_h_a_n_g_e___b_i_t(_F_I_X_E_D_N_O_N_M_A_N_I_F_O_L_D, _b); } │ │ │ │ 148 │ │ │ │ -149 _V_e_c_4_u_i colorAi(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -150 { │ │ │ │ -151 return (mesh_.has_vertex_colors() │ │ │ │ -152 ? color_cast(mesh_.color(_vh)) │ │ │ │ -153 : _V_e_c_4_u_i(0, 0, 0, 0)); │ │ │ │ -154 } │ │ │ │ +149 │ │ │ │ +_1_5_1 unsigned int _b_i_t_s() const { return status_; } │ │ │ │ +_1_5_3 void _s_e_t___b_i_t_s(unsigned int _bits) { status_ = _bits; } │ │ │ │ +154 │ │ │ │ 155 │ │ │ │ -156 _V_e_c_3_f colorf(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -157 { │ │ │ │ -158 return (mesh_.has_vertex_colors() │ │ │ │ -159 ? color_cast(mesh_.color(_vh)) │ │ │ │ -160 : _V_e_c_3_f(0, 0, 0)); │ │ │ │ -161 } │ │ │ │ -162 │ │ │ │ -163 _V_e_c_4_f colorAf(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -164 { │ │ │ │ -165 return (mesh_.has_vertex_colors() │ │ │ │ -166 ? color_cast(mesh_.color(_vh)) │ │ │ │ -167 : _V_e_c_4_f(0, 0, 0, 0)); │ │ │ │ -168 } │ │ │ │ -169 │ │ │ │ -170 _V_e_c_2_f texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -171 { │ │ │ │ -172#if defined(OM_CC_GCC) && (OM_CC_VERSION<30000) │ │ │ │ -173 // Workaround! │ │ │ │ -174 // gcc 2.95.3 exits with internal compiler error at the │ │ │ │ -175 // code below!??? **) │ │ │ │ -176 if (mesh_.has_vertex_texcoords2D()) │ │ │ │ -177 return vector_cast(mesh_.texcoord2D(_vh)); │ │ │ │ -178 return _V_e_c_2_f(0.0f, 0.0f); │ │ │ │ -179#else // **) │ │ │ │ -180 return (mesh_.has_vertex_texcoords2D() │ │ │ │ -181 ? vector_cast(mesh_.texcoord2D(_vh)) │ │ │ │ -182 : _V_e_c_2_f(0.0f, 0.0f)); │ │ │ │ -183#endif │ │ │ │ -184 } │ │ │ │ -185 │ │ │ │ -186 _V_e_c_2_f texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const override │ │ │ │ -187 { │ │ │ │ -188 return (mesh_.has_halfedge_texcoords2D() │ │ │ │ -189 ? vector_cast(mesh_.texcoord2D(_heh)) │ │ │ │ -190 : _V_e_c_2_f(0.0f, 0.0f)); │ │ │ │ -191 } │ │ │ │ -192 │ │ │ │ -193 _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -194 { │ │ │ │ -195 if (mesh_.has_vertex_status()) │ │ │ │ -196 return mesh_.status(_vh); │ │ │ │ -197 return _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o(); │ │ │ │ -198 } │ │ │ │ -199 │ │ │ │ -200 // get edge data │ │ │ │ -201 │ │ │ │ -202 _V_e_c_3_u_c color(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -203 { │ │ │ │ -204 return (mesh_.has_edge_colors() │ │ │ │ -205 ? color_cast(mesh_.color(_eh)) │ │ │ │ -206 : _V_e_c_3_u_c(0, 0, 0)); │ │ │ │ -207 } │ │ │ │ -208 │ │ │ │ -209 _V_e_c_4_u_c colorA(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -210 { │ │ │ │ -211 return (mesh_.has_edge_colors() │ │ │ │ -212 ? color_cast(mesh_.color(_eh)) │ │ │ │ -213 : _V_e_c_4_u_c(0, 0, 0, 0)); │ │ │ │ -214 } │ │ │ │ -215 │ │ │ │ -216 _V_e_c_3_u_i colori(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -217 { │ │ │ │ -218 return (mesh_.has_edge_colors() │ │ │ │ -219 ? color_cast(mesh_.color(_eh)) │ │ │ │ -220 : _V_e_c_3_u_i(0, 0, 0)); │ │ │ │ -221 } │ │ │ │ -222 │ │ │ │ -223 _V_e_c_4_u_i colorAi(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -224 { │ │ │ │ -225 return (mesh_.has_edge_colors() │ │ │ │ -226 ? color_cast(mesh_.color(_eh)) │ │ │ │ -227 : _V_e_c_4_u_i(0, 0, 0, 0)); │ │ │ │ -228 } │ │ │ │ -229 │ │ │ │ -230 _V_e_c_3_f colorf(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -231 { │ │ │ │ -232 return (mesh_.has_vertex_colors() │ │ │ │ -233 ? color_cast(mesh_.color(_eh)) │ │ │ │ -234 : _V_e_c_3_f(0, 0, 0)); │ │ │ │ -235 } │ │ │ │ -236 │ │ │ │ -237 _V_e_c_4_f colorAf(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -238 { │ │ │ │ -239 return (mesh_.has_vertex_colors() │ │ │ │ -240 ? color_cast(mesh_.color(_eh)) │ │ │ │ -241 : _V_e_c_4_f(0, 0, 0, 0)); │ │ │ │ -242 } │ │ │ │ -243 │ │ │ │ -244 _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_E_d_g_e_H_a_n_d_l_e _eh) const override │ │ │ │ -245 { │ │ │ │ -246 if (mesh_.has_edge_status()) │ │ │ │ -247 return mesh_.status(_eh); │ │ │ │ -248 return _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o(); │ │ │ │ -249 } │ │ │ │ -250 │ │ │ │ -251 // get halfedge data │ │ │ │ -252 │ │ │ │ -253 int get_halfedge_id(_V_e_r_t_e_x_H_a_n_d_l_e _vh) override │ │ │ │ -254 { │ │ │ │ -255 return mesh_.halfedge_handle(_vh).idx(); │ │ │ │ -256 } │ │ │ │ -257 │ │ │ │ -258 int get_halfedge_id(_F_a_c_e_H_a_n_d_l_e _fh) override │ │ │ │ -259 { │ │ │ │ -260 return mesh_.halfedge_handle(_fh).idx(); │ │ │ │ -261 } │ │ │ │ -262 │ │ │ │ -263 int get_next_halfedge_id(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ -264 { │ │ │ │ -265 return mesh_.next_halfedge_handle(_heh).idx(); │ │ │ │ -266 } │ │ │ │ -267 │ │ │ │ -268 int get_to_vertex_id(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ -269 { │ │ │ │ -270 return mesh_.to_vertex_handle(_heh).idx(); │ │ │ │ -271 } │ │ │ │ -272 │ │ │ │ -273 int get_face_id(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ -274 { │ │ │ │ -275 return mesh_.face_handle(_heh).idx(); │ │ │ │ -276 } │ │ │ │ -277 │ │ │ │ -278 _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const override │ │ │ │ -279 { │ │ │ │ -280 if (mesh_.has_halfedge_status()) │ │ │ │ -281 return mesh_.status(_heh); │ │ │ │ -282 return _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o(); │ │ │ │ -283 } │ │ │ │ -284 │ │ │ │ -285 // get face data │ │ │ │ -286 │ │ │ │ -287 unsigned int get_vhandles(_F_a_c_e_H_a_n_d_l_e _fh, │ │ │ │ -288 std::vector& _vhandles) const override │ │ │ │ -289 { │ │ │ │ -290 unsigned int count(0); │ │ │ │ -291 _vhandles.clear(); │ │ │ │ -292 for (typename Mesh::CFVIter fv_it=mesh_.cfv_iter(_fh); fv_it.is_valid(); │ │ │ │ -++fv_it) │ │ │ │ -293 { │ │ │ │ -294 _vhandles.push_back(*fv_it); │ │ │ │ -295 ++count; │ │ │ │ -296 } │ │ │ │ -297 return count; │ │ │ │ -298 } │ │ │ │ -299 │ │ │ │ -300 unsigned int get_face_texcoords(std::vector& _hehandles) const │ │ │ │ -override │ │ │ │ -301 { │ │ │ │ -302 unsigned int count(0); │ │ │ │ -303 _hehandles.clear(); │ │ │ │ -304 for(auto heh: mesh_.halfedges().filtered(!_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_B_o_u_n_d_a_r_y │ │ │ │ -())) │ │ │ │ -305 { │ │ │ │ -306 _hehandles.push_back(vector_cast(mesh_.texcoord2D(heh))); │ │ │ │ -307 ++count; │ │ │ │ -308 } │ │ │ │ -309 │ │ │ │ -310 return count; │ │ │ │ -311 } │ │ │ │ -312 │ │ │ │ -_3_1_3 _H_a_l_f_e_d_g_e_H_a_n_d_l_e _g_e_t_H_e_h(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) const override │ │ │ │ -314 { │ │ │ │ -315 typename _M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r fh_it; │ │ │ │ -316 for(fh_it = mesh_.cfh_iter(_fh); fh_it.is_valid();++fh_it) │ │ │ │ -317 { │ │ │ │ -318 if(mesh_.to_vertex_handle(*fh_it) == _vh) │ │ │ │ -319 return *fh_it; │ │ │ │ -320 } │ │ │ │ -321 return *fh_it; │ │ │ │ -322 } │ │ │ │ -323 │ │ │ │ -324 _V_e_c_3_f normal(_F_a_c_e_H_a_n_d_l_e _fh) const override │ │ │ │ -325 { │ │ │ │ -326 return (mesh_.has_face_normals() │ │ │ │ -327 ? vector_cast(mesh_.normal(_fh)) │ │ │ │ -328 : _V_e_c_3_f(0.0f, 0.0f, 0.0f)); │ │ │ │ -329 } │ │ │ │ -330 │ │ │ │ -331 _V_e_c_3_d normald(_F_a_c_e_H_a_n_d_l_e _fh) const override │ │ │ │ -332 { │ │ │ │ -333 return (mesh_.has_face_normals() │ │ │ │ -334 ? vector_cast(mesh_.normal(_fh)) │ │ │ │ -335 : _V_e_c_3_d(0.0, 0.0, 0.0)); │ │ │ │ -336 } │ │ │ │ -337 │ │ │ │ -338 _V_e_c_3_u_c color(FaceHandle _fh) const override │ │ │ │ -339 { │ │ │ │ -340 return (mesh_.has_face_colors() │ │ │ │ -341 ? color_cast(mesh_.color(_fh)) │ │ │ │ -342 : _V_e_c_3_u_c(0, 0, 0)); │ │ │ │ -343 } │ │ │ │ -344 │ │ │ │ -345 _V_e_c_4_u_c colorA(FaceHandle _fh) const override │ │ │ │ -346 { │ │ │ │ -347 return (mesh_.has_face_colors() │ │ │ │ -348 ? color_cast(mesh_.color(_fh)) │ │ │ │ -349 : _V_e_c_4_u_c(0, 0, 0, 0)); │ │ │ │ -350 } │ │ │ │ -351 │ │ │ │ -352 _V_e_c_3_u_i colori(FaceHandle _fh) const override │ │ │ │ -353 { │ │ │ │ -354 return (mesh_.has_face_colors() │ │ │ │ -355 ? color_cast(mesh_.color(_fh)) │ │ │ │ -356 : _V_e_c_3_u_i(0, 0, 0)); │ │ │ │ -357 } │ │ │ │ -358 │ │ │ │ -359 _V_e_c_4_u_i colorAi(FaceHandle _fh) const override │ │ │ │ -360 { │ │ │ │ -361 return (mesh_.has_face_colors() │ │ │ │ -362 ? color_cast(mesh_.color(_fh)) │ │ │ │ -363 : _V_e_c_4_u_i(0, 0, 0, 0)); │ │ │ │ -364 } │ │ │ │ -365 │ │ │ │ -366 _V_e_c_3_f colorf(FaceHandle _fh) const override │ │ │ │ -367 { │ │ │ │ -368 return (mesh_.has_face_colors() │ │ │ │ -369 ? color_cast(mesh_.color(_fh)) │ │ │ │ -370 : _V_e_c_3_f(0, 0, 0)); │ │ │ │ -371 } │ │ │ │ -372 │ │ │ │ -373 _V_e_c_4_f colorAf(FaceHandle _fh) const override │ │ │ │ -374 { │ │ │ │ -375 return (mesh_.has_face_colors() │ │ │ │ -376 ? color_cast(mesh_.color(_fh)) │ │ │ │ -377 : _V_e_c_4_f(0, 0, 0, 0)); │ │ │ │ -378 } │ │ │ │ -379 │ │ │ │ -380 _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status(FaceHandle _fh) const override │ │ │ │ -381 { │ │ │ │ -382 if (mesh_.has_face_status()) │ │ │ │ -383 return mesh_.status(_fh); │ │ │ │ -384 return _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o(); │ │ │ │ -385 } │ │ │ │ -386 │ │ │ │ -387 virtual const BaseKernel* kernel() override { return &mesh_; } │ │ │ │ -388 │ │ │ │ -389 │ │ │ │ -390 // query number of faces, vertices, normals, texcoords │ │ │ │ -391 size_t n_vertices() const override { return mesh_.n_vertices(); } │ │ │ │ -392 size_t n_faces() const override { return mesh_.n_faces(); } │ │ │ │ -393 size_t n_edges() const override { return mesh_.n_edges(); } │ │ │ │ -394 │ │ │ │ -395 │ │ │ │ -396 // property information │ │ │ │ -397 bool is_triangle_mesh() const override │ │ │ │ -398 { return Mesh::is_triangles(); } │ │ │ │ -399 │ │ │ │ -400 bool has_vertex_normals() const override { return mesh_.has_vertex_normals │ │ │ │ -(); } │ │ │ │ -401 bool has_vertex_colors() const override { return mesh_.has_vertex_colors(); │ │ │ │ -} │ │ │ │ -402 bool has_vertex_texcoords() const override { return │ │ │ │ -mesh_.has_vertex_texcoords2D(); } │ │ │ │ -403 bool has_vertex_status() const override { return mesh_.has_vertex_status(); │ │ │ │ -} │ │ │ │ -404 bool has_edge_colors() const override { return mesh_.has_edge_colors(); } │ │ │ │ -405 bool has_edge_status() const override { return mesh_.has_edge_status(); } │ │ │ │ -406 bool has_halfedge_status() const override { return │ │ │ │ -mesh_.has_halfedge_status(); } │ │ │ │ -407 bool has_face_normals() const override { return mesh_.has_face_normals(); } │ │ │ │ -408 bool has_face_colors() const override { return mesh_.has_face_colors(); } │ │ │ │ -409 bool has_face_status() const override { return mesh_.has_face_status(); } │ │ │ │ -410 │ │ │ │ -411private: │ │ │ │ -412 │ │ │ │ -413 const Mesh& mesh_; │ │ │ │ -414}; │ │ │ │ -415 │ │ │ │ -416 │ │ │ │ -417// │ │ │ │ +_1_5_7 bool _i_s___b_i_t___s_e_t(unsigned int _s) const { return (status_ & _s) > 0; } │ │ │ │ +_1_5_9 void _s_e_t___b_i_t(unsigned int _s) { status_ |= _s; } │ │ │ │ +_1_6_1 void _u_n_s_e_t___b_i_t(unsigned int _s) { status_ &= ~_s; } │ │ │ │ +_1_6_3 void _c_h_a_n_g_e___b_i_t(unsigned int _s, bool _b) { │ │ │ │ +164 if (_b) status_ |= _s; else status_ &= ~_s; } │ │ │ │ +165 │ │ │ │ +166 │ │ │ │ +167private: │ │ │ │ +168 │ │ │ │ +169 value_type status_; │ │ │ │ +170}; │ │ │ │ +171 │ │ │ │ +172 │ │ │ │ +173// │ │ │ │ ============================================================================= │ │ │ │ -418} // namespace IO │ │ │ │ -419} // namespace OpenMesh │ │ │ │ -420// │ │ │ │ +174} // namespace Attributes │ │ │ │ +175} // namespace OpenMesh │ │ │ │ +176// │ │ │ │ ============================================================================= │ │ │ │ -421#endif │ │ │ │ -422// │ │ │ │ +177#endif // OPENMESH_ATTRIBUTE_STATUS_HH defined │ │ │ │ +178// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_d │ │ │ │ -VectorT< double, 3 > Vec3d │ │ │ │ -3-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:853 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_f │ │ │ │ -VectorT< float, 2 > Vec2f │ │ │ │ -2-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:834 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_i │ │ │ │ -VectorT< unsigned int, 4 > Vec4ui │ │ │ │ -4-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:868 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_c │ │ │ │ -VectorT< unsigned char, 3 > Vec3uc │ │ │ │ -3-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:841 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_f │ │ │ │ -VectorT< float, 4 > Vec4f │ │ │ │ -4-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:870 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_c │ │ │ │ -VectorT< unsigned char, 4 > Vec4uc │ │ │ │ -4-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:860 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_i │ │ │ │ -VectorT< unsigned int, 3 > Vec3ui │ │ │ │ -3-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:849 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_f │ │ │ │ -VectorT< float, 3 > Vec3f │ │ │ │ -3-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:851 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ -_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _4_ _> │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_E_x_p_o_r_t_e_r_T │ │ │ │ -This class template provides an exporter module for OpenMesh meshes. │ │ │ │ -DDeeffiinniittiioonn ExporterT.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_E_x_p_o_r_t_e_r_T_:_:_g_e_t_H_e_h │ │ │ │ -HalfedgeHandle getHeh(FaceHandle _fh, VertexHandle _vh) const override │ │ │ │ -getHeh returns the HalfEdgeHandle that belongs to the face specified by _fh and │ │ │ │ -has a toVertexHandle ... │ │ │ │ -DDeeffiinniittiioonn ExporterT.hh:313 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:178 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ -Kernel::Normal Normal │ │ │ │ -Normal type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ -Kernel::Point Point │ │ │ │ -Coordinate type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_B_i_t_s │ │ │ │ +StatusBits │ │ │ │ +Status bits used by the Status class. │ │ │ │ +DDeeffiinniittiioonn Status.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_A_G_G_E_D_2 │ │ │ │ +@ TAGGED2 │ │ │ │ +Alternate bit for tagging an item. │ │ │ │ +DDeeffiinniittiioonn Status.hh:82 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_L_O_C_K_E_D │ │ │ │ +@ LOCKED │ │ │ │ +Item is locked. │ │ │ │ +DDeeffiinniittiioonn Status.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_F_I_X_E_D_N_O_N_M_A_N_I_F_O_L_D │ │ │ │ +@ FIXEDNONMANIFOLD │ │ │ │ +Item was non-two-manifold and had to be fixed. │ │ │ │ +DDeeffiinniittiioonn Status.hh:83 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_D_E_L_E_T_E_D │ │ │ │ +@ DELETED │ │ │ │ +Item has been deleted. │ │ │ │ +DDeeffiinniittiioonn Status.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_E_L_E_C_T_E_D │ │ │ │ +@ SELECTED │ │ │ │ +Item is selected. │ │ │ │ +DDeeffiinniittiioonn Status.hh:78 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_U_N_U_S_E_D │ │ │ │ +@ UNUSED │ │ │ │ +Unused. │ │ │ │ +DDeeffiinniittiioonn Status.hh:84 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_H_I_D_D_E_N │ │ │ │ +@ HIDDEN │ │ │ │ +Item is hidden. │ │ │ │ +DDeeffiinniittiioonn Status.hh:79 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_A_G_G_E_D │ │ │ │ +@ TAGGED │ │ │ │ +Item is tagged. │ │ │ │ +DDeeffiinniittiioonn Status.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_F_E_A_T_U_R_E │ │ │ │ +@ FEATURE │ │ │ │ +Item is a feature or belongs to a feature. │ │ │ │ +DDeeffiinniittiioonn Status.hh:80 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ Add status information to a base class. │ │ │ │ DDeeffiinniittiioonn Status.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_B_o_u_n_d_a_r_y │ │ │ │ -DDeeffiinniittiioonn Predicates.hh:239 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___f_i_x_e_d___n_o_n_m_a_n_i_f_o_l_d │ │ │ │ +void set_fixed_nonmanifold(bool _b) │ │ │ │ +set fixed non-manifold │ │ │ │ +DDeeffiinniittiioonn Status.hh:147 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___h_i_d_d_e_n │ │ │ │ +void set_hidden(bool _b) │ │ │ │ +set hidden │ │ │ │ +DDeeffiinniittiioonn Status.hh:123 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_d_e_l_e_t_e_d │ │ │ │ +bool deleted() const │ │ │ │ +is deleted ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:103 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___s_e_l_e_c_t_e_d │ │ │ │ +void set_selected(bool _b) │ │ │ │ +set selected │ │ │ │ +DDeeffiinniittiioonn Status.hh:117 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___t_a_g_g_e_d_2 │ │ │ │ +void set_tagged2(bool _b) │ │ │ │ +set tagged │ │ │ │ +DDeeffiinniittiioonn Status.hh:141 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_t_a_g_g_e_d │ │ │ │ +bool tagged() const │ │ │ │ +is tagged ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:133 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_i_s___b_i_t___s_e_t │ │ │ │ +bool is_bit_set(unsigned int _s) const │ │ │ │ +is a certain bit set ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:157 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___b_i_t_s │ │ │ │ +void set_bits(unsigned int _bits) │ │ │ │ +set whole status at once │ │ │ │ +DDeeffiinniittiioonn Status.hh:153 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_l_o_c_k_e_d │ │ │ │ +bool locked() const │ │ │ │ +is locked ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:109 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___l_o_c_k_e_d │ │ │ │ +void set_locked(bool _b) │ │ │ │ +set locked │ │ │ │ +DDeeffiinniittiioonn Status.hh:111 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___d_e_l_e_t_e_d │ │ │ │ +void set_deleted(bool _b) │ │ │ │ +set deleted │ │ │ │ +DDeeffiinniittiioonn Status.hh:105 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___f_e_a_t_u_r_e │ │ │ │ +void set_feature(bool _b) │ │ │ │ +set feature │ │ │ │ +DDeeffiinniittiioonn Status.hh:129 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___b_i_t │ │ │ │ +void set_bit(unsigned int _s) │ │ │ │ +set a certain bit │ │ │ │ +DDeeffiinniittiioonn Status.hh:159 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___t_a_g_g_e_d │ │ │ │ +void set_tagged(bool _b) │ │ │ │ +set tagged │ │ │ │ +DDeeffiinniittiioonn Status.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_c_h_a_n_g_e___b_i_t │ │ │ │ +void change_bit(unsigned int _s, bool _b) │ │ │ │ +set or unset a certain bit │ │ │ │ +DDeeffiinniittiioonn Status.hh:163 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_f_e_a_t_u_r_e │ │ │ │ +bool feature() const │ │ │ │ +is feature ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:127 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_t_a_g_g_e_d_2 │ │ │ │ +bool tagged2() const │ │ │ │ +is tagged2 ? This is just one more tag info. │ │ │ │ +DDeeffiinniittiioonn Status.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_f_i_x_e_d___n_o_n_m_a_n_i_f_o_l_d │ │ │ │ +bool fixed_nonmanifold() const │ │ │ │ +is fixed non-manifold ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_b_i_t_s │ │ │ │ +unsigned int bits() const │ │ │ │ +return whole status │ │ │ │ +DDeeffiinniittiioonn Status.hh:151 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_l_e_c_t_e_d │ │ │ │ +bool selected() const │ │ │ │ +is selected ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:115 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_u_n_s_e_t___b_i_t │ │ │ │ +void unset_bit(unsigned int _s) │ │ │ │ +unset a certain bit │ │ │ │ +DDeeffiinniittiioonn Status.hh:161 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_h_i_d_d_e_n │ │ │ │ +bool hidden() const │ │ │ │ +is hidden ? │ │ │ │ +DDeeffiinniittiioonn Status.hh:121 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00596_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/SR_binary.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/TriConnectivity.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SR_binary.hh
│ │ │ +
TriConnectivity.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,111 +138,121 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ +
44#ifndef OPENMESH_TRICONNECTIVITY_HH
│ │ │ +
45#define OPENMESH_TRICONNECTIVITY_HH
│ │ │ +
46
│ │ │ +
47#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
48
│ │ │ +
49namespace OpenMesh {
│ │ │
50
│ │ │ -
51#ifndef OPENMESH_SR_BINARY_HH
│ │ │ -
52#define OPENMESH_SR_BINARY_HH
│ │ │ -
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
│ │ │ +
53class OPENMESHDLLEXPORT TriConnectivity : public PolyConnectivity
│ │ │ +
54{
│ │ │ +
55public:
│ │ │
56
│ │ │ -
57#include <OpenMesh/Core/System/config.h>
│ │ │ -
58// -------------------- STL
│ │ │ -
59#include <typeinfo>
│ │ │ -
60#include <stdexcept>
│ │ │ -
61#include <sstream>
│ │ │ -
62#include <numeric> // accumulate
│ │ │ -
63// -------------------- OpenMesh
│ │ │ -
64
│ │ │ -
65
│ │ │ -
66//== NAMESPACES ===============================================================
│ │ │ -
67
│ │ │ -
68namespace OpenMesh {
│ │ │ -
69namespace IO {
│ │ │ -
70
│ │ │ -
71
│ │ │ -
72//=============================================================================
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75//-----------------------------------------------------------------------------
│ │ │ -
76
│ │ │ -
77 const static size_t UnknownSize(size_t(-1));
│ │ │ -
78
│ │ │ + │ │ │ +
58 virtual ~TriConnectivity() {}
│ │ │ +
59
│ │ │ +
60 inline static bool is_triangles()
│ │ │ +
61 { return true; }
│ │ │ +
62
│ │ │ +
│ │ │ +
66 inline void assign_connectivity(const TriConnectivity& _other)
│ │ │ +
67 { PolyConnectivity::assign_connectivity(_other); }
│ │ │ +
│ │ │ +
68
│ │ │ +
69 inline void assign_connectivity(const PolyConnectivity& _other)
│ │ │ +
70 {
│ │ │ +
71 PolyConnectivity::assign_connectivity(_other);
│ │ │ +
72 triangulate();
│ │ │ +
73 }
│ │ │ +
74
│ │ │
79
│ │ │ -
80//-----------------------------------------------------------------------------
│ │ │ -
81// struct binary, helper for storing/restoring
│ │ │ -
82
│ │ │ -
│ │ │ -
96template < typename T, typename = void > struct binary
│ │ │ -
97{
│ │ │ -
98 typedef T value_type;
│ │ │ +
88 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);
│ │ │ +
89
│ │ │ +
98 SmartFaceHandle add_face(const std::vector<VertexHandle>& _vhandles);
│ │ │
99
│ │ │ -
101 static const bool is_streamable = false;
│ │ │ -
102
│ │ │ -
104 static size_t size_of(void) { return UnknownSize; }
│ │ │ -
106 static size_t size_of(const value_type&) { return UnknownSize; }
│ │ │ -
107
│ │ │ -
109 static std::string type_identifier (void) { return "UnknownType"; }
│ │ │ -
110
│ │ │ -
112 static
│ │ │ -
│ │ │ -
113 size_t store( std::ostream& /* _os */,
│ │ │ -
114 const value_type& /* _v */,
│ │ │ -
115 bool /* _swap */ = false ,
│ │ │ -
116 bool /* store_size */ = true ) // for vectors
│ │ │ -
117 {
│ │ │ -
118 std::ostringstream msg;
│ │ │ -
119 msg << "Type not supported: " << typeid(value_type).name();
│ │ │ -
120 throw std::logic_error(msg.str());
│ │ │ -
121 }
│ │ │ -
│ │ │ -
122
│ │ │ -
124 static
│ │ │ -
│ │ │ -
125 size_t restore( std::istream& /* _is */,
│ │ │ -
126 value_type& /* _v */,
│ │ │ -
127 bool /* _swap */ = false ,
│ │ │ -
128 bool /* store_size */ = true ) // for vectors
│ │ │ -
129 {
│ │ │ -
130 std::ostringstream msg;
│ │ │ -
131 msg << "Type not supported: " << typeid(value_type).name();
│ │ │ -
132 throw std::logic_error(msg.str());
│ │ │ -
133 }
│ │ │ -
│ │ │ -
134};
│ │ │ -
│ │ │ -
135
│ │ │ -
136#undef X
│ │ │ -
137
│ │ │ +
108 SmartFaceHandle add_face(const std::vector<SmartVertexHandle>& _vhandles);
│ │ │ +
109
│ │ │ +
120 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);
│ │ │ +
121
│ │ │ +
123
│ │ │ +
│ │ │ + │ │ │ +
128 {
│ │ │ +
129 return is_boundary(_heh) ? InvalidVertexHandle :
│ │ │ +
130 to_vertex_handle(next_halfedge_handle(_heh));
│ │ │ +
131 }
│ │ │ +
│ │ │ +
132
│ │ │ +
│ │ │ + │ │ │ +
137 { return opposite_vh(opposite_halfedge_handle(_heh)); }
│ │ │ +
│ │ │
138
│ │ │ -
139//=============================================================================
│ │ │ -
140} // namespace IO
│ │ │ -
141} // namespace OpenMesh
│ │ │ -
142//=============================================================================
│ │ │ -
143#endif // OPENMESH_SR_RBO_HH defined
│ │ │ -
144//=============================================================================
│ │ │ -
145
│ │ │ +
142
│ │ │ +
143
│ │ │ +
148 bool is_collapse_ok(HalfedgeHandle _heh);
│ │ │ +
149
│ │ │ +
151 HalfedgeHandle vertex_split(VertexHandle v0, VertexHandle v1,
│ │ │ + │ │ │ +
153
│ │ │ +
155 bool is_flip_ok(EdgeHandle _eh) const;
│ │ │ +
156
│ │ │ +
159 void flip(EdgeHandle _eh);
│ │ │ +
160
│ │ │ +
161
│ │ │ +
173 void split(EdgeHandle _eh, VertexHandle _vh);
│ │ │ +
174
│ │ │ +
190 inline void split_edge(EdgeHandle _eh, VertexHandle _vh) { TriConnectivity::split(_eh, _vh); }
│ │ │ +
191
│ │ │ +
204 void split_copy(EdgeHandle _eh, VertexHandle _vh);
│ │ │ +
205
│ │ │ +
222 inline void split_edge_copy(EdgeHandle _eh, VertexHandle _vh) { TriConnectivity::split_copy(_eh, _vh); }
│ │ │ +
223
│ │ │ +
│ │ │ +
229 inline void split(FaceHandle _fh, VertexHandle _vh)
│ │ │ +
230 { PolyConnectivity::split(_fh, _vh); }
│ │ │ +
│ │ │ +
231
│ │ │ +
│ │ │ +
237 inline void split_copy(FaceHandle _fh, VertexHandle _vh)
│ │ │ +
238 { PolyConnectivity::split_copy(_fh, _vh); }
│ │ │ +
│ │ │ +
239
│ │ │ +
241
│ │ │ +
242private:
│ │ │ +
244 HalfedgeHandle insert_loop(HalfedgeHandle _hh);
│ │ │ +
246 HalfedgeHandle insert_edge(VertexHandle _vh,
│ │ │ + │ │ │ +
248};
│ │ │ +
│ │ │ +
249
│ │ │ +
250}
│ │ │ +
251
│ │ │ +
252#endif//OPENMESH_TRICONNECTIVITY_HH
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
The struct defines how to store and restore the type T.
Definition SR_binary.hh:97
│ │ │ -
static size_t restore(std::istream &, value_type &, bool=false, bool=true)
Restore a value of T and return the number of bytes read.
Definition SR_binary.hh:125
│ │ │ -
static const bool is_streamable
Can we store T? Set this to true in your specialization.
Definition SR_binary.hh:101
│ │ │ -
static size_t store(std::ostream &, const value_type &, bool=false, bool=true)
Store a value of T and return the number of bytes written.
Definition SR_binary.hh:113
│ │ │ -
static std::string type_identifier(void)
A string that identifies the type of T.
Definition SR_binary.hh:109
│ │ │ -
static size_t size_of(void)
What's the size of T? If it depends on the actual value (e.g. for vectors) return UnknownSize.
Definition SR_binary.hh:104
│ │ │ -
static size_t size_of(const value_type &)
What't the size of a specific value of type T.
Definition SR_binary.hh:106
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ +
Connectivity Class for Triangle Meshes.
Definition TriConnectivity.hh:54
│ │ │ +
void split_edge(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriConnectivity.hh:190
│ │ │ +
void split_copy(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3) split, calls corresponding PolyMeshT function).
Definition TriConnectivity.hh:237
│ │ │ +
void split_edge_copy(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriConnectivity.hh:222
│ │ │ +
VertexHandle opposite_he_opposite_vh(HalfedgeHandle _heh) const
Returns the opposite vertex to the opposite halfedge of _heh in the face referenced by it returns Inv...
Definition TriConnectivity.hh:136
│ │ │ +
VertexHandle opposite_vh(HalfedgeHandle _heh) const
Returns the opposite vertex to the halfedge _heh in the face referenced by _heh returns InvalidVertex...
Definition TriConnectivity.hh:127
│ │ │ +
void split(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3) split, calls corresponding PolyMeshT function).
Definition TriConnectivity.hh:229
│ │ │ +
void assign_connectivity(const TriConnectivity &_other)
assign_connectivity() methods.
Definition TriConnectivity.hh:66
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SR_binary.hh │ │ │ │ +TriConnectivity.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,135 +47,146 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ +44#ifndef OPENMESH_TRICONNECTIVITY_HH │ │ │ │ +45#define OPENMESH_TRICONNECTIVITY_HH │ │ │ │ +46 │ │ │ │ +47#include │ │ │ │ +48 │ │ │ │ +49namespace _O_p_e_n_M_e_s_h { │ │ │ │ 50 │ │ │ │ -51#ifndef OPENMESH_SR_BINARY_HH │ │ │ │ -52#define OPENMESH_SR_BINARY_HH │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +_5_3class OPENMESHDLLEXPORT _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y : public _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +54{ │ │ │ │ +55public: │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ -58// -------------------- STL │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include // accumulate │ │ │ │ -63// -------------------- OpenMesh │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -67 │ │ │ │ -68namespace _O_p_e_n_M_e_s_h { │ │ │ │ -69namespace IO { │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -72// │ │ │ │ -============================================================================= │ │ │ │ -73 │ │ │ │ +57 _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ +58 virtual _~_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ +59 │ │ │ │ +60 inline static bool is_triangles() │ │ │ │ +61 { return true; } │ │ │ │ +62 │ │ │ │ +_6_6 inline void _a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y(const _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y& _other) │ │ │ │ +67 { PolyConnectivity::assign_connectivity(_other); } │ │ │ │ +68 │ │ │ │ +69 inline void assign_connectivity(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _other) │ │ │ │ +70 { │ │ │ │ +71 PolyConnectivity::assign_connectivity(_other); │ │ │ │ +72 triangulate(); │ │ │ │ +73 } │ │ │ │ 74 │ │ │ │ -75//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -76 │ │ │ │ -77 const static size_t UnknownSize(size_t(-1)); │ │ │ │ -78 │ │ │ │ 79 │ │ │ │ -80//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -81// struct binary, helper for storing/restoring │ │ │ │ -82 │ │ │ │ -_9_6template < typename T, typename = void > struct _b_i_n_a_r_y │ │ │ │ -97{ │ │ │ │ -98 typedef T value_type; │ │ │ │ +88 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size); │ │ │ │ +89 │ │ │ │ +98 SmartFaceHandle add_face(const std::vector& _vhandles); │ │ │ │ 99 │ │ │ │ -_1_0_1 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = false; │ │ │ │ -102 │ │ │ │ -_1_0_4 static size_t _s_i_z_e___o_f(void) { return UnknownSize; } │ │ │ │ -_1_0_6 static size_t _s_i_z_e___o_f(const value_type&) { return UnknownSize; } │ │ │ │ -107 │ │ │ │ -_1_0_9 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r (void) { return "UnknownType"; } │ │ │ │ -110 │ │ │ │ -112 static │ │ │ │ -_1_1_3 size_t _s_t_o_r_e( std::ostream& /* _os */, │ │ │ │ -114 const value_type& /* _v */, │ │ │ │ -115 bool /* _swap */ = false , │ │ │ │ -116 bool /* store_size */ = true ) // for vectors │ │ │ │ -117 { │ │ │ │ -118 std::ostringstream msg; │ │ │ │ -119 msg << "Type not supported: " << typeid(value_type).name(); │ │ │ │ -120 throw std::logic_error(msg.str()); │ │ │ │ -121 } │ │ │ │ -122 │ │ │ │ -124 static │ │ │ │ -_1_2_5 size_t _r_e_s_t_o_r_e( std::istream& /* _is */, │ │ │ │ -126 value_type& /* _v */, │ │ │ │ -127 bool /* _swap */ = false , │ │ │ │ -128 bool /* store_size */ = true ) // for vectors │ │ │ │ -129 { │ │ │ │ -130 std::ostringstream msg; │ │ │ │ -131 msg << "Type not supported: " << typeid(value_type).name(); │ │ │ │ -132 throw std::logic_error(msg.str()); │ │ │ │ -133 } │ │ │ │ -134}; │ │ │ │ -135 │ │ │ │ -136#undef X │ │ │ │ -137 │ │ │ │ +108 SmartFaceHandle add_face(const std::vector& _vhandles); │ │ │ │ +109 │ │ │ │ +120 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle │ │ │ │ +_vh2); │ │ │ │ +121 │ │ │ │ +123 │ │ │ │ +_1_2_7 inline _V_e_r_t_e_x_H_a_n_d_l_e _o_p_p_o_s_i_t_e___v_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +128 { │ │ │ │ +129 return is_boundary(_heh) ? InvalidVertexHandle : │ │ │ │ +130 to_vertex_handle(next_halfedge_handle(_heh)); │ │ │ │ +131 } │ │ │ │ +132 │ │ │ │ +_1_3_6 _V_e_r_t_e_x_H_a_n_d_l_e _o_p_p_o_s_i_t_e___h_e___o_p_p_o_s_i_t_e___v_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +137 { return opposite_vh(opposite_halfedge_handle(_heh)); } │ │ │ │ 138 │ │ │ │ -139// │ │ │ │ -============================================================================= │ │ │ │ -140} // namespace IO │ │ │ │ -141} // namespace OpenMesh │ │ │ │ -142// │ │ │ │ -============================================================================= │ │ │ │ -143#endif // OPENMESH_SR_RBO_HH defined │ │ │ │ -144// │ │ │ │ -============================================================================= │ │ │ │ -145 │ │ │ │ +142 │ │ │ │ +143 │ │ │ │ +148 bool is_collapse_ok(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +149 │ │ │ │ +151 _H_a_l_f_e_d_g_e_H_a_n_d_l_e vertex_split(_V_e_r_t_e_x_H_a_n_d_l_e v0, _V_e_r_t_e_x_H_a_n_d_l_e v1, │ │ │ │ +152 _V_e_r_t_e_x_H_a_n_d_l_e vl, _V_e_r_t_e_x_H_a_n_d_l_e vr); │ │ │ │ +153 │ │ │ │ +155 bool is_flip_ok(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +156 │ │ │ │ +159 void flip(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +160 │ │ │ │ +161 │ │ │ │ +173 void split(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +174 │ │ │ │ +_1_9_0 inline void _s_p_l_i_t___e_d_g_e(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +{ TriConnectivity::split(_eh, _vh); } │ │ │ │ +191 │ │ │ │ +204 void split_copy(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +205 │ │ │ │ +_2_2_2 inline void _s_p_l_i_t___e_d_g_e___c_o_p_y(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +{ TriConnectivity::split_copy(_eh, _vh); } │ │ │ │ +223 │ │ │ │ +_2_2_9 inline void _s_p_l_i_t(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +230 { PolyConnectivity::split(_fh, _vh); } │ │ │ │ +231 │ │ │ │ +_2_3_7 inline void _s_p_l_i_t___c_o_p_y(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +238 { PolyConnectivity::split_copy(_fh, _vh); } │ │ │ │ +239 │ │ │ │ +241 │ │ │ │ +242private: │ │ │ │ +244 _H_a_l_f_e_d_g_e_H_a_n_d_l_e insert_loop(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh); │ │ │ │ +246 _H_a_l_f_e_d_g_e_H_a_n_d_l_e insert_edge(_V_e_r_t_e_x_H_a_n_d_l_e _vh, │ │ │ │ +247 _H_a_l_f_e_d_g_e_H_a_n_d_l_e _h0, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _h1); │ │ │ │ +248}; │ │ │ │ +249 │ │ │ │ +250} │ │ │ │ +251 │ │ │ │ +252#endif//OPENMESH_TRICONNECTIVITY_HH │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y │ │ │ │ -The struct defines how to store and restore the type T. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_r_e_s_t_o_r_e │ │ │ │ -static size_t restore(std::istream &, value_type &, bool=false, bool=true) │ │ │ │ -Restore a value of T and return the number of bytes read. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:125 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_i_s___s_t_r_e_a_m_a_b_l_e │ │ │ │ -static const bool is_streamable │ │ │ │ -Can we store T? Set this to true in your specialization. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:101 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_t_o_r_e │ │ │ │ -static size_t store(std::ostream &, const value_type &, bool=false, bool=true) │ │ │ │ -Store a value of T and return the number of bytes written. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:113 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_t_y_p_e___i_d_e_n_t_i_f_i_e_r │ │ │ │ -static std::string type_identifier(void) │ │ │ │ -A string that identifies the type of T. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:109 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_i_z_e___o_f │ │ │ │ -static size_t size_of(void) │ │ │ │ -What's the size of T? If it depends on the actual value (e.g. for vectors) │ │ │ │ -return UnknownSize. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:104 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_i_z_e___o_f │ │ │ │ -static size_t size_of(const value_type &) │ │ │ │ -What't the size of a specific value of type T. │ │ │ │ -DDeeffiinniittiioonn SR_binary.hh:106 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +Connectivity Class for polygonal meshes. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +Connectivity Class for Triangle Meshes. │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:54 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t___e_d_g_e │ │ │ │ +void split_edge(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +Edge split (= 2-to-4 split) │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:190 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ +void split_copy(FaceHandle _fh, VertexHandle _vh) │ │ │ │ +Face split (= 1-to-3) split, calls corresponding PolyMeshT function). │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:237 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t___e_d_g_e___c_o_p_y │ │ │ │ +void split_edge_copy(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +Edge split (= 2-to-4 split) │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:222 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___h_e___o_p_p_o_s_i_t_e___v_h │ │ │ │ +VertexHandle opposite_he_opposite_vh(HalfedgeHandle _heh) const │ │ │ │ +Returns the opposite vertex to the opposite halfedge of _heh in the face │ │ │ │ +referenced by it returns Inv... │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___v_h │ │ │ │ +VertexHandle opposite_vh(HalfedgeHandle _heh) const │ │ │ │ +Returns the opposite vertex to the halfedge _heh in the face referenced by _heh │ │ │ │ +returns InvalidVertex... │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:127 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t │ │ │ │ +void split(FaceHandle _fh, VertexHandle _vh) │ │ │ │ +Face split (= 1-to-3) split, calls corresponding PolyMeshT function). │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:229 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +void assign_connectivity(const TriConnectivity &_other) │ │ │ │ +assign_connectivity() methods. │ │ │ │ +DDeeffiinniittiioonn TriConnectivity.hh:66 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00599_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/writer/OBJWriter.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/PolyMeshT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OBJWriter.hh
│ │ │ +
PolyMeshT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -141,109 +141,637 @@ │ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45//=============================================================================
│ │ │
46//
│ │ │ -
47// Implements an IOManager writer module for OBJ files
│ │ │ +
47// CLASS PolyMeshT - IMPLEMENTATION
│ │ │
48//
│ │ │
49//=============================================================================
│ │ │
50
│ │ │
51
│ │ │ -
52#ifndef __OBJWRITER_HH__
│ │ │ -
53#define __OBJWRITER_HH__
│ │ │ +
52#define OPENMESH_POLYMESH_C
│ │ │ +
53
│ │ │
54
│ │ │ -
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ -
57
│ │ │ -
58
│ │ │ -
59#include <string>
│ │ │ -
60#include <fstream>
│ │ │ -
61
│ │ │ -
62#include <OpenMesh/Core/System/config.h>
│ │ │ -
63#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
64#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ -
65#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ -
66
│ │ │ +
55//== INCLUDES =================================================================
│ │ │ +
56
│ │ │ +
57#include <OpenMesh/Core/Mesh/PolyMeshT.hh>
│ │ │ +
58#include <OpenMesh/Core/Geometry/LoopSchemeMaskT.hh>
│ │ │ +
59#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ +
60#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ +
61#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ + │ │ │ +
63#include <vector>
│ │ │ +
64
│ │ │ +
65
│ │ │ +
66//== NAMESPACES ===============================================================
│ │ │
67
│ │ │ -
68//== NAMESPACES ===============================================================
│ │ │ -
69
│ │ │ +
68
│ │ │ +
69namespace OpenMesh {
│ │ │
70
│ │ │ -
71namespace OpenMesh {
│ │ │ -
72namespace IO {
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75//=== IMPLEMENTATION ==========================================================
│ │ │ -
76
│ │ │ -
77
│ │ │ -
│ │ │ -
82class OPENMESHDLLEXPORT _OBJWriter_ : public BaseWriter
│ │ │ -
83{
│ │ │ -
84public:
│ │ │ -
85
│ │ │ - │ │ │ -
87
│ │ │ -
89 virtual ~_OBJWriter_() {};
│ │ │ -
90
│ │ │ -
91 std::string get_description() const override { return "Alias/Wavefront"; }
│ │ │ -
92 std::string get_extensions() const override { return "obj"; }
│ │ │ -
93
│ │ │ -
94 bool write(const std::string&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
95
│ │ │ -
96 bool write(std::ostream&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
97
│ │ │ -
98 size_t binary_size(BaseExporter&, const Options&) const override { return 0; }
│ │ │ -
99
│ │ │ -
100private:
│ │ │ -
101
│ │ │ -
102 mutable std::string path_;
│ │ │ -
103 mutable std::string objName_;
│ │ │ -
104
│ │ │ -
105 mutable std::vector< OpenMesh::Vec3f > material_;
│ │ │ -
106 mutable std::map< OpenMesh::Vec3f, size_t> material_idx_;
│ │ │ -
107 mutable std::vector< OpenMesh::Vec4f > materialA_;
│ │ │ -
108 mutable std::map< OpenMesh::Vec4f, size_t> materialA_idx_;
│ │ │ -
109
│ │ │ -
110 size_t getMaterial(OpenMesh::Vec3f _color) const;
│ │ │ -
111
│ │ │ -
112 size_t getMaterial(OpenMesh::Vec4f _color) const;
│ │ │ -
113
│ │ │ -
114 bool writeMaterial(std::ostream& _out, BaseExporter&, Options) const;
│ │ │ -
115
│ │ │ -
116
│ │ │ -
117};
│ │ │ +
71//== IMPLEMENTATION ==========================================================
│ │ │ +
72
│ │ │ +
73template <class Kernel>
│ │ │ +
│ │ │ + │ │ │ +
75{
│ │ │ +
76 assert(Kernel::has_edge_status());//this function needs edge status property
│ │ │ +
77 uint n_feature_edges = 0;
│ │ │ +
78 for (EdgeIter e_it = Kernel::edges_begin(); e_it != Kernel::edges_end(); ++e_it)
│ │ │ +
79 {
│ │ │ +
80 if (fabs(calc_dihedral_angle(*e_it)) > _angle_tresh)
│ │ │ +
81 {//note: could be optimized by comparing cos(dih_angle) vs. cos(_angle_tresh)
│ │ │ +
82 this->status(*e_it).set_feature(true);
│ │ │ +
83 n_feature_edges++;
│ │ │ +
84 }
│ │ │ +
85 else
│ │ │ +
86 {
│ │ │ +
87 this->status(*e_it).set_feature(false);
│ │ │ +
88 }
│ │ │ +
89 }
│ │ │ +
90 return n_feature_edges;
│ │ │ +
91}
│ │ │ +
│ │ │ +
92
│ │ │ +
93//-----------------------------------------------------------------------------
│ │ │ +
94
│ │ │ +
95template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
98{
│ │ │ +
99 return calc_face_normal_impl(_fh, typename GenProg::IF<
│ │ │ + │ │ │ +
101 PointIs3DTag,
│ │ │ +
102 PointIsNot3DTag
│ │ │ +
103 >::Result());
│ │ │ +
104}
│ │ │
│ │ │ +
105
│ │ │ +
106template <class Kernel>
│ │ │ + │ │ │ + │ │ │ +
109{
│ │ │ +
110 assert(this->halfedge_handle(_fh).is_valid());
│ │ │ +
111 ConstFaceVertexIter fv_it(this->cfv_iter(_fh));
│ │ │ +
112
│ │ │ +
113 // Safeguard for 1-gons
│ │ │ +
114 if (!(++fv_it).is_valid()) return Normal(0, 0, 0);
│ │ │ +
115
│ │ │ +
116 // Safeguard for 2-gons
│ │ │ +
117 if (!(++fv_it).is_valid()) return Normal(0, 0, 0);
│ │ │
118
│ │ │ -
119
│ │ │ -
120//== TYPE DEFINITION ==========================================================
│ │ │ -
121
│ │ │ -
122
│ │ │ -
124extern _OBJWriter_ __OBJWriterinstance;
│ │ │ -
125OPENMESHDLLEXPORT _OBJWriter_& OBJWriter();
│ │ │ +
119 // use Newell's Method to compute the surface normal
│ │ │ +
120 Normal n(0,0,0);
│ │ │ +
121 for(fv_it = this->cfv_iter(_fh); fv_it.is_valid(); ++fv_it)
│ │ │ +
122 {
│ │ │ +
123 // next vertex
│ │ │ +
124 ConstFaceVertexIter fv_itn = fv_it;
│ │ │ +
125 ++fv_itn;
│ │ │
126
│ │ │ -
127
│ │ │ -
128//=============================================================================
│ │ │ -
129} // namespace IO
│ │ │ -
130} // namespace OpenMesh
│ │ │ -
131//=============================================================================
│ │ │ -
132#endif
│ │ │ -
133//=============================================================================
│ │ │ +
127 if (!fv_itn.is_valid())
│ │ │ +
128 fv_itn = this->cfv_iter(_fh);
│ │ │ +
129
│ │ │ +
130 // http://www.opengl.org/wiki/Calculating_a_Surface_Normal
│ │ │ +
131 const Point a = this->point(*fv_it) - this->point(*fv_itn);
│ │ │ +
132 const Point b = this->point(*fv_it) + this->point(*fv_itn);
│ │ │ +
133
│ │ │ +
134
│ │ │ +
135 // Due to traits, the value types of normals and points can be different.
│ │ │ +
136 // Therefore we cast them here.
│ │ │ +
137 n[0] += static_cast<typename vector_traits<Normal>::value_type>(a[1] * b[2]);
│ │ │ +
138 n[1] += static_cast<typename vector_traits<Normal>::value_type>(a[2] * b[0]);
│ │ │ +
139 n[2] += static_cast<typename vector_traits<Normal>::value_type>(a[0] * b[1]);
│ │ │ +
140 }
│ │ │ +
141
│ │ │ +
142 const typename vector_traits<Normal>::value_type length = norm(n);
│ │ │ +
143
│ │ │ +
144 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG
│ │ │ +
145 // vector class does not return self after component-wise
│ │ │ +
146 // self-multiplication with a scalar!!!
│ │ │ +
147 return (length != typename vector_traits<Normal>::value_type(0))
│ │ │ +
148 ? ((n *= (typename vector_traits<Normal>::value_type(1)/length)), n)
│ │ │ +
149 : Normal(0, 0, 0);
│ │ │ +
150}
│ │ │ +
151
│ │ │ +
152template <class Kernel>
│ │ │ + │ │ │ +
154PolyMeshT<Kernel>::calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const
│ │ │ +
155{
│ │ │ +
156 // Dummy fallback implementation
│ │ │ +
157 // Returns just an initialized all 0 normal
│ │ │ +
158 // This function is only used if we don't have a matching implementation
│ │ │ +
159 // for normal computation with the current vector type defined in the mesh traits
│ │ │ +
160
│ │ │ +
161 assert(false);
│ │ │ +
162
│ │ │ +
163 Normal normal;
│ │ │ +
164 vectorize(normal,Scalar(0));
│ │ │ +
165 return normal;
│ │ │ +
166}
│ │ │ +
167
│ │ │ +
168//-----------------------------------------------------------------------------
│ │ │ +
169
│ │ │ +
170template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
173calc_face_normal(const Point& _p0,
│ │ │ +
174 const Point& _p1,
│ │ │ +
175 const Point& _p2) const
│ │ │ +
176{
│ │ │ +
177 return calc_face_normal_impl(_p0, _p1, _p2, typename GenProg::IF<
│ │ │ + │ │ │ +
179 PointIs3DTag,
│ │ │ +
180 PointIsNot3DTag
│ │ │ +
181 >::Result());
│ │ │ +
182}
│ │ │ +
│ │ │ +
183
│ │ │ +
184template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
187calc_normal(FaceHandle _fh) const
│ │ │ +
188{
│ │ │ +
189 return calc_face_normal(_fh);
│ │ │ +
190}
│ │ │ +
│ │ │ +
191
│ │ │ +
192template <class Kernel>
│ │ │ + │ │ │ + │ │ │ +
195calc_face_normal_impl(const Point& _p0,
│ │ │ +
196 const Point& _p1,
│ │ │ +
197 const Point& _p2,
│ │ │ +
198 PointIs3DTag) const
│ │ │ +
199{
│ │ │ +
200#if 1
│ │ │ +
201 // The OpenSG <Vector>::operator -= () does not support the type Point
│ │ │ +
202 // as rhs. Therefore use vector_cast at this point!!!
│ │ │ +
203 // Note! OpenSG distinguishes between Normal and Point!!!
│ │ │ +
204 Normal p1p0(vector_cast<Normal>(_p0)); p1p0 -= vector_cast<Normal>(_p1);
│ │ │ +
205 Normal p1p2(vector_cast<Normal>(_p2)); p1p2 -= vector_cast<Normal>(_p1);
│ │ │ +
206
│ │ │ +
207 Normal n = cross(p1p2, p1p0);
│ │ │ +
208 typename vector_traits<Normal>::value_type length = norm(n);
│ │ │ +
209
│ │ │ +
210 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG
│ │ │ +
211 // vector class does not return self after component-wise
│ │ │ +
212 // self-multiplication with a scalar!!!
│ │ │ +
213 return (length != typename vector_traits<Normal>::value_type(0))
│ │ │ +
214 ? ((n *= (typename vector_traits<Normal>::value_type(1)/length)),n)
│ │ │ +
215 : Normal(0,0,0);
│ │ │ +
216#else
│ │ │ +
217 Point p1p0 = _p0; p1p0 -= _p1;
│ │ │ +
218 Point p1p2 = _p2; p1p2 -= _p1;
│ │ │ +
219
│ │ │ +
220 Normal n = vector_cast<Normal>(cross(p1p2, p1p0));
│ │ │ +
221 typename vector_traits<Normal>::value_type length = norm(n);
│ │ │ +
222
│ │ │ +
223 return (length != 0.0) ? n *= (1.0/length) : Normal(0,0,0);
│ │ │ +
224#endif
│ │ │ +
225}
│ │ │ +
226
│ │ │ +
227template <class Kernel>
│ │ │ + │ │ │ +
229PolyMeshT<Kernel>::calc_face_normal_impl(const Point&, const Point&, const Point&, PointIsNot3DTag) const
│ │ │ +
230{
│ │ │ +
231
│ │ │ +
232 // Dummy fallback implementation
│ │ │ +
233 // Returns just an initialized all 0 normal
│ │ │ +
234 // This function is only used if we don't have a matching implementation
│ │ │ +
235 // for normal computation with the current vector type defined in the mesh traits
│ │ │ +
236
│ │ │ +
237 assert(false);
│ │ │ +
238
│ │ │ +
239 Normal normal;
│ │ │ +
240 vectorize(normal,Scalar(0));
│ │ │ +
241 return normal;
│ │ │ +
242}
│ │ │ +
243
│ │ │ +
244//-----------------------------------------------------------------------------
│ │ │ +
245
│ │ │ +
246template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ + │ │ │ +
250{
│ │ │ +
251 Point _pt;
│ │ │ +
252 vectorize(_pt, Scalar(0));
│ │ │ +
253 Scalar valence = 0.0;
│ │ │ +
254 for (ConstFaceVertexIter cfv_it = this->cfv_iter(_fh); cfv_it.is_valid(); ++cfv_it, valence += 1.0)
│ │ │ +
255 {
│ │ │ +
256 _pt += this->point(*cfv_it);
│ │ │ +
257 }
│ │ │ +
258 _pt /= valence;
│ │ │ +
259 return _pt;
│ │ │ +
260}
│ │ │ +
│ │ │ +
261
│ │ │ +
262//-----------------------------------------------------------------------------
│ │ │ +
263
│ │ │ +
264template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
267calc_centroid(FaceHandle _fh) const
│ │ │ +
268{
│ │ │ +
269 return calc_face_centroid(_fh);
│ │ │ +
270}
│ │ │ +
│ │ │ +
271
│ │ │ +
272//-----------------------------------------------------------------------------
│ │ │ +
273
│ │ │ +
274template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
277calc_centroid(EdgeHandle _eh) const
│ │ │ +
278{
│ │ │ +
279 return this->calc_edge_midpoint(_eh);
│ │ │ +
280}
│ │ │ +
│ │ │ +
281
│ │ │ +
282//-----------------------------------------------------------------------------
│ │ │ +
283
│ │ │ +
284template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ + │ │ │ +
288{
│ │ │ +
289 return this->calc_edge_midpoint(this->edge_handle(_heh));
│ │ │ +
290}
│ │ │ +
│ │ │ +
291
│ │ │ +
292//-----------------------------------------------------------------------------
│ │ │ +
293
│ │ │ +
294template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ + │ │ │ +
298{
│ │ │ +
299 return this->point(_vh);
│ │ │ +
300}
│ │ │ +
│ │ │ +
301
│ │ │ +
302//-----------------------------------------------------------------------------
│ │ │ +
303
│ │ │ +
304template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
307calc_centroid(MeshHandle /*_mh*/) const
│ │ │ +
308{
│ │ │ +
309 return this->vertices().avg([this](VertexHandle vh) { return this->point(vh); });
│ │ │ +
310}
│ │ │ +
│ │ │ +
311
│ │ │ +
312//-----------------------------------------------------------------------------
│ │ │ +
313
│ │ │ +
314template <class Kernel>
│ │ │ +
315void
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
318{
│ │ │ +
319 // Face normals are required to compute the vertex and the halfedge normals
│ │ │ +
320 if (Kernel::has_face_normals() ) {
│ │ │ +
321 update_face_normals();
│ │ │ +
322
│ │ │ +
323 if (Kernel::has_vertex_normals() ) update_vertex_normals();
│ │ │ +
324 if (Kernel::has_halfedge_normals()) update_halfedge_normals();
│ │ │ +
325 }
│ │ │ +
326}
│ │ │ +
│ │ │ +
327
│ │ │ +
328
│ │ │ +
329//-----------------------------------------------------------------------------
│ │ │ +
330
│ │ │ +
331
│ │ │ +
332template <class Kernel>
│ │ │ +
333void
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
336{
│ │ │ +
337 FaceIter f_it(Kernel::faces_sbegin()), f_end(Kernel::faces_end());
│ │ │ +
338
│ │ │ +
339 for (; f_it != f_end; ++f_it)
│ │ │ +
340 this->set_normal(*f_it, calc_face_normal(*f_it));
│ │ │ +
341}
│ │ │ +
│ │ │ +
342
│ │ │ +
343
│ │ │ +
344//-----------------------------------------------------------------------------
│ │ │ +
345
│ │ │ +
346
│ │ │ +
347template <class Kernel>
│ │ │ +
348void
│ │ │ +
│ │ │ + │ │ │ +
350update_halfedge_normals(const double _feature_angle)
│ │ │ +
351{
│ │ │ +
352 HalfedgeIter h_it(Kernel::halfedges_begin()), h_end(Kernel::halfedges_end());
│ │ │ +
353
│ │ │ +
354 for (; h_it != h_end; ++h_it)
│ │ │ +
355 this->set_normal(*h_it, calc_halfedge_normal(*h_it, _feature_angle));
│ │ │ +
356}
│ │ │ +
│ │ │ +
357
│ │ │ +
358
│ │ │ +
359//-----------------------------------------------------------------------------
│ │ │ +
360
│ │ │ +
361
│ │ │ +
362template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
365calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle) const
│ │ │ +
366{
│ │ │ +
367 if(Kernel::is_boundary(_heh))
│ │ │ +
368 return Normal(0,0,0);
│ │ │ +
369 else
│ │ │ +
370 {
│ │ │ +
371 std::vector<FaceHandle> fhs; fhs.reserve(10);
│ │ │ +
372
│ │ │ +
373 HalfedgeHandle heh = _heh;
│ │ │ +
374
│ │ │ +
375 // collect CW face-handles
│ │ │ +
376 do
│ │ │ +
377 {
│ │ │ +
378 fhs.push_back(Kernel::face_handle(heh));
│ │ │ +
379
│ │ │ +
380 heh = Kernel::next_halfedge_handle(heh);
│ │ │ +
381 heh = Kernel::opposite_halfedge_handle(heh);
│ │ │ +
382 }
│ │ │ +
383 while(heh != _heh && !Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, _feature_angle));
│ │ │ +
384
│ │ │ +
385 // collect CCW face-handles
│ │ │ +
386 if(heh != _heh && !is_estimated_feature_edge(_heh, _feature_angle))
│ │ │ +
387 {
│ │ │ +
388 heh = Kernel::opposite_halfedge_handle(_heh);
│ │ │ +
389
│ │ │ +
390 if ( !Kernel::is_boundary(heh) ) {
│ │ │ +
391 do
│ │ │ +
392 {
│ │ │ +
393
│ │ │ +
394 fhs.push_back(Kernel::face_handle(heh));
│ │ │ +
395
│ │ │ +
396 heh = Kernel::prev_halfedge_handle(heh);
│ │ │ +
397 heh = Kernel::opposite_halfedge_handle(heh);
│ │ │ +
398 }
│ │ │ +
399 while(!Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, _feature_angle));
│ │ │ +
400 }
│ │ │ +
401 }
│ │ │ +
402
│ │ │ +
403 Normal n(0,0,0);
│ │ │ +
404 for (unsigned int i = 0; i < fhs.size(); ++i)
│ │ │ +
405 n += Kernel::has_face_normals() ? Kernel::normal(fhs[i]) : calc_face_normal(fhs[i]);
│ │ │ +
406
│ │ │ +
407 return normalize(n);
│ │ │ +
408 }
│ │ │ +
409}
│ │ │ +
│ │ │ +
410
│ │ │ +
411
│ │ │ +
412//-----------------------------------------------------------------------------
│ │ │ +
413
│ │ │ +
414
│ │ │ +
415template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
418calc_normal(HalfedgeHandle _heh, const double _feature_angle) const
│ │ │ +
419{
│ │ │ +
420 return calc_halfedge_normal(_heh, _feature_angle);
│ │ │ +
421}
│ │ │ +
│ │ │ +
422
│ │ │ +
423
│ │ │ +
424//-----------------------------------------------------------------------------
│ │ │ +
425
│ │ │ +
426
│ │ │ +
427template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
430calc_normal(EdgeHandle _eh) const
│ │ │ +
431{
│ │ │ +
432 Normal n(0, 0, 0);
│ │ │ +
433 for (int i = 0; i < 2; ++i)
│ │ │ +
434 {
│ │ │ +
435 const auto heh = this->halfedge_handle(_eh, i);
│ │ │ +
436 const auto fh = this->face_handle(heh);
│ │ │ +
437 if (fh.is_valid())
│ │ │ +
438 n += calc_normal(fh);
│ │ │ +
439 }
│ │ │ +
440 const auto length = norm(n);
│ │ │ +
441 if (length != 0)
│ │ │ +
442 n /= length;
│ │ │ +
443 return n;
│ │ │ +
444}
│ │ │ +
│ │ │ +
445
│ │ │ +
446//-----------------------------------------------------------------------------
│ │ │ +
447
│ │ │ +
448
│ │ │ +
449template <class Kernel>
│ │ │ +
450bool
│ │ │ +
│ │ │ + │ │ │ +
452is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
│ │ │ +
453{
│ │ │ +
454 EdgeHandle eh = Kernel::edge_handle(_heh);
│ │ │ +
455
│ │ │ +
456 if(Kernel::has_edge_status())
│ │ │ +
457 {
│ │ │ +
458 if(Kernel::status(eh).feature())
│ │ │ +
459 return true;
│ │ │ +
460 }
│ │ │ +
461
│ │ │ +
462 if(Kernel::is_boundary(eh))
│ │ │ +
463 return false;
│ │ │ +
464
│ │ │ +
465 // compute angle between faces
│ │ │ +
466 FaceHandle fh0 = Kernel::face_handle(_heh);
│ │ │ +
467 FaceHandle fh1 = Kernel::face_handle(Kernel::opposite_halfedge_handle(_heh));
│ │ │ +
468
│ │ │ +
469 Normal fn0 = Kernel::has_face_normals() ? Kernel::normal(fh0) : calc_face_normal(fh0);
│ │ │ +
470 Normal fn1 = Kernel::has_face_normals() ? Kernel::normal(fh1) : calc_face_normal(fh1);
│ │ │ +
471
│ │ │ +
472 // dihedral angle above angle threshold
│ │ │ +
473 return ( dot(fn0,fn1) < cos(_feature_angle) );
│ │ │ +
474}
│ │ │ +
│ │ │ +
475
│ │ │ +
476
│ │ │ +
477//-----------------------------------------------------------------------------
│ │ │ +
478
│ │ │ +
479
│ │ │ +
480template <class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ + │ │ │ +
484{
│ │ │ +
485 Normal n;
│ │ │ +
486 calc_vertex_normal_fast(_vh,n);
│ │ │ +
487
│ │ │ +
488 Scalar length = norm(n);
│ │ │ +
489 if (length != 0.0) n *= (Scalar(1.0)/length);
│ │ │ +
490
│ │ │ +
491 return n;
│ │ │ +
492}
│ │ │ +
│ │ │ +
493
│ │ │ +
494//-----------------------------------------------------------------------------
│ │ │ +
495template <class Kernel>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
498{
│ │ │ +
499 vectorize(_n, Scalar(0));
│ │ │ +
500 for (ConstVertexFaceIter vf_it = this->cvf_iter(_vh); vf_it.is_valid(); ++vf_it)
│ │ │ +
501 _n += this->normal(*vf_it);
│ │ │ +
502}
│ │ │ +
│ │ │ +
503
│ │ │ +
504//-----------------------------------------------------------------------------
│ │ │ +
505template <class Kernel>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
508{
│ │ │ +
509 vectorize(_n, Scalar(0));
│ │ │ +
510 ConstVertexIHalfedgeIter cvih_it = this->cvih_iter(_vh);
│ │ │ +
511 if (! cvih_it.is_valid() )
│ │ │ +
512 {//don't crash on isolated vertices
│ │ │ +
513 return;
│ │ │ +
514 }
│ │ │ +
515 Normal in_he_vec;
│ │ │ +
516 calc_edge_vector(*cvih_it, in_he_vec);
│ │ │ +
517 for ( ; cvih_it.is_valid(); ++cvih_it)
│ │ │ +
518 {//calculates the sector normal defined by cvih_it and adds it to _n
│ │ │ +
519 if (this->is_boundary(*cvih_it))
│ │ │ +
520 {
│ │ │ +
521 continue;
│ │ │ +
522 }
│ │ │ +
523 HalfedgeHandle out_heh(this->next_halfedge_handle(*cvih_it));
│ │ │ +
524 Normal out_he_vec;
│ │ │ +
525 calc_edge_vector(out_heh, out_he_vec);
│ │ │ +
526 _n += cross(in_he_vec, out_he_vec);//sector area is taken into account
│ │ │ +
527 in_he_vec = out_he_vec;
│ │ │ +
528 in_he_vec *= -1;//change the orientation
│ │ │ +
529 }
│ │ │ +
530 Scalar length = norm(_n);
│ │ │ +
531 if (length != 0.0)
│ │ │ +
532 _n *= (Scalar(1.0)/length);
│ │ │ +
533}
│ │ │ +
│ │ │ +
534
│ │ │ +
535//-----------------------------------------------------------------------------
│ │ │ +
536template <class Kernel>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
539{
│ │ │ +
540 static const LoopSchemeMaskDouble& loop_scheme_mask__ =
│ │ │ + │ │ │ +
542
│ │ │ +
543 Normal t_v(0.0,0.0,0.0), t_w(0.0,0.0,0.0);
│ │ │ +
544 unsigned int vh_val = this->valence(_vh);
│ │ │ +
545 unsigned int i = 0;
│ │ │ +
546 for (ConstVertexOHalfedgeIter cvoh_it = this->cvoh_iter(_vh); cvoh_it.is_valid(); ++cvoh_it, ++i)
│ │ │ +
547 {
│ │ │ +
548 VertexHandle r1_v( this->to_vertex_handle(*cvoh_it) );
│ │ │ +
549 t_v += (typename vector_traits<Point>::value_type)(loop_scheme_mask__.tang0_weight(vh_val, i))*this->point(r1_v);
│ │ │ +
550 t_w += (typename vector_traits<Point>::value_type)(loop_scheme_mask__.tang1_weight(vh_val, i))*this->point(r1_v);
│ │ │ +
551 }
│ │ │ +
552 _n = cross(t_w, t_v);//hack: should be cross(t_v, t_w), but then the normals are reversed?
│ │ │ +
553}
│ │ │ +
│ │ │ +
554
│ │ │ +
555//-----------------------------------------------------------------------------
│ │ │ +
556
│ │ │ +
557template<class Kernel>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ +
560calc_normal(VertexHandle _vh) const
│ │ │ +
561{
│ │ │ +
562 Normal n;
│ │ │ +
563 calc_vertex_normal_correct(_vh, n);
│ │ │ +
564 return n;
│ │ │ +
565}
│ │ │ +
│ │ │ +
566
│ │ │ +
567//-----------------------------------------------------------------------------
│ │ │ +
568
│ │ │ +
569template <class Kernel>
│ │ │ +
570void
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
573{
│ │ │ +
574 VertexIter v_it(Kernel::vertices_begin()), v_end(Kernel::vertices_end());
│ │ │ +
575
│ │ │ +
576 for (; v_it!=v_end; ++v_it)
│ │ │ +
577 this->set_normal(*v_it, calc_vertex_normal(*v_it));
│ │ │ +
578}
│ │ │ +
│ │ │ +
579
│ │ │ +
580//=============================================================================
│ │ │ +
581} // namespace OpenMesh
│ │ │ +
582//=============================================================================
│ │ │ +
This file provides the streams omlog, omout, and omerr.
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
_OBJWriter_ __OBJWriterinstance
Declare the single entity of the OBJ writer.
Definition OBJWriter.cc:69
│ │ │ - │ │ │ - │ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for all writer modules.
Definition BaseWriter.hh:84
│ │ │ -
This class defines the OBJ writer.
Definition OBJWriter.hh:83
│ │ │ -
std::string get_extensions() const override
Return file format's extension.
Definition OBJWriter.hh:92
│ │ │ -
std::string get_description() const override
Return short description of the supported file format.
Definition OBJWriter.hh:91
│ │ │ -
size_t binary_size(BaseExporter &, const Options &) const override
Returns expected size of file if binary format is supported else 0.
Definition OBJWriter.hh:98
│ │ │ -
virtual ~_OBJWriter_()
Destructor.
Definition OBJWriter.hh:89
│ │ │ +
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ +
@ Normal
Add normals to mesh item (vertices/faces)
Definition Attributes.hh:82
│ │ │ +
implements cache for the weights of the original Loop scheme supported:
Definition LoopSchemeMaskT.hh:67
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │ +
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ +
void calc_face_centroid(FaceHandle _fh, Point &_pt) const
calculates the average of the vertices defining _fh
Definition PolyMeshT.hh:282
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition PolyMeshT.hh:177
│ │ │ +
void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const
Different methods for calculation of the normal at _vh:
Definition PolyMeshT_impl.hh:497
│ │ │ +
void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:507
│ │ │ +
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │ +
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ +
void update_face_normals()
Update normal vectors for all faces.
Definition PolyMeshT_impl.hh:335
│ │ │ +
void update_halfedge_normals(const double _feature_angle=0.8)
Update normal vectors for all halfedges.
Definition PolyMeshT_impl.hh:350
│ │ │ +
unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0))
tags an edge as a feature if its dihedral angle is larger than _angle_tresh returns the number of the...
Definition PolyMeshT_impl.hh:74
│ │ │ +
virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) const
Calculate halfedge normal for one specific halfedge.
Definition PolyMeshT_impl.hh:365
│ │ │ +
void update_normals()
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:317
│ │ │ +
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition PolyMeshT.hh:176
│ │ │ +
Point calc_centroid(FaceHandle _fh) const
Computes and returns the average of the vertices defining _fh (same as calc_face_centroid)
Definition PolyMeshT_impl.hh:267
│ │ │ +
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:174
│ │ │ +
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition PolyMeshT_impl.hh:97
│ │ │ +
bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
identifies feature edges w.r.t.
Definition PolyMeshT_impl.hh:452
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ +
void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:538
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ +
void update_vertex_normals()
Update normal vectors for all vertices.
Definition PolyMeshT_impl.hh:572
│ │ │ +
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:173
│ │ │ +
Kernel::HalfedgeIter HalfedgeIter
Scalar type.
Definition PolyMeshT.hh:144
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
Normal calc_normal(FaceHandle _fh) const
same as calc_face_normal
Definition PolyMeshT_impl.hh:187
│ │ │ +
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ +
Normal calc_vertex_normal(VertexHandle _vh) const
Calculate vertex normal for one specific vertex.
Definition PolyMeshT_impl.hh:483
│ │ │ +
static T & Instance()
Singleton access function.
Definition SingletonT.hh:86
│ │ │ +
Helper class providing information about a vector type.
Definition vector_traits.hh:89
│ │ │ +
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -OBJWriter.hh │ │ │ │ +PolyMeshT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -51,140 +51,757 @@ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45// │ │ │ │ ============================================================================= │ │ │ │ 46// │ │ │ │ -47// Implements an IOManager writer module for OBJ files │ │ │ │ +47// CLASS PolyMeshT - IMPLEMENTATION │ │ │ │ 48// │ │ │ │ 49// │ │ │ │ ============================================================================= │ │ │ │ 50 │ │ │ │ 51 │ │ │ │ -52#ifndef __OBJWRITER_HH__ │ │ │ │ -53#define __OBJWRITER_HH__ │ │ │ │ +52#define OPENMESH_POLYMESH_C │ │ │ │ +53 │ │ │ │ 54 │ │ │ │ -55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ -57 │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61 │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66 │ │ │ │ -67 │ │ │ │ -68//== NAMESPACES │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +56 │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ +63#include │ │ │ │ +64 │ │ │ │ +65 │ │ │ │ +66//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -69 │ │ │ │ +67 │ │ │ │ +68 │ │ │ │ +69namespace _O_p_e_n_M_e_s_h { │ │ │ │ 70 │ │ │ │ -71namespace _O_p_e_n_M_e_s_h { │ │ │ │ -72namespace IO { │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -75//=== IMPLEMENTATION │ │ │ │ +71//== IMPLEMENTATION │ │ │ │ ========================================================== │ │ │ │ -76 │ │ │ │ -77 │ │ │ │ -_8_2class OPENMESHDLLEXPORT ___O_B_J_W_r_i_t_e_r__ : public _B_a_s_e_W_r_i_t_e_r │ │ │ │ -83{ │ │ │ │ -84public: │ │ │ │ -85 │ │ │ │ -86 ___O_B_J_W_r_i_t_e_r__(); │ │ │ │ -87 │ │ │ │ -_8_9 virtual _~___O_B_J_W_r_i_t_e_r__() {}; │ │ │ │ -90 │ │ │ │ -_9_1 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "Alias/Wavefront"; } │ │ │ │ -_9_2 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "obj"; } │ │ │ │ -93 │ │ │ │ -94 bool write(const std::string&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -std::streamsize _precision = 6) const override; │ │ │ │ -95 │ │ │ │ -96 bool write(std::ostream&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, std:: │ │ │ │ -streamsize _precision = 6) const override; │ │ │ │ -97 │ │ │ │ -_9_8 size_t _b_i_n_a_r_y___s_i_z_e(_B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s&) const override { return 0; │ │ │ │ -} │ │ │ │ -99 │ │ │ │ -100private: │ │ │ │ -101 │ │ │ │ -102 mutable std::string path_; │ │ │ │ -103 mutable std::string objName_; │ │ │ │ -104 │ │ │ │ -105 mutable std::vector< OpenMesh::Vec3f > material_; │ │ │ │ -106 mutable std::map< OpenMesh::Vec3f, size_t> material_idx_; │ │ │ │ -107 mutable std::vector< OpenMesh::Vec4f > materialA_; │ │ │ │ -108 mutable std::map< OpenMesh::Vec4f, size_t> materialA_idx_; │ │ │ │ -109 │ │ │ │ -110 size_t getMaterial(_O_p_e_n_M_e_s_h_:_:_V_e_c_3_f _color) const; │ │ │ │ -111 │ │ │ │ -112 size_t getMaterial(_O_p_e_n_M_e_s_h_:_:_V_e_c_4_f _color) const; │ │ │ │ -113 │ │ │ │ -114 bool writeMaterial(std::ostream& _out, _B_a_s_e_E_x_p_o_r_t_e_r&, _O_p_t_i_o_n_s) const; │ │ │ │ +72 │ │ │ │ +73template │ │ │ │ +_7_4uint _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s(_S_c_a_l_a_r _angle_tresh) │ │ │ │ +75{ │ │ │ │ +76 assert(Kernel::has_edge_status());//this function needs edge status property │ │ │ │ +77 uint n_feature_edges = 0; │ │ │ │ +78 for (_E_d_g_e_I_t_e_r e_it = Kernel::edges_begin(); e_it != Kernel::edges_end(); │ │ │ │ +++e_it) │ │ │ │ +79 { │ │ │ │ +80 if (fabs(calc_dihedral_angle(*e_it)) > _angle_tresh) │ │ │ │ +81 {//note: could be optimized by comparing cos(dih_angle) vs. cos │ │ │ │ +(_angle_tresh) │ │ │ │ +82 this->status(*e_it).set_feature(true); │ │ │ │ +83 n_feature_edges++; │ │ │ │ +84 } │ │ │ │ +85 else │ │ │ │ +86 { │ │ │ │ +87 this->status(*e_it).set_feature(false); │ │ │ │ +88 } │ │ │ │ +89 } │ │ │ │ +90 return n_feature_edges; │ │ │ │ +91} │ │ │ │ +92 │ │ │ │ +93//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +94 │ │ │ │ +95template │ │ │ │ +96typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_9_7_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +98{ │ │ │ │ +99 return calc_face_normal_impl(_fh, typename GenProg::IF< │ │ │ │ +100 _v_e_c_t_o_r___t_r_a_i_t_s<_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t>::size_ == 3, │ │ │ │ +101 PointIs3DTag, │ │ │ │ +102 PointIsNot3DTag │ │ │ │ +103 >::Result()); │ │ │ │ +104} │ │ │ │ +105 │ │ │ │ +106template │ │ │ │ +107typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +108_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l___i_m_p_l(_F_a_c_e_H_a_n_d_l_e _fh, PointIs3DTag) const │ │ │ │ +109{ │ │ │ │ +110 assert(this->halfedge_handle(_fh).is_valid()); │ │ │ │ +111 ConstFaceVertexIter fv_it(this->cfv_iter(_fh)); │ │ │ │ +112 │ │ │ │ +113 // Safeguard for 1-gons │ │ │ │ +114 if (!(++fv_it).is_valid()) return Normal(0, 0, 0); │ │ │ │ 115 │ │ │ │ -116 │ │ │ │ -117}; │ │ │ │ +116 // Safeguard for 2-gons │ │ │ │ +117 if (!(++fv_it).is_valid()) return Normal(0, 0, 0); │ │ │ │ 118 │ │ │ │ -119 │ │ │ │ -120//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -121 │ │ │ │ -122 │ │ │ │ -124extern _OBJWriter_ _____O_B_J_W_r_i_t_e_r_i_n_s_t_a_n_c_e; │ │ │ │ -125OPENMESHDLLEXPORT _OBJWriter_& OBJWriter(); │ │ │ │ +119 // use Newell's Method to compute the surface normal │ │ │ │ +120 Normal n(0,0,0); │ │ │ │ +121 for(fv_it = this->cfv_iter(_fh); fv_it.is_valid(); ++fv_it) │ │ │ │ +122 { │ │ │ │ +123 // next vertex │ │ │ │ +124 ConstFaceVertexIter fv_itn = fv_it; │ │ │ │ +125 ++fv_itn; │ │ │ │ 126 │ │ │ │ -127 │ │ │ │ -128// │ │ │ │ -============================================================================= │ │ │ │ -129} // namespace IO │ │ │ │ -130} // namespace OpenMesh │ │ │ │ -131// │ │ │ │ +127 if (!fv_itn.is_valid()) │ │ │ │ +128 fv_itn = this->cfv_iter(_fh); │ │ │ │ +129 │ │ │ │ +130 // http://www.opengl.org/wiki/Calculating_a_Surface_Normal │ │ │ │ +131 const Point a = this->point(*fv_it) - this->point(*fv_itn); │ │ │ │ +132 const Point b = this->point(*fv_it) + this->point(*fv_itn); │ │ │ │ +133 │ │ │ │ +134 │ │ │ │ +135 // Due to traits, the value types of normals and points can be different. │ │ │ │ +136 // Therefore we cast them here. │ │ │ │ +137 n[0] += static_cast_:_:_v_a_l_u_e___t_y_p_e>(a[1] * b │ │ │ │ +[2]); │ │ │ │ +138 n[1] += static_cast_:_:_v_a_l_u_e___t_y_p_e>(a[2] * b │ │ │ │ +[0]); │ │ │ │ +139 n[2] += static_cast_:_:_v_a_l_u_e___t_y_p_e>(a[0] * b │ │ │ │ +[1]); │ │ │ │ +140 } │ │ │ │ +141 │ │ │ │ +142 const typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e length = norm(n); │ │ │ │ +143 │ │ │ │ +144 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG │ │ │ │ +145 // vector class does not return self after component-wise │ │ │ │ +146 // self-multiplication with a scalar!!! │ │ │ │ +147 return (length != typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(0)) │ │ │ │ +148 ? ((n *= (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(1)/length)), n) │ │ │ │ +149 : Normal(0, 0, 0); │ │ │ │ +150} │ │ │ │ +151 │ │ │ │ +152template │ │ │ │ +153typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +154PolyMeshT::calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const │ │ │ │ +155{ │ │ │ │ +156 // Dummy fallback implementation │ │ │ │ +157 // Returns just an initialized all 0 normal │ │ │ │ +158 // This function is only used if we don't have a matching implementation │ │ │ │ +159 // for normal computation with the current vector type defined in the mesh │ │ │ │ +traits │ │ │ │ +160 │ │ │ │ +161 assert(false); │ │ │ │ +162 │ │ │ │ +163 _N_o_r_m_a_l normal; │ │ │ │ +164 vectorize(normal,Scalar(0)); │ │ │ │ +165 return normal; │ │ │ │ +166} │ │ │ │ +167 │ │ │ │ +168//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +169 │ │ │ │ +170template │ │ │ │ +171typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_1_7_2_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +173_c_a_l_c___f_a_c_e___n_o_r_m_a_l(const _P_o_i_n_t& _p0, │ │ │ │ +174 const _P_o_i_n_t& _p1, │ │ │ │ +175 const _P_o_i_n_t& _p2) const │ │ │ │ +176{ │ │ │ │ +177 return calc_face_normal_impl(_p0, _p1, _p2, typename GenProg::IF< │ │ │ │ +178 _v_e_c_t_o_r___t_r_a_i_t_s<_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t>::size_ == 3, │ │ │ │ +179 PointIs3DTag, │ │ │ │ +180 PointIsNot3DTag │ │ │ │ +181 >::Result()); │ │ │ │ +182} │ │ │ │ +183 │ │ │ │ +184template │ │ │ │ +185typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_1_8_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +187_c_a_l_c___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +188{ │ │ │ │ +189 return calc_face_normal(_fh); │ │ │ │ +190} │ │ │ │ +191 │ │ │ │ +192template │ │ │ │ +193typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +194_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +195_c_a_l_c___f_a_c_e___n_o_r_m_a_l___i_m_p_l(const Point& _p0, │ │ │ │ +196 const Point& _p1, │ │ │ │ +197 const Point& _p2, │ │ │ │ +198 PointIs3DTag) const │ │ │ │ +199{ │ │ │ │ +200#if 1 │ │ │ │ +201 // The OpenSG ::operator -= () does not support the type Point │ │ │ │ +202 // as rhs. Therefore use vector_cast at this point!!! │ │ │ │ +203 // Note! OpenSG distinguishes between Normal and Point!!! │ │ │ │ +204 Normal p1p0(vector_cast(_p0)); p1p0 -= vector_cast(_p1); │ │ │ │ +205 Normal p1p2(vector_cast(_p2)); p1p2 -= vector_cast(_p1); │ │ │ │ +206 │ │ │ │ +207 Normal n = cross(p1p2, p1p0); │ │ │ │ +208 typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e length = norm(n); │ │ │ │ +209 │ │ │ │ +210 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG │ │ │ │ +211 // vector class does not return self after component-wise │ │ │ │ +212 // self-multiplication with a scalar!!! │ │ │ │ +213 return (length != typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(0)) │ │ │ │ +214 ? ((n *= (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(1)/length)),n) │ │ │ │ +215 : Normal(0,0,0); │ │ │ │ +216#else │ │ │ │ +217 Point p1p0 = _p0; p1p0 -= _p1; │ │ │ │ +218 Point p1p2 = _p2; p1p2 -= _p1; │ │ │ │ +219 │ │ │ │ +220 Normal n = vector_cast(cross(p1p2, p1p0)); │ │ │ │ +221 typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e length = norm(n); │ │ │ │ +222 │ │ │ │ +223 return (length != 0.0) ? n *= (1.0/length) : Normal(0,0,0); │ │ │ │ +224#endif │ │ │ │ +225} │ │ │ │ +226 │ │ │ │ +227template │ │ │ │ +228typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +229PolyMeshT::calc_face_normal_impl(const Point&, const Point&, const │ │ │ │ +Point&, PointIsNot3DTag) const │ │ │ │ +230{ │ │ │ │ +231 │ │ │ │ +232 // Dummy fallback implementation │ │ │ │ +233 // Returns just an initialized all 0 normal │ │ │ │ +234 // This function is only used if we don't have a matching implementation │ │ │ │ +235 // for normal computation with the current vector type defined in the mesh │ │ │ │ +traits │ │ │ │ +236 │ │ │ │ +237 assert(false); │ │ │ │ +238 │ │ │ │ +239 Normal normal; │ │ │ │ +240 vectorize(normal,Scalar(0)); │ │ │ │ +241 return normal; │ │ │ │ +242} │ │ │ │ +243 │ │ │ │ +244//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +245 │ │ │ │ +246template │ │ │ │ +247typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ +_2_4_8_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +249_c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +250{ │ │ │ │ +251 _P_o_i_n_t _pt; │ │ │ │ +252 vectorize(_pt, _S_c_a_l_a_r(0)); │ │ │ │ +253 _S_c_a_l_a_r valence = 0.0; │ │ │ │ +254 for (_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r cfv_it = this->cfv_iter(_fh); cfv_it.is_valid(); │ │ │ │ +++cfv_it, valence += 1.0) │ │ │ │ +255 { │ │ │ │ +256 _pt += this->point(*cfv_it); │ │ │ │ +257 } │ │ │ │ +258 _pt /= valence; │ │ │ │ +259 return _pt; │ │ │ │ +260} │ │ │ │ +261 │ │ │ │ +262//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +263 │ │ │ │ +264template │ │ │ │ +265typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ +_2_6_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +267_c_a_l_c___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +268{ │ │ │ │ +269 return calc_face_centroid(_fh); │ │ │ │ +270} │ │ │ │ +271 │ │ │ │ +272//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +273 │ │ │ │ +274template │ │ │ │ +275typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ +_2_7_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +277_c_a_l_c___c_e_n_t_r_o_i_d(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +278{ │ │ │ │ +279 return this->calc_edge_midpoint(_eh); │ │ │ │ +280} │ │ │ │ +281 │ │ │ │ +282//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +283 │ │ │ │ +284template │ │ │ │ +285typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ +_2_8_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +287_c_a_l_c___c_e_n_t_r_o_i_d(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +288{ │ │ │ │ +289 return this->calc_edge_midpoint(this->edge_handle(_heh)); │ │ │ │ +290} │ │ │ │ +291 │ │ │ │ +292//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +293 │ │ │ │ +294template │ │ │ │ +295typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ +_2_9_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +297_c_a_l_c___c_e_n_t_r_o_i_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +298{ │ │ │ │ +299 return this->point(_vh); │ │ │ │ +300} │ │ │ │ +301 │ │ │ │ +302//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +303 │ │ │ │ +304template │ │ │ │ +305typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ +_3_0_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +307_c_a_l_c___c_e_n_t_r_o_i_d(_M_e_s_h_H_a_n_d_l_e /*_mh*/) const │ │ │ │ +308{ │ │ │ │ +309 return this->vertices().avg([this](_V_e_r_t_e_x_H_a_n_d_l_e vh) { return this->point │ │ │ │ +(vh); }); │ │ │ │ +310} │ │ │ │ +311 │ │ │ │ +312//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +313 │ │ │ │ +314template │ │ │ │ +315void │ │ │ │ +_3_1_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +317_u_p_d_a_t_e___n_o_r_m_a_l_s() │ │ │ │ +318{ │ │ │ │ +319 // Face normals are required to compute the vertex and the halfedge normals │ │ │ │ +320 if (Kernel::has_face_normals() ) { │ │ │ │ +321 update_face_normals(); │ │ │ │ +322 │ │ │ │ +323 if (Kernel::has_vertex_normals() ) update_vertex_normals(); │ │ │ │ +324 if (Kernel::has_halfedge_normals()) update_halfedge_normals(); │ │ │ │ +325 } │ │ │ │ +326} │ │ │ │ +327 │ │ │ │ +328 │ │ │ │ +329//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +330 │ │ │ │ +331 │ │ │ │ +332template │ │ │ │ +333void │ │ │ │ +_3_3_4_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +335_u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s() │ │ │ │ +336{ │ │ │ │ +337 _F_a_c_e_I_t_e_r f_it(Kernel::faces_sbegin()), f_end(Kernel::faces_end()); │ │ │ │ +338 │ │ │ │ +339 for (; f_it != f_end; ++f_it) │ │ │ │ +340 this->set_normal(*f_it, calc_face_normal(*f_it)); │ │ │ │ +341} │ │ │ │ +342 │ │ │ │ +343 │ │ │ │ +344//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +345 │ │ │ │ +346 │ │ │ │ +347template │ │ │ │ +348void │ │ │ │ +_3_4_9_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +350_u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s(const double _feature_angle) │ │ │ │ +351{ │ │ │ │ +352 _H_a_l_f_e_d_g_e_I_t_e_r h_it(Kernel::halfedges_begin()), h_end(Kernel::halfedges_end │ │ │ │ +()); │ │ │ │ +353 │ │ │ │ +354 for (; h_it != h_end; ++h_it) │ │ │ │ +355 this->set_normal(*h_it, calc_halfedge_normal(*h_it, _feature_angle)); │ │ │ │ +356} │ │ │ │ +357 │ │ │ │ +358 │ │ │ │ +359//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +360 │ │ │ │ +361 │ │ │ │ +362template │ │ │ │ +363typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_3_6_4_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +365_c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle) const │ │ │ │ +366{ │ │ │ │ +367 if(Kernel::is_boundary(_heh)) │ │ │ │ +368 return _N_o_r_m_a_l(0,0,0); │ │ │ │ +369 else │ │ │ │ +370 { │ │ │ │ +371 std::vector fhs; fhs.reserve(10); │ │ │ │ +372 │ │ │ │ +373 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh = _heh; │ │ │ │ +374 │ │ │ │ +375 // collect CW face-handles │ │ │ │ +376 do │ │ │ │ +377 { │ │ │ │ +378 fhs.push_back(Kernel::face_handle(heh)); │ │ │ │ +379 │ │ │ │ +380 heh = Kernel::next_halfedge_handle(heh); │ │ │ │ +381 heh = Kernel::opposite_halfedge_handle(heh); │ │ │ │ +382 } │ │ │ │ +383 while(heh != _heh && !Kernel::is_boundary(heh) && │ │ │ │ +!is_estimated_feature_edge(heh, _feature_angle)); │ │ │ │ +384 │ │ │ │ +385 // collect CCW face-handles │ │ │ │ +386 if(heh != _heh && !is_estimated_feature_edge(_heh, _feature_angle)) │ │ │ │ +387 { │ │ │ │ +388 heh = Kernel::opposite_halfedge_handle(_heh); │ │ │ │ +389 │ │ │ │ +390 if ( !Kernel::is_boundary(heh) ) { │ │ │ │ +391 do │ │ │ │ +392 { │ │ │ │ +393 │ │ │ │ +394 fhs.push_back(Kernel::face_handle(heh)); │ │ │ │ +395 │ │ │ │ +396 heh = Kernel::prev_halfedge_handle(heh); │ │ │ │ +397 heh = Kernel::opposite_halfedge_handle(heh); │ │ │ │ +398 } │ │ │ │ +399 while(!Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, │ │ │ │ +_feature_angle)); │ │ │ │ +400 } │ │ │ │ +401 } │ │ │ │ +402 │ │ │ │ +403 _N_o_r_m_a_l n(0,0,0); │ │ │ │ +404 for (unsigned int i = 0; i < fhs.size(); ++i) │ │ │ │ +405 n += Kernel::has_face_normals() ? Kernel::normal(fhs[i]) : calc_face_normal │ │ │ │ +(fhs[i]); │ │ │ │ +406 │ │ │ │ +407 return normalize(n); │ │ │ │ +408 } │ │ │ │ +409} │ │ │ │ +410 │ │ │ │ +411 │ │ │ │ +412//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +413 │ │ │ │ +414 │ │ │ │ +415template │ │ │ │ +416typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_4_1_7_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +418_c_a_l_c___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle) const │ │ │ │ +419{ │ │ │ │ +420 return calc_halfedge_normal(_heh, _feature_angle); │ │ │ │ +421} │ │ │ │ +422 │ │ │ │ +423 │ │ │ │ +424//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +425 │ │ │ │ +426 │ │ │ │ +427template │ │ │ │ +428typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_4_2_9_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +430_c_a_l_c___n_o_r_m_a_l(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +431{ │ │ │ │ +432 _N_o_r_m_a_l n(0, 0, 0); │ │ │ │ +433 for (int i = 0; i < 2; ++i) │ │ │ │ +434 { │ │ │ │ +435 const auto heh = this->halfedge_handle(_eh, i); │ │ │ │ +436 const auto fh = this->face_handle(heh); │ │ │ │ +437 if (fh.is_valid()) │ │ │ │ +438 n += calc_normal(fh); │ │ │ │ +439 } │ │ │ │ +440 const auto length = norm(n); │ │ │ │ +441 if (length != 0) │ │ │ │ +442 n /= length; │ │ │ │ +443 return n; │ │ │ │ +444} │ │ │ │ +445 │ │ │ │ +446//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +447 │ │ │ │ +448 │ │ │ │ +449template │ │ │ │ +450bool │ │ │ │ +_4_5_1_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +452_i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle) │ │ │ │ +const │ │ │ │ +453{ │ │ │ │ +454 _E_d_g_e_H_a_n_d_l_e eh = Kernel::edge_handle(_heh); │ │ │ │ +455 │ │ │ │ +456 if(Kernel::has_edge_status()) │ │ │ │ +457 { │ │ │ │ +458 if(Kernel::status(eh).feature()) │ │ │ │ +459 return true; │ │ │ │ +460 } │ │ │ │ +461 │ │ │ │ +462 if(Kernel::is_boundary(eh)) │ │ │ │ +463 return false; │ │ │ │ +464 │ │ │ │ +465 // compute angle between faces │ │ │ │ +466 _F_a_c_e_H_a_n_d_l_e fh0 = Kernel::face_handle(_heh); │ │ │ │ +467 _F_a_c_e_H_a_n_d_l_e fh1 = Kernel::face_handle(Kernel::opposite_halfedge_handle │ │ │ │ +(_heh)); │ │ │ │ +468 │ │ │ │ +469 _N_o_r_m_a_l fn0 = Kernel::has_face_normals() ? Kernel::normal(fh0) : │ │ │ │ +calc_face_normal(fh0); │ │ │ │ +470 _N_o_r_m_a_l fn1 = Kernel::has_face_normals() ? Kernel::normal(fh1) : │ │ │ │ +calc_face_normal(fh1); │ │ │ │ +471 │ │ │ │ +472 // dihedral angle above angle threshold │ │ │ │ +473 return ( _d_o_t(fn0,fn1) < cos(_feature_angle) ); │ │ │ │ +474} │ │ │ │ +475 │ │ │ │ +476 │ │ │ │ +477//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +478 │ │ │ │ +479 │ │ │ │ +480template │ │ │ │ +481typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_4_8_2_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +483_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +484{ │ │ │ │ +485 _N_o_r_m_a_l n; │ │ │ │ +486 calc_vertex_normal_fast(_vh,n); │ │ │ │ +487 │ │ │ │ +488 _S_c_a_l_a_r length = norm(n); │ │ │ │ +489 if (length != 0.0) n *= (_S_c_a_l_a_r(1.0)/length); │ │ │ │ +490 │ │ │ │ +491 return n; │ │ │ │ +492} │ │ │ │ +493 │ │ │ │ +494//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +495template │ │ │ │ +_4_9_6void _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +497_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const │ │ │ │ +498{ │ │ │ │ +499 vectorize(_n, _S_c_a_l_a_r(0)); │ │ │ │ +500 for (_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r vf_it = this->cvf_iter(_vh); vf_it.is_valid(); │ │ │ │ +++vf_it) │ │ │ │ +501 _n += this->normal(*vf_it); │ │ │ │ +502} │ │ │ │ +503 │ │ │ │ +504//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +505template │ │ │ │ +_5_0_6void _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +507_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const │ │ │ │ +508{ │ │ │ │ +509 vectorize(_n, _S_c_a_l_a_r(0)); │ │ │ │ +510 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r cvih_it = this->cvih_iter(_vh); │ │ │ │ +511 if (! cvih_it.is_valid() ) │ │ │ │ +512 {//don't crash on isolated vertices │ │ │ │ +513 return; │ │ │ │ +514 } │ │ │ │ +515 _N_o_r_m_a_l in_he_vec; │ │ │ │ +516 calc_edge_vector(*cvih_it, in_he_vec); │ │ │ │ +517 for ( ; cvih_it.is_valid(); ++cvih_it) │ │ │ │ +518 {//calculates the sector normal defined by cvih_it and adds it to _n │ │ │ │ +519 if (this->is_boundary(*cvih_it)) │ │ │ │ +520 { │ │ │ │ +521 continue; │ │ │ │ +522 } │ │ │ │ +523 _H_a_l_f_e_d_g_e_H_a_n_d_l_e out_heh(this->next_halfedge_handle(*cvih_it)); │ │ │ │ +524 _N_o_r_m_a_l out_he_vec; │ │ │ │ +525 calc_edge_vector(out_heh, out_he_vec); │ │ │ │ +526 _n += cross(in_he_vec, out_he_vec);//sector area is taken into account │ │ │ │ +527 in_he_vec = out_he_vec; │ │ │ │ +528 in_he_vec *= -1;//change the orientation │ │ │ │ +529 } │ │ │ │ +530 _S_c_a_l_a_r length = norm(_n); │ │ │ │ +531 if (length != 0.0) │ │ │ │ +532 _n *= (_S_c_a_l_a_r(1.0)/length); │ │ │ │ +533} │ │ │ │ +534 │ │ │ │ +535//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +536template │ │ │ │ +_5_3_7void _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +538_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const │ │ │ │ +539{ │ │ │ │ +540 static const _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e& loop_scheme_mask__ = │ │ │ │ +541 _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e_S_i_n_g_l_e_t_o_n_:_:_I_n_s_t_a_n_c_e(); │ │ │ │ +542 │ │ │ │ +543 _N_o_r_m_a_l t_v(0.0,0.0,0.0), t_w(0.0,0.0,0.0); │ │ │ │ +544 unsigned int vh_val = this->valence(_vh); │ │ │ │ +545 unsigned int i = 0; │ │ │ │ +546 for (_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r cvoh_it = this->cvoh_iter(_vh); │ │ │ │ +cvoh_it.is_valid(); ++cvoh_it, ++i) │ │ │ │ +547 { │ │ │ │ +548 _V_e_r_t_e_x_H_a_n_d_l_e r1_v( this->to_vertex_handle(*cvoh_it) ); │ │ │ │ +549 t_v += (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_P_o_i_n_t_>_:_:_v_a_l_u_e___t_y_p_e) │ │ │ │ +(loop_scheme_mask__.tang0_weight(vh_val, i))*this->point(r1_v); │ │ │ │ +550 t_w += (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_P_o_i_n_t_>_:_:_v_a_l_u_e___t_y_p_e) │ │ │ │ +(loop_scheme_mask__.tang1_weight(vh_val, i))*this->point(r1_v); │ │ │ │ +551 } │ │ │ │ +552 _n = cross(t_w, t_v);//hack: should be cross(t_v, t_w), but then the │ │ │ │ +normals are reversed? │ │ │ │ +553} │ │ │ │ +554 │ │ │ │ +555//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +556 │ │ │ │ +557template │ │ │ │ +558typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ +_5_5_9_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +560_c_a_l_c___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +561{ │ │ │ │ +562 _N_o_r_m_a_l n; │ │ │ │ +563 calc_vertex_normal_correct(_vh, n); │ │ │ │ +564 return n; │ │ │ │ +565} │ │ │ │ +566 │ │ │ │ +567//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +568 │ │ │ │ +569template │ │ │ │ +570void │ │ │ │ +_5_7_1_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +572_u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s() │ │ │ │ +573{ │ │ │ │ +574 _V_e_r_t_e_x_I_t_e_r v_it(Kernel::vertices_begin()), v_end(Kernel::vertices_end()); │ │ │ │ +575 │ │ │ │ +576 for (; v_it!=v_end; ++v_it) │ │ │ │ +577 this->set_normal(*v_it, calc_vertex_normal(*v_it)); │ │ │ │ +578} │ │ │ │ +579 │ │ │ │ +580// │ │ │ │ ============================================================================= │ │ │ │ -132#endif │ │ │ │ -133// │ │ │ │ +581} // namespace OpenMesh │ │ │ │ +582// │ │ │ │ ============================================================================= │ │ │ │ +_o_m_s_t_r_e_a_m_._h_h │ │ │ │ +This file provides the streams omlog, omout, and omerr. │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_____O_B_J_W_r_i_t_e_r_i_n_s_t_a_n_c_e │ │ │ │ -_OBJWriter_ __OBJWriterinstance │ │ │ │ -Declare the single entity of the OBJ writer. │ │ │ │ -DDeeffiinniittiioonn OBJWriter.cc:69 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ -_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _4_ _> │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r │ │ │ │ -Base class for all writer modules. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_W_r_i_t_e_r__ │ │ │ │ -This class defines the OBJ writer. │ │ │ │ -DDeeffiinniittiioonn OBJWriter.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_W_r_i_t_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Return file format's extension. │ │ │ │ -DDeeffiinniittiioonn OBJWriter.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_W_r_i_t_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Return short description of the supported file format. │ │ │ │ -DDeeffiinniittiioonn OBJWriter.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_W_r_i_t_e_r___:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -size_t binary_size(BaseExporter &, const Options &) const override │ │ │ │ -Returns expected size of file if binary format is supported else 0. │ │ │ │ -DDeeffiinniittiioonn OBJWriter.hh:98 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___O_B_J_W_r_i_t_e_r___:_:_~___O_B_J_W_r_i_t_e_r__ │ │ │ │ -virtual ~_OBJWriter_() │ │ │ │ -Destructor. │ │ │ │ -DDeeffiinniittiioonn OBJWriter.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ +osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ +Adapter for osg vector member computing a scalar product. │ │ │ │ +DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_r_m_a_l │ │ │ │ +@ Normal │ │ │ │ +Add normals to mesh item (vertices/faces) │ │ │ │ +DDeeffiinniittiioonn Attributes.hh:82 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_L_o_o_p_S_c_h_e_m_e_M_a_s_k_T │ │ │ │ +implements cache for the weights of the original Loop scheme supported: │ │ │ │ +DDeeffiinniittiioonn LoopSchemeMaskT.hh:67 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ +Handle type for meshes to simplify some template programming. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ +Base type for a polygonal mesh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d │ │ │ │ +void calc_face_centroid(FaceHandle _fh, Point &_pt) const │ │ │ │ +calculates the average of the vertices defining _fh │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:282 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ +Kernel::Scalar Scalar │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstFaceVertexIter ConstFaceVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:177 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t │ │ │ │ +void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const │ │ │ │ +Different methods for calculation of the normal at _vh: │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:497 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t │ │ │ │ +void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:507 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::FaceIter FaceIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ +Kernel::Normal Normal │ │ │ │ +Normal type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s │ │ │ │ +void update_face_normals() │ │ │ │ +Update normal vectors for all faces. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:335 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s │ │ │ │ +void update_halfedge_normals(const double _feature_angle=0.8) │ │ │ │ +Update normal vectors for all halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s │ │ │ │ +unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0)) │ │ │ │ +tags an edge as a feature if its dihedral angle is larger than _angle_tresh │ │ │ │ +returns the number of the... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l │ │ │ │ +virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double │ │ │ │ +_feature_angle=0.8) const │ │ │ │ +Calculate halfedge normal for one specific halfedge. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:365 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l_s │ │ │ │ +void update_normals() │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:317 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexFaceIter ConstVertexFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___c_e_n_t_r_o_i_d │ │ │ │ +Point calc_centroid(FaceHandle _fh) const │ │ │ │ +Computes and returns the average of the vertices defining _fh (same as │ │ │ │ +calc_face_centroid) │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:267 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ +virtual Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ +Calculate normal vector for face _fh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e │ │ │ │ +bool is_estimated_feature_edge(HalfedgeHandle _heh, const double │ │ │ │ +_feature_angle) const │ │ │ │ +identifies feature edges w.r.t. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:452 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p │ │ │ │ +void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:538 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::EdgeIter EdgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s │ │ │ │ +void update_vertex_normals() │ │ │ │ +Update normal vectors for all vertices. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:572 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:173 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::HalfedgeIter HalfedgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:144 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___n_o_r_m_a_l │ │ │ │ +Normal calc_normal(FaceHandle _fh) const │ │ │ │ +same as calc_face_normal │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:187 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexIter VertexIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l │ │ │ │ +Normal calc_vertex_normal(VertexHandle _vh) const │ │ │ │ +Calculate vertex normal for one specific vertex. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:483 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_i_n_g_l_e_t_o_n_T_:_:_I_n_s_t_a_n_c_e │ │ │ │ +static T & Instance() │ │ │ │ +Singleton access function. │ │ │ │ +DDeeffiinniittiioonn SingletonT.hh:86 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s │ │ │ │ +Helper class providing information about a vector type. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +T::value_type value_type │ │ │ │ +Type of the scalar value. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00605_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/writer/PLYWriter.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/Handles.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
PLYWriter.hh
│ │ │ +
Handles.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,143 +138,228 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Implements a writer module for PLY files
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#ifndef __PLYWRITER_HH__
│ │ │ -
53#define __PLYWRITER_HH__
│ │ │ -
54
│ │ │ +
44#ifndef OPENMESH_HANDLES_HH
│ │ │ +
45#define OPENMESH_HANDLES_HH
│ │ │ +
46
│ │ │ +
47
│ │ │ +
48//== INCLUDES =================================================================
│ │ │ +
49
│ │ │ +
50#include <OpenMesh/Core/System/config.h>
│ │ │ +
51#include <ostream>
│ │ │ +
52
│ │ │ +
53
│ │ │ +
54//== NAMESPACES ===============================================================
│ │ │
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ +
56namespace OpenMesh {
│ │ │
57
│ │ │ -
58#include <string>
│ │ │ -
59#include <ostream>
│ │ │ -
60#include <vector>
│ │ │ -
61
│ │ │ -
62#include <OpenMesh/Core/System/config.h>
│ │ │ -
63#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
64#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ -
65#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ -
66#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ +
58//== CLASS DEFINITION =========================================================
│ │ │ +
59
│ │ │ +
60
│ │ │ +
│ │ │ +
62class OPENMESHDLLEXPORT BaseHandle
│ │ │ +
63{
│ │ │ +
64public:
│ │ │ +
65
│ │ │ +
66 explicit BaseHandle(int _idx=-1) : idx_(_idx) {}
│ │ │
67
│ │ │ -
68
│ │ │ -
69//== NAMESPACES ===============================================================
│ │ │ +
69 int idx() const { return idx_; }
│ │ │
70
│ │ │ -
71
│ │ │ -
72namespace OpenMesh {
│ │ │ -
73namespace IO {
│ │ │ -
74
│ │ │ -
75
│ │ │ -
76//=== IMPLEMENTATION ==========================================================
│ │ │ -
77
│ │ │ +
72 bool is_valid() const { return idx_ >= 0; }
│ │ │ +
73
│ │ │ +
75 void reset() { idx_=-1; }
│ │ │ +
77 void invalidate() { idx_ = -1; }
│ │ │
78
│ │ │ -
│ │ │ -
89class OPENMESHDLLEXPORT _PLYWriter_ : public BaseWriter
│ │ │ -
90{
│ │ │ -
91public:
│ │ │ -
92
│ │ │ - │ │ │ -
94
│ │ │ -
96 virtual ~_PLYWriter_() {};
│ │ │ -
97
│ │ │ -
98 std::string get_description() const override { return "PLY polygon file format"; }
│ │ │ -
99 std::string get_extensions() const override { return "ply"; }
│ │ │ +
79 bool operator==(const BaseHandle& _rhs) const {
│ │ │ +
80 return (this->idx_ == _rhs.idx_);
│ │ │ +
81 }
│ │ │ +
82
│ │ │ +
83 bool operator!=(const BaseHandle& _rhs) const {
│ │ │ +
84 return (this->idx_ != _rhs.idx_);
│ │ │ +
85 }
│ │ │ +
86
│ │ │ +
87 bool operator<(const BaseHandle& _rhs) const {
│ │ │ +
88 return (this->idx_ < _rhs.idx_);
│ │ │ +
89 }
│ │ │ +
90
│ │ │ +
91
│ │ │ +
92 // this is to be used only by the iterators
│ │ │ +
93 void __increment() { ++idx_; }
│ │ │ +
94 void __decrement() { --idx_; }
│ │ │ +
95
│ │ │ +
96 void __increment(int amount) { idx_ += amount; }
│ │ │ +
97 void __decrement(int amount) { idx_ -= amount; }
│ │ │ +
98
│ │ │ +
99private:
│ │ │
100
│ │ │ -
101 bool write(const std::string&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
102
│ │ │ -
103 bool write(std::ostream&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
104
│ │ │ -
105 size_t binary_size(BaseExporter& _be, const Options& _opt) const override;
│ │ │ +
101 int idx_;
│ │ │ +
102};
│ │ │ +
│ │ │ +
103
│ │ │ +
104// this is used by boost::unordered_set/map
│ │ │ +
105inline size_t hash_value(const BaseHandle& h) { return h.idx(); }
│ │ │
106
│ │ │ -
107 enum ValueType {
│ │ │ -
108 Unsupported = 0,
│ │ │ -
109 ValueTypeFLOAT32, ValueTypeFLOAT,
│ │ │ -
110 ValueTypeINT32, ValueTypeINT , ValueTypeUINT,
│ │ │ -
111 ValueTypeUCHAR, ValueTypeCHAR, ValueTypeUINT8,
│ │ │ -
112 ValueTypeUSHORT, ValueTypeSHORT,
│ │ │ -
113 ValueTypeDOUBLE
│ │ │ -
114 };
│ │ │ +
107//-----------------------------------------------------------------------------
│ │ │ +
108
│ │ │ +
│ │ │ +
110inline std::ostream& operator<<(std::ostream& _os, const BaseHandle& _hnd)
│ │ │ +
111{
│ │ │ +
112 return (_os << _hnd.idx());
│ │ │ +
113}
│ │ │ +
│ │ │ +
114
│ │ │
115
│ │ │ -
116private:
│ │ │ -
117 mutable Options options_;
│ │ │ +
116//-----------------------------------------------------------------------------
│ │ │ +
117
│ │ │
118
│ │ │ -
119 struct CustomProperty
│ │ │ -
120 {
│ │ │ -
121 ValueType type;
│ │ │ -
122 const BaseProperty* property;
│ │ │ -
123 explicit CustomProperty(const BaseProperty* const _p):type(Unsupported),property(_p){}
│ │ │ -
124 };
│ │ │ +
│ │ │ +
120struct OPENMESHDLLEXPORT VertexHandle : public BaseHandle
│ │ │ +
121{
│ │ │ +
122 explicit VertexHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ +
123};
│ │ │ +
│ │ │ +
124
│ │ │
125
│ │ │ -
126 const char* nameOfType_[12];
│ │ │ -
127
│ │ │ -
129 std::vector<CustomProperty> writeCustomTypeHeader(std::ostream& _out, BaseKernel::const_prop_iterator _begin, BaseKernel::const_prop_iterator _end) const;
│ │ │ -
130 template<bool binary>
│ │ │ -
131 void write_customProp(std::ostream& _our, const CustomProperty& _prop, size_t _index) const;
│ │ │ -
132 template<typename T>
│ │ │ -
133 void writeProxy(ValueType _type, std::ostream& _out, T _value, OpenMesh::GenProg::TrueType /*_binary*/) const
│ │ │ -
134 {
│ │ │ -
135 writeValue(_type, _out, _value);
│ │ │ -
136 }
│ │ │ -
137 template<typename T>
│ │ │ -
138 void writeProxy(ValueType /*_type*/, std::ostream& _out, T _value, OpenMesh::GenProg::FalseType /*_binary*/) const
│ │ │ -
139 {
│ │ │ -
140 _out << " " << _value;
│ │ │ -
141 }
│ │ │ -
142
│ │ │ -
143protected:
│ │ │ -
144 void writeValue(ValueType _type, std::ostream& _out, signed char value) const;
│ │ │ -
145 void writeValue(ValueType _type, std::ostream& _out, unsigned char value) const;
│ │ │ -
146 void writeValue(ValueType _type, std::ostream& _out, short value) const;
│ │ │ -
147 void writeValue(ValueType _type, std::ostream& _out, unsigned short value) const;
│ │ │ -
148 void writeValue(ValueType _type, std::ostream& _out, int value) const;
│ │ │ -
149 void writeValue(ValueType _type, std::ostream& _out, unsigned int value) const;
│ │ │ -
150 void writeValue(ValueType _type, std::ostream& _out, float value) const;
│ │ │ -
151 void writeValue(ValueType _type, std::ostream& _out, double value) const;
│ │ │ -
152
│ │ │ -
153 bool write_ascii(std::ostream& _out, BaseExporter&, Options) const;
│ │ │ -
154 bool write_binary(std::ostream& _out, BaseExporter&, Options) const;
│ │ │ -
156 void write_header(std::ostream& _out, BaseExporter& _be, Options& _opt, std::vector<CustomProperty>& _ovProps, std::vector<CustomProperty>& _ofProps) const;
│ │ │ -
157};
│ │ │ +
│ │ │ +
127struct OPENMESHDLLEXPORT HalfedgeHandle : public BaseHandle
│ │ │ +
128{
│ │ │ +
129 explicit HalfedgeHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ +
130};
│ │ │
│ │ │ -
158
│ │ │ +
131
│ │ │ +
132
│ │ │ +
│ │ │ +
134struct OPENMESHDLLEXPORT EdgeHandle : public BaseHandle
│ │ │ +
135{
│ │ │ +
136 explicit EdgeHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ +
137};
│ │ │ +
│ │ │ +
138
│ │ │ +
139
│ │ │ +
│ │ │ +
141struct OPENMESHDLLEXPORT FaceHandle : public BaseHandle
│ │ │ +
142{
│ │ │ +
143 explicit FaceHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ +
144};
│ │ │ +
│ │ │ +
145
│ │ │ +
146
│ │ │ +
│ │ │ +
148struct OPENMESHDLLEXPORT MeshHandle : public BaseHandle
│ │ │ +
149{
│ │ │ +
150 explicit MeshHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ +
151};
│ │ │ +
│ │ │ +
152
│ │ │ +
153
│ │ │ +
154
│ │ │ +
155
│ │ │ +
156//=============================================================================
│ │ │ +
157} // namespace OpenMesh
│ │ │ +
158//=============================================================================
│ │ │
159
│ │ │ -
160//== TYPE DEFINITION ==========================================================
│ │ │ -
161
│ │ │ -
162
│ │ │ -
164extern _PLYWriter_ __PLYWriterInstance;
│ │ │ -
165OPENMESHDLLEXPORT _PLYWriter_& PLYWriter();
│ │ │ -
166
│ │ │ -
167
│ │ │ -
168//=============================================================================
│ │ │ -
169} // namespace IO
│ │ │ -
170} // namespace OpenMesh
│ │ │ -
171//=============================================================================
│ │ │ -
172#endif
│ │ │ -
173//=============================================================================
│ │ │ +
160#ifdef OM_HAS_HASH
│ │ │ +
161#include <functional>
│ │ │ +
162namespace std {
│ │ │ +
163
│ │ │ +
164#if defined(_MSVC_VER)
│ │ │ +
165# pragma warning(push)
│ │ │ +
166# pragma warning(disable:4099) // For VC++ it is class hash
│ │ │ +
167#endif
│ │ │ +
168
│ │ │ +
169
│ │ │ +
170template <>
│ │ │ +
171struct hash<OpenMesh::BaseHandle >
│ │ │ +
172{
│ │ │ +
173 typedef OpenMesh::BaseHandle argument_type;
│ │ │ +
174 typedef std::size_t result_type;
│ │ │ +
175
│ │ │ +
176 std::size_t operator()(const OpenMesh::BaseHandle& h) const
│ │ │ +
177 {
│ │ │ +
178 return h.idx();
│ │ │ +
179 }
│ │ │ +
180};
│ │ │ +
181
│ │ │ +
182template <>
│ │ │ +
183struct hash<OpenMesh::VertexHandle >
│ │ │ +
184{
│ │ │ +
185 typedef OpenMesh::VertexHandle argument_type;
│ │ │ +
186 typedef std::size_t result_type;
│ │ │ +
187
│ │ │ +
188 std::size_t operator()(const OpenMesh::VertexHandle& h) const
│ │ │ +
189 {
│ │ │ +
190 return h.idx();
│ │ │ +
191 }
│ │ │ +
192};
│ │ │ +
193
│ │ │ +
194template <>
│ │ │ +
195struct hash<OpenMesh::HalfedgeHandle >
│ │ │ +
196{
│ │ │ +
197
│ │ │ +
198 typedef OpenMesh::HalfedgeHandle argument_type;
│ │ │ +
199 typedef std::size_t result_type;
│ │ │ +
200
│ │ │ +
201 std::size_t operator()(const OpenMesh::HalfedgeHandle& h) const
│ │ │ +
202 {
│ │ │ +
203 return h.idx();
│ │ │ +
204 }
│ │ │ +
205};
│ │ │ +
206
│ │ │ +
207template <>
│ │ │ +
208struct hash<OpenMesh::EdgeHandle >
│ │ │ +
209{
│ │ │ +
210
│ │ │ +
211 typedef OpenMesh::EdgeHandle argument_type;
│ │ │ +
212 typedef std::size_t result_type;
│ │ │ +
213
│ │ │ +
214 std::size_t operator()(const OpenMesh::EdgeHandle& h) const
│ │ │ +
215 {
│ │ │ +
216 return h.idx();
│ │ │ +
217 }
│ │ │ +
218};
│ │ │ +
219
│ │ │ +
220template <>
│ │ │ +
221struct hash<OpenMesh::FaceHandle >
│ │ │ +
222{
│ │ │ +
223
│ │ │ +
224 typedef OpenMesh::FaceHandle argument_type;
│ │ │ +
225 typedef std::size_t result_type;
│ │ │ +
226
│ │ │ +
227 std::size_t operator()(const OpenMesh::FaceHandle& h) const
│ │ │ +
228 {
│ │ │ +
229 return h.idx();
│ │ │ +
230 }
│ │ │ +
231};
│ │ │ +
232
│ │ │ +
233#if defined(_MSVC_VER)
│ │ │ +
234# pragma warning(pop)
│ │ │ +
235#endif
│ │ │ +
236
│ │ │ +
237}
│ │ │ +
238#endif // OM_HAS_HASH
│ │ │ +
239
│ │ │ +
240
│ │ │ +
241#endif // OPENMESH_HANDLES_HH
│ │ │ +
242//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options _opt=Options::Default)
Get binary size of data.
Definition MeshIO.hh:251
│ │ │ -
_PLYWriter_ __PLYWriterInstance
Declare the single entity of the PLY writer.
Definition PLYWriter.cc:67
│ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for all writer modules.
Definition BaseWriter.hh:84
│ │ │ -
Implementation of the PLY format writer.
Definition PLYWriter.hh:90
│ │ │ -
std::string get_extensions() const override
Return file format's extension.
Definition PLYWriter.hh:99
│ │ │ -
virtual ~_PLYWriter_()
Destructor.
Definition PLYWriter.hh:96
│ │ │ -
std::string get_description() const override
Return short description of the supported file format.
Definition PLYWriter.hh:98
│ │ │ -
Abstract class defining the basic interface of a dynamic property.
Definition BaseProperty.hh:61
│ │ │ +
auto operator<<(std::ostream &os, const VectorT< Scalar, DIM > &_vec) -> typename std::enable_if< sizeof(decltype(os<< _vec[0])) >=0
output a vector by printing its space-separated compontens
│ │ │ +
Base class for all handle types.
Definition Handles.hh:63
│ │ │ +
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ +
void invalidate()
reset handle to be invalid
Definition Handles.hh:77
│ │ │ +
void reset()
reset handle to be invalid
Definition Handles.hh:75
│ │ │ +
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -PLYWriter.hh │ │ │ │ +Handles.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,190 +47,248 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Implements a writer module for PLY files │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef __PLYWRITER_HH__ │ │ │ │ -53#define __PLYWRITER_HH__ │ │ │ │ -54 │ │ │ │ +44#ifndef OPENMESH_HANDLES_HH │ │ │ │ +45#define OPENMESH_HANDLES_HH │ │ │ │ +46 │ │ │ │ +47 │ │ │ │ +48//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +49 │ │ │ │ +50#include │ │ │ │ +51#include │ │ │ │ +52 │ │ │ │ +53 │ │ │ │ +54//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ 55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +56namespace _O_p_e_n_M_e_s_h { │ │ │ │ 57 │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61 │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66#include │ │ │ │ +58//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +_6_2class OPENMESHDLLEXPORT _B_a_s_e_H_a_n_d_l_e │ │ │ │ +63{ │ │ │ │ +64public: │ │ │ │ +65 │ │ │ │ +66 explicit _B_a_s_e_H_a_n_d_l_e(int _idx=-1) : idx_(_idx) {} │ │ │ │ 67 │ │ │ │ -68 │ │ │ │ -69//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ +_6_9 int _i_d_x() const { return idx_; } │ │ │ │ 70 │ │ │ │ -71 │ │ │ │ -72namespace _O_p_e_n_M_e_s_h { │ │ │ │ -73namespace IO { │ │ │ │ -74 │ │ │ │ -75 │ │ │ │ -76//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -77 │ │ │ │ +_7_2 bool _i_s___v_a_l_i_d() const { return idx_ >= 0; } │ │ │ │ +73 │ │ │ │ +_7_5 void _r_e_s_e_t() { idx_=-1; } │ │ │ │ +_7_7 void _i_n_v_a_l_i_d_a_t_e() { idx_ = -1; } │ │ │ │ 78 │ │ │ │ -_8_9class OPENMESHDLLEXPORT ___P_L_Y_W_r_i_t_e_r__ : public _B_a_s_e_W_r_i_t_e_r │ │ │ │ -90{ │ │ │ │ -91public: │ │ │ │ -92 │ │ │ │ -93 ___P_L_Y_W_r_i_t_e_r__(); │ │ │ │ -94 │ │ │ │ -_9_6 virtual _~___P_L_Y_W_r_i_t_e_r__() {}; │ │ │ │ -97 │ │ │ │ -_9_8 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "PLY polygon file │ │ │ │ -format"; } │ │ │ │ -_9_9 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "ply"; } │ │ │ │ +79 bool operator==(const _B_a_s_e_H_a_n_d_l_e& _rhs) const { │ │ │ │ +80 return (this->idx_ == _rhs.idx_); │ │ │ │ +81 } │ │ │ │ +82 │ │ │ │ +83 bool operator!=(const BaseHandle& _rhs) const { │ │ │ │ +84 return (this->idx_ != _rhs.idx_); │ │ │ │ +85 } │ │ │ │ +86 │ │ │ │ +87 bool operator<(const BaseHandle& _rhs) const { │ │ │ │ +88 return (this->idx_ < _rhs.idx_); │ │ │ │ +89 } │ │ │ │ +90 │ │ │ │ +91 │ │ │ │ +92 // this is to be used only by the iterators │ │ │ │ +93 void __increment() { ++idx_; } │ │ │ │ +94 void __decrement() { --idx_; } │ │ │ │ +95 │ │ │ │ +96 void __increment(int amount) { idx_ += amount; } │ │ │ │ +97 void __decrement(int amount) { idx_ -= amount; } │ │ │ │ +98 │ │ │ │ +99private: │ │ │ │ 100 │ │ │ │ -101 bool write(const std::string&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -std::streamsize _precision = 6) const override; │ │ │ │ -102 │ │ │ │ -103 bool write(std::ostream&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -std::streamsize _precision = 6) const override; │ │ │ │ -104 │ │ │ │ -105 size_t _b_i_n_a_r_y___s_i_z_e(_B_a_s_e_E_x_p_o_r_t_e_r& _be, const _O_p_t_i_o_n_s& _opt) const override; │ │ │ │ +101 int idx_; │ │ │ │ +102}; │ │ │ │ +103 │ │ │ │ +104// this is used by boost::unordered_set/map │ │ │ │ +105inline size_t hash_value(const BaseHandle& h) { return h.idx(); } │ │ │ │ 106 │ │ │ │ -107 enum ValueType { │ │ │ │ -108 Unsupported = 0, │ │ │ │ -109 ValueTypeFLOAT32, ValueTypeFLOAT, │ │ │ │ -110 ValueTypeINT32, ValueTypeINT , ValueTypeUINT, │ │ │ │ -111 ValueTypeUCHAR, ValueTypeCHAR, ValueTypeUINT8, │ │ │ │ -112 ValueTypeUSHORT, ValueTypeSHORT, │ │ │ │ -113 ValueTypeDOUBLE │ │ │ │ -114 }; │ │ │ │ +107//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +108 │ │ │ │ +_1_1_0inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& _os, const _B_a_s_e_H_a_n_d_l_e& _hnd) │ │ │ │ +111{ │ │ │ │ +112 return (_os << _hnd._i_d_x()); │ │ │ │ +113} │ │ │ │ +114 │ │ │ │ 115 │ │ │ │ -116private: │ │ │ │ -117 mutable Options options_; │ │ │ │ +116//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +117 │ │ │ │ 118 │ │ │ │ -119 struct CustomProperty │ │ │ │ -120 { │ │ │ │ -121 ValueType type; │ │ │ │ -122 const _B_a_s_e_P_r_o_p_e_r_t_y* property; │ │ │ │ -123 explicit CustomProperty(const _B_a_s_e_P_r_o_p_e_r_t_y* const _p):type │ │ │ │ -(Unsupported),property(_p){} │ │ │ │ -124 }; │ │ │ │ +_1_2_0struct OPENMESHDLLEXPORT _V_e_r_t_e_x_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ +121{ │ │ │ │ +122 explicit _V_e_r_t_e_x_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +123}; │ │ │ │ +124 │ │ │ │ 125 │ │ │ │ -126 const char* nameOfType_[12]; │ │ │ │ -127 │ │ │ │ -129 std::vector writeCustomTypeHeader(std::ostream& _out, │ │ │ │ -BaseKernel::const_prop_iterator _begin, BaseKernel::const_prop_iterator _end) │ │ │ │ -const; │ │ │ │ -130 template │ │ │ │ -131 void write_customProp(std::ostream& _our, const CustomProperty& _prop, │ │ │ │ -size_t _index) const; │ │ │ │ -132 template │ │ │ │ -133 void writeProxy(ValueType _type, std::ostream& _out, T _value, OpenMesh:: │ │ │ │ -GenProg::TrueType /*_binary*/) const │ │ │ │ -134 { │ │ │ │ -135 writeValue(_type, _out, _value); │ │ │ │ -136 } │ │ │ │ -137 template │ │ │ │ -138 void writeProxy(ValueType /*_type*/, std::ostream& _out, T _value, │ │ │ │ -OpenMesh::GenProg::FalseType /*_binary*/) const │ │ │ │ -139 { │ │ │ │ -140 _out << " " << _value; │ │ │ │ -141 } │ │ │ │ -142 │ │ │ │ -143protected: │ │ │ │ -144 void writeValue(ValueType _type, std::ostream& _out, signed char value) │ │ │ │ -const; │ │ │ │ -145 void writeValue(ValueType _type, std::ostream& _out, unsigned char value) │ │ │ │ -const; │ │ │ │ -146 void writeValue(ValueType _type, std::ostream& _out, short value) const; │ │ │ │ -147 void writeValue(ValueType _type, std::ostream& _out, unsigned short value) │ │ │ │ -const; │ │ │ │ -148 void writeValue(ValueType _type, std::ostream& _out, int value) const; │ │ │ │ -149 void writeValue(ValueType _type, std::ostream& _out, unsigned int value) │ │ │ │ -const; │ │ │ │ -150 void writeValue(ValueType _type, std::ostream& _out, float value) const; │ │ │ │ -151 void writeValue(ValueType _type, std::ostream& _out, double value) const; │ │ │ │ +_1_2_7struct OPENMESHDLLEXPORT _H_a_l_f_e_d_g_e_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ +128{ │ │ │ │ +129 explicit _H_a_l_f_e_d_g_e_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +130}; │ │ │ │ +131 │ │ │ │ +132 │ │ │ │ +_1_3_4struct OPENMESHDLLEXPORT _E_d_g_e_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ +135{ │ │ │ │ +136 explicit _E_d_g_e_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +137}; │ │ │ │ +138 │ │ │ │ +139 │ │ │ │ +_1_4_1struct OPENMESHDLLEXPORT _F_a_c_e_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ +142{ │ │ │ │ +143 explicit _F_a_c_e_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +144}; │ │ │ │ +145 │ │ │ │ +146 │ │ │ │ +_1_4_8struct OPENMESHDLLEXPORT _M_e_s_h_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ +149{ │ │ │ │ +150 explicit _M_e_s_h_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +151}; │ │ │ │ 152 │ │ │ │ -153 bool write_ascii(std::ostream& _out, BaseExporter&, Options) const; │ │ │ │ -154 bool write_binary(std::ostream& _out, BaseExporter&, Options) const; │ │ │ │ -156 void write_header(std::ostream& _out, BaseExporter& _be, Options& _opt, │ │ │ │ -std::vector& _ovProps, std::vector& _ofProps) │ │ │ │ -const; │ │ │ │ -157}; │ │ │ │ -158 │ │ │ │ -159 │ │ │ │ -160//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -161 │ │ │ │ -162 │ │ │ │ -164extern _PLYWriter_ _____P_L_Y_W_r_i_t_e_r_I_n_s_t_a_n_c_e; │ │ │ │ -165OPENMESHDLLEXPORT _PLYWriter_& PLYWriter(); │ │ │ │ -166 │ │ │ │ -167 │ │ │ │ -168// │ │ │ │ +153 │ │ │ │ +154 │ │ │ │ +155 │ │ │ │ +156// │ │ │ │ ============================================================================= │ │ │ │ -169} // namespace IO │ │ │ │ -170} // namespace OpenMesh │ │ │ │ -171// │ │ │ │ +157} // namespace OpenMesh │ │ │ │ +158// │ │ │ │ ============================================================================= │ │ │ │ -172#endif │ │ │ │ -173// │ │ │ │ +159 │ │ │ │ +160#ifdef OM_HAS_HASH │ │ │ │ +161#include │ │ │ │ +162namespace std { │ │ │ │ +163 │ │ │ │ +164#if defined(_MSVC_VER) │ │ │ │ +165# pragma warning(push) │ │ │ │ +166# pragma warning(disable:4099) // For VC++ it is class hash │ │ │ │ +167#endif │ │ │ │ +168 │ │ │ │ +169 │ │ │ │ +170template <> │ │ │ │ +171struct hash<_O_p_e_n_M_e_s_h::BaseHandle > │ │ │ │ +172{ │ │ │ │ +173 typedef _O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e argument_type; │ │ │ │ +174 typedef std::size_t result_type; │ │ │ │ +175 │ │ │ │ +176 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e& h) const │ │ │ │ +177 { │ │ │ │ +178 return h._i_d_x(); │ │ │ │ +179 } │ │ │ │ +180}; │ │ │ │ +181 │ │ │ │ +182template <> │ │ │ │ +183struct hash<_O_p_e_n_M_e_s_h::VertexHandle > │ │ │ │ +184{ │ │ │ │ +185 typedef _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e argument_type; │ │ │ │ +186 typedef std::size_t result_type; │ │ │ │ +187 │ │ │ │ +188 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e& h) const │ │ │ │ +189 { │ │ │ │ +190 return h._i_d_x(); │ │ │ │ +191 } │ │ │ │ +192}; │ │ │ │ +193 │ │ │ │ +194template <> │ │ │ │ +195struct hash<_O_p_e_n_M_e_s_h::HalfedgeHandle > │ │ │ │ +196{ │ │ │ │ +197 │ │ │ │ +198 typedef _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e argument_type; │ │ │ │ +199 typedef std::size_t result_type; │ │ │ │ +200 │ │ │ │ +201 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& h) const │ │ │ │ +202 { │ │ │ │ +203 return h._i_d_x(); │ │ │ │ +204 } │ │ │ │ +205}; │ │ │ │ +206 │ │ │ │ +207template <> │ │ │ │ +208struct hash<_O_p_e_n_M_e_s_h::EdgeHandle > │ │ │ │ +209{ │ │ │ │ +210 │ │ │ │ +211 typedef _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e argument_type; │ │ │ │ +212 typedef std::size_t result_type; │ │ │ │ +213 │ │ │ │ +214 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e& h) const │ │ │ │ +215 { │ │ │ │ +216 return h._i_d_x(); │ │ │ │ +217 } │ │ │ │ +218}; │ │ │ │ +219 │ │ │ │ +220template <> │ │ │ │ +221struct hash<_O_p_e_n_M_e_s_h::FaceHandle > │ │ │ │ +222{ │ │ │ │ +223 │ │ │ │ +224 typedef _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e argument_type; │ │ │ │ +225 typedef std::size_t result_type; │ │ │ │ +226 │ │ │ │ +227 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e& h) const │ │ │ │ +228 { │ │ │ │ +229 return h._i_d_x(); │ │ │ │ +230 } │ │ │ │ +231}; │ │ │ │ +232 │ │ │ │ +233#if defined(_MSVC_VER) │ │ │ │ +234# pragma warning(pop) │ │ │ │ +235#endif │ │ │ │ +236 │ │ │ │ +237} │ │ │ │ +238#endif // OM_HAS_HASH │ │ │ │ +239 │ │ │ │ +240 │ │ │ │ +241#endif // OPENMESH_HANDLES_HH │ │ │ │ +242// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options │ │ │ │ -_opt=Options::Default) │ │ │ │ -Get binary size of data. │ │ │ │ -DDeeffiinniittiioonn MeshIO.hh:251 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_____P_L_Y_W_r_i_t_e_r_I_n_s_t_a_n_c_e │ │ │ │ -_PLYWriter_ __PLYWriterInstance │ │ │ │ -Declare the single entity of the PLY writer. │ │ │ │ -DDeeffiinniittiioonn PLYWriter.cc:67 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r │ │ │ │ -Base class for all writer modules. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_W_r_i_t_e_r__ │ │ │ │ -Implementation of the PLY format writer. │ │ │ │ -DDeeffiinniittiioonn PLYWriter.hh:90 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_W_r_i_t_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Return file format's extension. │ │ │ │ -DDeeffiinniittiioonn PLYWriter.hh:99 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_W_r_i_t_e_r___:_:_~___P_L_Y_W_r_i_t_e_r__ │ │ │ │ -virtual ~_PLYWriter_() │ │ │ │ -Destructor. │ │ │ │ -DDeeffiinniittiioonn PLYWriter.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___P_L_Y_W_r_i_t_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Return short description of the supported file format. │ │ │ │ -DDeeffiinniittiioonn PLYWriter.hh:98 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_P_r_o_p_e_r_t_y │ │ │ │ -Abstract class defining the basic interface of a dynamic property. │ │ │ │ -DDeeffiinniittiioonn BaseProperty.hh:61 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ +auto operator<<(std::ostream &os, const VectorT< Scalar, DIM > &_vec) - │ │ │ │ +> typename std::enable_if< sizeof(decltype(os<< _vec[0])) >=0 │ │ │ │ +output a vector by printing its space-separated compontens │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e │ │ │ │ +Base class for all handle types. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:63 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ +bool is_valid() const │ │ │ │ +The handle is valid iff the index is not negative. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_n_v_a_l_i_d_a_t_e │ │ │ │ +void invalidate() │ │ │ │ +reset handle to be invalid │ │ │ │ +DDeeffiinniittiioonn Handles.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_r_e_s_e_t │ │ │ │ +void reset() │ │ │ │ +reset handle to be invalid │ │ │ │ +DDeeffiinniittiioonn Handles.hh:75 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ +int idx() const │ │ │ │ +Get the underlying index of this handle. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ +Handle type for meshes to simplify some template programming. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00617_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/writer/VTKWriter.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,79 +92,135 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
VTKWriter.hh
│ │ │ +
TriMesh_ArrayKernelT.hh
│ │ │
│ │ │
│ │ │ -
1//=============================================================================
│ │ │ -
2//
│ │ │ -
3// Implements an IOManager writer module for VTK files
│ │ │ -
4//
│ │ │ -
5//=============================================================================
│ │ │ -
6
│ │ │ -
7#ifndef __VTKWRITER_HH__
│ │ │ -
8#define __VTKWRITER_HH__
│ │ │ -
9
│ │ │ -
10//=== INCLUDES ================================================================
│ │ │ -
11
│ │ │ -
12#include <string>
│ │ │ -
13#include <iosfwd>
│ │ │ -
14
│ │ │ -
15#include <OpenMesh/Core/System/config.h>
│ │ │ -
16#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
17#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ -
18#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ -
19
│ │ │ -
20//== NAMESPACES ===============================================================
│ │ │ -
21
│ │ │ -
22namespace OpenMesh {
│ │ │ -
23namespace IO {
│ │ │ -
24
│ │ │ -
25//=== IMPLEMENTATION ==========================================================
│ │ │ -
26
│ │ │ -
│ │ │ -
27class OPENMESHDLLEXPORT _VTKWriter_ : public BaseWriter
│ │ │ -
28{
│ │ │ -
29public:
│ │ │ - │ │ │ -
31
│ │ │ -
32 std::string get_description() const override { return "VTK"; }
│ │ │ -
33 std::string get_extensions() const override { return "vtk"; }
│ │ │ -
34
│ │ │ -
35 bool write(const std::string&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
36 bool write(std::ostream&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
37
│ │ │ -
38 size_t binary_size(BaseExporter&, const Options&) const override { return 0; }
│ │ │ -
39};
│ │ │ -
│ │ │ -
40
│ │ │ -
41//== TYPE DEFINITION ==========================================================
│ │ │ +
1/* ========================================================================= *
│ │ │ +
2 * *
│ │ │ +
3 * OpenMesh *
│ │ │ +
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
5 * Department of Computer Graphics and Multimedia *
│ │ │ +
6 * All rights reserved. *
│ │ │ +
7 * www.openmesh.org *
│ │ │ +
8 * *
│ │ │ +
9 *---------------------------------------------------------------------------*
│ │ │ +
10 * This file is part of OpenMesh. *
│ │ │ +
11 *---------------------------------------------------------------------------*
│ │ │ +
12 * *
│ │ │ +
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ +
14 * modification, are permitted provided that the following conditions *
│ │ │ +
15 * are met: *
│ │ │ +
16 * *
│ │ │ +
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ +
18 * this list of conditions and the following disclaimer. *
│ │ │ +
19 * *
│ │ │ +
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ +
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ +
22 * documentation and/or other materials provided with the distribution. *
│ │ │ +
23 * *
│ │ │ +
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ +
25 * contributors may be used to endorse or promote products derived from *
│ │ │ +
26 * this software without specific prior written permission. *
│ │ │ +
27 * *
│ │ │ +
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ +
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ +
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ +
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ +
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ +
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ +
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ +
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ +
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ +
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ +
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ +
39 * *
│ │ │ +
40 * ========================================================================= */
│ │ │ +
41
│ │ │
42
│ │ │ -
44extern _VTKWriter_ __VTKWriterinstance;
│ │ │ -
45OPENMESHDLLEXPORT _VTKWriter_& VTKWriter();
│ │ │ -
46
│ │ │ -
47//=============================================================================
│ │ │ -
48} // namespace IO
│ │ │ -
49} // namespace OpenMesh
│ │ │ -
50//=============================================================================
│ │ │ -
51#endif
│ │ │ -
52//=============================================================================
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// CLASS TriMesh_ArrayKernelT
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52#ifndef OPENMESH_TRIMESH_ARRAY_KERNEL_HH
│ │ │ +
53#define OPENMESH_TRIMESH_ARRAY_KERNEL_HH
│ │ │ +
54
│ │ │ +
55
│ │ │ +
56//== INCLUDES =================================================================
│ │ │ +
57
│ │ │ +
58
│ │ │ +
59#include <OpenMesh/Core/System/config.h>
│ │ │ +
60#include <OpenMesh/Core/Mesh/TriConnectivity.hh>
│ │ │ + │ │ │ +
62#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>
│ │ │ +
63#include <OpenMesh/Core/Mesh/AttribKernelT.hh>
│ │ │ +
64#include <OpenMesh/Core/Mesh/TriMeshT.hh>
│ │ │ +
65
│ │ │ +
66
│ │ │ +
67//== NAMESPACES ===============================================================
│ │ │ +
68
│ │ │ +
69
│ │ │ +
70namespace OpenMesh {
│ │ │ +
71
│ │ │ +
72template<class Traits>
│ │ │ +
73class PolyMesh_ArrayKernelT;
│ │ │ +
74//== CLASS DEFINITION =========================================================
│ │ │ +
75
│ │ │ +
76
│ │ │ +
78template <class Traits>
│ │ │ +
│ │ │ + │ │ │ +
80{
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
84};
│ │ │ +
│ │ │ +
85
│ │ │ +
86
│ │ │ +
87
│ │ │ +
93template <class Traits = DefaultTraits>
│ │ │ +
│ │ │ + │ │ │ +
95 : public TriMesh_ArrayKernel_GeneratorT<Traits>::Mesh
│ │ │ +
96{
│ │ │ +
97public:
│ │ │ + │ │ │ +
99 template<class OtherTraits>
│ │ │ + │ │ │ +
101 {
│ │ │ +
102 //assign the connectivity and standard properties
│ │ │ +
103 this->assign(t,true);
│ │ │ +
104 }
│ │ │ +
105};
│ │ │ +
│ │ │ +
106
│ │ │ +
107
│ │ │ +
108//=============================================================================
│ │ │ +
109} // namespace OpenMesh
│ │ │ +
110//=============================================================================
│ │ │ +
111#endif // OPENMESH_TRIMESH_ARRAY_KERNEL_HH
│ │ │ +
112//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
_VTKWriter_ __VTKWriterinstance
Declare the single entity of the OBJ writer.
Definition VTKWriter.cc:18
│ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for all writer modules.
Definition BaseWriter.hh:84
│ │ │ -
Definition VTKWriter.hh:28
│ │ │ -
size_t binary_size(BaseExporter &, const Options &) const override
Returns expected size of file if binary format is supported else 0.
Definition VTKWriter.hh:38
│ │ │ -
std::string get_description() const override
Return short description of the supported file format.
Definition VTKWriter.hh:32
│ │ │ -
std::string get_extensions() const override
Return file format's extension.
Definition VTKWriter.hh:33
│ │ │ +
The attribute kernel adds all standard properties to the kernel.
Definition AttribKernelT.hh:73
│ │ │ +
Definition of the mesh entities (items).
Definition FinalMeshItemsT.hh:68
│ │ │ +
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
Helper class to create a TriMesh-type based on ArrayKernelT.
Definition TriMesh_ArrayKernelT.hh:80
│ │ │ +
Base type for a triangle mesh.
Definition TriMeshT.hh:92
│ │ │ +
This file defines the default traits and some convenience macros.
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,102 +1,152 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -VTKWriter.hh │ │ │ │ -1// │ │ │ │ +TriMesh_ArrayKernelT.hh │ │ │ │ +1/* ========================================================================= * │ │ │ │ +2 * * │ │ │ │ +3 * OpenMesh * │ │ │ │ +4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +5 * Department of Computer Graphics and Multimedia * │ │ │ │ +6 * All rights reserved. * │ │ │ │ +7 * www.openmesh.org * │ │ │ │ +8 * * │ │ │ │ +9 *---------------------------------------------------------------------------* │ │ │ │ +10 * This file is part of OpenMesh. * │ │ │ │ +11 *--------------------------------------------------------------------------- │ │ │ │ +* │ │ │ │ +12 * * │ │ │ │ +13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ +14 * modification, are permitted provided that the following conditions * │ │ │ │ +15 * are met: * │ │ │ │ +16 * * │ │ │ │ +17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ +* │ │ │ │ +18 * this list of conditions and the following disclaimer. * │ │ │ │ +19 * * │ │ │ │ +20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ +21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ +22 * documentation and/or other materials provided with the distribution. * │ │ │ │ +23 * * │ │ │ │ +24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ +25 * contributors may be used to endorse or promote products derived from * │ │ │ │ +26 * this software without specific prior written permission. * │ │ │ │ +27 * * │ │ │ │ +28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ +29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ +* │ │ │ │ +30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ +31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ +* │ │ │ │ +32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ +33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ +34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ +35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ +36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ +37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ +38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ +39 * * │ │ │ │ +40 * ========================================================================= │ │ │ │ +*/ │ │ │ │ +41 │ │ │ │ +42 │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ ============================================================================= │ │ │ │ -2// │ │ │ │ -3// Implements an IOManager writer module for VTK files │ │ │ │ -4// │ │ │ │ -5// │ │ │ │ +46// │ │ │ │ +47// CLASS TriMesh_ArrayKernelT │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ ============================================================================= │ │ │ │ -6 │ │ │ │ -7#ifndef __VTKWRITER_HH__ │ │ │ │ -8#define __VTKWRITER_HH__ │ │ │ │ -9 │ │ │ │ -10//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ -11 │ │ │ │ -12#include │ │ │ │ -13#include │ │ │ │ -14 │ │ │ │ -15#include │ │ │ │ -16#include │ │ │ │ -17#include │ │ │ │ -18#include │ │ │ │ -19 │ │ │ │ -20//== NAMESPACES │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52#ifndef OPENMESH_TRIMESH_ARRAY_KERNEL_HH │ │ │ │ +53#define OPENMESH_TRIMESH_ARRAY_KERNEL_HH │ │ │ │ +54 │ │ │ │ +55 │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +57 │ │ │ │ +58 │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_T_r_a_i_t_s_._h_h> │ │ │ │ +62#include │ │ │ │ +63#include │ │ │ │ +64#include │ │ │ │ +65 │ │ │ │ +66 │ │ │ │ +67//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -21 │ │ │ │ -22namespace _O_p_e_n_M_e_s_h { │ │ │ │ -23namespace IO { │ │ │ │ -24 │ │ │ │ -25//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -26 │ │ │ │ -_2_7class OPENMESHDLLEXPORT ___V_T_K_W_r_i_t_e_r__ : public _B_a_s_e_W_r_i_t_e_r │ │ │ │ -28{ │ │ │ │ -29public: │ │ │ │ -30 ___V_T_K_W_r_i_t_e_r__(); │ │ │ │ -31 │ │ │ │ -_3_2 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "VTK"; } │ │ │ │ -_3_3 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "vtk"; } │ │ │ │ -34 │ │ │ │ -35 bool write(const std::string&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -std::streamsize _precision = 6) const override; │ │ │ │ -36 bool write(std::ostream&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, std:: │ │ │ │ -streamsize _precision = 6) const override; │ │ │ │ -37 │ │ │ │ -_3_8 size_t _b_i_n_a_r_y___s_i_z_e(_B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s&) const override { return 0; │ │ │ │ -} │ │ │ │ -39}; │ │ │ │ -40 │ │ │ │ -41//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -42 │ │ │ │ -44extern _VTKWriter_ _____V_T_K_W_r_i_t_e_r_i_n_s_t_a_n_c_e; │ │ │ │ -45OPENMESHDLLEXPORT _VTKWriter_& VTKWriter(); │ │ │ │ -46 │ │ │ │ -47// │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +70namespace _O_p_e_n_M_e_s_h { │ │ │ │ +71 │ │ │ │ +72template │ │ │ │ +73class PolyMesh_ArrayKernelT; │ │ │ │ +74//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +75 │ │ │ │ +76 │ │ │ │ +78template │ │ │ │ +_7_9struct _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T │ │ │ │ +80{ │ │ │ │ +81 typedef _F_i_n_a_l_M_e_s_h_I_t_e_m_s_T_<_T_r_a_i_t_s_,_ _t_r_u_e_> _M_e_s_h_I_t_e_m_s; │ │ │ │ +82 typedef _A_t_t_r_i_b_K_e_r_n_e_l_T_<_M_e_s_h_I_t_e_m_s_,_ _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_> _A_t_t_r_i_b_K_e_r_n_e_l; │ │ │ │ +83 typedef _T_r_i_M_e_s_h_T_<_A_t_t_r_i_b_K_e_r_n_e_l_> _M_e_s_h; │ │ │ │ +84}; │ │ │ │ +85 │ │ │ │ +86 │ │ │ │ +87 │ │ │ │ +93template │ │ │ │ +_9_4class _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +95 : public _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T::Mesh │ │ │ │ +96{ │ │ │ │ +97public: │ │ │ │ +98 _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T() {} │ │ │ │ +99 template │ │ │ │ +100 explicit _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T( const _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T_<_O_t_h_e_r_T_r_a_i_t_s_> & │ │ │ │ +t) │ │ │ │ +101 { │ │ │ │ +102 //assign the connectivity and standard properties │ │ │ │ +103 this->assign(t,true); │ │ │ │ +104 } │ │ │ │ +105}; │ │ │ │ +106 │ │ │ │ +107 │ │ │ │ +108// │ │ │ │ ============================================================================= │ │ │ │ -48} // namespace IO │ │ │ │ -49} // namespace OpenMesh │ │ │ │ -50// │ │ │ │ +109} // namespace OpenMesh │ │ │ │ +110// │ │ │ │ ============================================================================= │ │ │ │ -51#endif │ │ │ │ -52// │ │ │ │ +111#endif // OPENMESH_TRIMESH_ARRAY_KERNEL_HH │ │ │ │ +112// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_____V_T_K_W_r_i_t_e_r_i_n_s_t_a_n_c_e │ │ │ │ -_VTKWriter_ __VTKWriterinstance │ │ │ │ -Declare the single entity of the OBJ writer. │ │ │ │ -DDeeffiinniittiioonn VTKWriter.cc:18 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r │ │ │ │ -Base class for all writer modules. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___V_T_K_W_r_i_t_e_r__ │ │ │ │ -DDeeffiinniittiioonn VTKWriter.hh:28 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___V_T_K_W_r_i_t_e_r___:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -size_t binary_size(BaseExporter &, const Options &) const override │ │ │ │ -Returns expected size of file if binary format is supported else 0. │ │ │ │ -DDeeffiinniittiioonn VTKWriter.hh:38 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___V_T_K_W_r_i_t_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Return short description of the supported file format. │ │ │ │ -DDeeffiinniittiioonn VTKWriter.hh:32 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___V_T_K_W_r_i_t_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Return file format's extension. │ │ │ │ -DDeeffiinniittiioonn VTKWriter.hh:33 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_K_e_r_n_e_l_T │ │ │ │ +The attribute kernel adds all standard properties to the kernel. │ │ │ │ +DDeeffiinniittiioonn AttribKernelT.hh:73 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ +Definition of the mesh entities (items). │ │ │ │ +DDeeffiinniittiioonn FinalMeshItemsT.hh:68 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Triangle mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T │ │ │ │ +Helper class to create a TriMesh-type based on ArrayKernelT. │ │ │ │ +DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:80 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T │ │ │ │ +Base type for a triangle mesh. │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:92 │ │ │ │ +_T_r_a_i_t_s_._h_h │ │ │ │ +This file defines the default traits and some convenience macros. │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00629_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/writer/STLWriter.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/Casts.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
STLWriter.hh
│ │ │ +
Casts.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,98 +138,44 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Implements a writer module for STL ascii files
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ +
44#ifndef OPENMESH_CASTS_HH
│ │ │ +
45#define OPENMESH_CASTS_HH
│ │ │ +
46//== INCLUDES =================================================================
│ │ │ +
47
│ │ │ +
48#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
│ │ │ +
49#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │
50
│ │ │ -
51
│ │ │ -
52#ifndef __STLWRITER_HH__
│ │ │ -
53#define __STLWRITER_HH__
│ │ │ +
51//== NAMESPACES ===============================================================
│ │ │ +
52namespace OpenMesh
│ │ │ +
53{
│ │ │
54
│ │ │ -
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ -
57
│ │ │ -
58// -------------------- STL
│ │ │ -
59#include <iosfwd>
│ │ │ -
60#include <string>
│ │ │ -
61// -------------------- OpenMesh
│ │ │ -
62#include <OpenMesh/Core/System/config.h>
│ │ │ -
63#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ -
64#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ -
65#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ +
55template <class Traits>
│ │ │ +
56inline TriMesh_ArrayKernelT<Traits>& TRIMESH_CAST(PolyMesh_ArrayKernelT<Traits>& _poly_mesh)
│ │ │ +
57{ return reinterpret_cast< TriMesh_ArrayKernelT<Traits>& >(_poly_mesh); }
│ │ │ +
58
│ │ │ +
59template <class Traits>
│ │ │ +
60inline const TriMesh_ArrayKernelT<Traits>& TRIMESH_CAST(const PolyMesh_ArrayKernelT<Traits>& _poly_mesh)
│ │ │ +
61{ return reinterpret_cast< const TriMesh_ArrayKernelT<Traits>& >(_poly_mesh); }
│ │ │ +
62
│ │ │ +
63template <class Traits>
│ │ │ +
64inline PolyMesh_ArrayKernelT<Traits>& POLYMESH_CAST(TriMesh_ArrayKernelT<Traits>& _tri_mesh)
│ │ │ +
65{ return reinterpret_cast< PolyMesh_ArrayKernelT<Traits>& >(_tri_mesh); }
│ │ │
66
│ │ │ -
67
│ │ │ -
68//== NAMESPACES ===============================================================
│ │ │ -
69
│ │ │ +
67template <class Traits>
│ │ │ +
68inline const PolyMesh_ArrayKernelT<Traits>& POLYMESH_CAST(const TriMesh_ArrayKernelT<Traits>& _tri_mesh)
│ │ │ +
69{ return reinterpret_cast< const PolyMesh_ArrayKernelT<Traits>& >(_tri_mesh); }
│ │ │
70
│ │ │ -
71namespace OpenMesh {
│ │ │ -
72namespace IO {
│ │ │ -
73
│ │ │ -
74
│ │ │ -
75//=== IMPLEMENTATION ==========================================================
│ │ │ -
76
│ │ │ -
77
│ │ │ -
│ │ │ -
82class OPENMESHDLLEXPORT _STLWriter_ : public BaseWriter
│ │ │ -
83{
│ │ │ -
84public:
│ │ │ -
85
│ │ │ - │ │ │ -
87
│ │ │ -
89 virtual ~_STLWriter_() {};
│ │ │ -
90
│ │ │ -
91 std::string get_description() const override { return "Stereolithography Format"; }
│ │ │ -
92 std::string get_extensions() const override { return "stl stla stlb"; }
│ │ │ -
93
│ │ │ -
94 bool write(const std::string&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
95
│ │ │ -
96 bool write(std::ostream&, BaseExporter&, const Options& _writeOptions, std::streamsize _precision = 6) const override;
│ │ │ -
97
│ │ │ -
98 size_t binary_size(BaseExporter&, const Options&) const override;
│ │ │ -
99
│ │ │ -
100private:
│ │ │ -
101 bool write_stla(const std::string&, const BaseExporter&, Options) const;
│ │ │ -
102 bool write_stla(std::ostream&, const BaseExporter&, Options, std::streamsize _precision = 6) const;
│ │ │ -
103 bool write_stlb(const std::string&, const BaseExporter&, Options) const;
│ │ │ -
104 bool write_stlb(std::ostream&, const BaseExporter&, Options, std::streamsize _precision = 6) const;
│ │ │ -
105};
│ │ │ -
│ │ │ -
106
│ │ │ -
107
│ │ │ -
108//== TYPE DEFINITION ==========================================================
│ │ │ -
109
│ │ │ -
110
│ │ │ -
111// Declare the single entity of STL writer.
│ │ │ -
112extern _STLWriter_ __STLWriterInstance;
│ │ │ -
113OPENMESHDLLEXPORT _STLWriter_& STLWriter();
│ │ │ -
114
│ │ │ -
115
│ │ │ -
116//=============================================================================
│ │ │ -
117} // namespace IO
│ │ │ -
118} // namespace OpenMesh
│ │ │ -
119//=============================================================================
│ │ │ -
120#endif
│ │ │ -
121//=============================================================================
│ │ │ +
71};
│ │ │ +
72#endif//OPENMESH_CASTS_HH
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options _opt=Options::Default)
Get binary size of data.
Definition MeshIO.hh:251
│ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for all writer modules.
Definition BaseWriter.hh:84
│ │ │ -
Implementation of the STL format writer.
Definition STLWriter.hh:83
│ │ │ -
virtual ~_STLWriter_()
Destructor.
Definition STLWriter.hh:89
│ │ │ -
std::string get_description() const override
Return short description of the supported file format.
Definition STLWriter.hh:91
│ │ │ -
std::string get_extensions() const override
Return file format's extension.
Definition STLWriter.hh:92
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -STLWriter.hh │ │ │ │ +Casts.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,130 +47,51 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Implements a writer module for STL ascii files │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ +44#ifndef OPENMESH_CASTS_HH │ │ │ │ +45#define OPENMESH_CASTS_HH │ │ │ │ +46//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +47 │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ 50 │ │ │ │ -51 │ │ │ │ -52#ifndef __STLWRITER_HH__ │ │ │ │ -53#define __STLWRITER_HH__ │ │ │ │ +51//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +52namespace _O_p_e_n_M_e_s_h │ │ │ │ +53{ │ │ │ │ 54 │ │ │ │ -55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ -57 │ │ │ │ -58// -------------------- STL │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61// -------------------- OpenMesh │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ +55template │ │ │ │ +56inline TriMesh_ArrayKernelT& TRIMESH_CAST │ │ │ │ +(PolyMesh_ArrayKernelT& _poly_mesh) │ │ │ │ +57{ return reinterpret_cast< TriMesh_ArrayKernelT& >(_poly_mesh); } │ │ │ │ +58 │ │ │ │ +59template │ │ │ │ +60inline const TriMesh_ArrayKernelT& TRIMESH_CAST(const │ │ │ │ +PolyMesh_ArrayKernelT& _poly_mesh) │ │ │ │ +61{ return reinterpret_cast< const TriMesh_ArrayKernelT& >(_poly_mesh); │ │ │ │ +} │ │ │ │ +62 │ │ │ │ +63template │ │ │ │ +64inline PolyMesh_ArrayKernelT& POLYMESH_CAST │ │ │ │ +(TriMesh_ArrayKernelT& _tri_mesh) │ │ │ │ +65{ return reinterpret_cast< PolyMesh_ArrayKernelT& >(_tri_mesh); } │ │ │ │ 66 │ │ │ │ -67 │ │ │ │ -68//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -69 │ │ │ │ +67template │ │ │ │ +68inline const PolyMesh_ArrayKernelT& POLYMESH_CAST(const │ │ │ │ +TriMesh_ArrayKernelT& _tri_mesh) │ │ │ │ +69{ return reinterpret_cast< const PolyMesh_ArrayKernelT& >(_tri_mesh); │ │ │ │ +} │ │ │ │ 70 │ │ │ │ -71namespace _O_p_e_n_M_e_s_h { │ │ │ │ -72namespace IO { │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -75//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -76 │ │ │ │ -77 │ │ │ │ -_8_2class OPENMESHDLLEXPORT ___S_T_L_W_r_i_t_e_r__ : public _B_a_s_e_W_r_i_t_e_r │ │ │ │ -83{ │ │ │ │ -84public: │ │ │ │ -85 │ │ │ │ -86 ___S_T_L_W_r_i_t_e_r__(); │ │ │ │ -87 │ │ │ │ -_8_9 virtual _~___S_T_L_W_r_i_t_e_r__() {}; │ │ │ │ -90 │ │ │ │ -_9_1 std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const override { return "Stereolithography │ │ │ │ -Format"; } │ │ │ │ -_9_2 std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const override { return "stl stla stlb"; } │ │ │ │ -93 │ │ │ │ -94 bool write(const std::string&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -std::streamsize _precision = 6) const override; │ │ │ │ -95 │ │ │ │ -96 bool write(std::ostream&, _B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s& _writeOptions, std:: │ │ │ │ -streamsize _precision = 6) const override; │ │ │ │ -97 │ │ │ │ -98 size_t _b_i_n_a_r_y___s_i_z_e(_B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s&) const override; │ │ │ │ -99 │ │ │ │ -100private: │ │ │ │ -101 bool write_stla(const std::string&, const _B_a_s_e_E_x_p_o_r_t_e_r&, _O_p_t_i_o_n_s) const; │ │ │ │ -102 bool write_stla(std::ostream&, const _B_a_s_e_E_x_p_o_r_t_e_r&, _O_p_t_i_o_n_s, std:: │ │ │ │ -streamsize _precision = 6) const; │ │ │ │ -103 bool write_stlb(const std::string&, const _B_a_s_e_E_x_p_o_r_t_e_r&, _O_p_t_i_o_n_s) const; │ │ │ │ -104 bool write_stlb(std::ostream&, const _B_a_s_e_E_x_p_o_r_t_e_r&, _O_p_t_i_o_n_s, std:: │ │ │ │ -streamsize _precision = 6) const; │ │ │ │ -105}; │ │ │ │ -106 │ │ │ │ -107 │ │ │ │ -108//== TYPE DEFINITION │ │ │ │ -========================================================== │ │ │ │ -109 │ │ │ │ -110 │ │ │ │ -111// Declare the single entity of STL writer. │ │ │ │ -112extern _STLWriter_ __STLWriterInstance; │ │ │ │ -113OPENMESHDLLEXPORT _STLWriter_& STLWriter(); │ │ │ │ -114 │ │ │ │ -115 │ │ │ │ -116// │ │ │ │ -============================================================================= │ │ │ │ -117} // namespace IO │ │ │ │ -118} // namespace OpenMesh │ │ │ │ -119// │ │ │ │ -============================================================================= │ │ │ │ -120#endif │ │ │ │ -121// │ │ │ │ -============================================================================= │ │ │ │ +71}; │ │ │ │ +72#endif//OPENMESH_CASTS_HH │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options │ │ │ │ -_opt=Options::Default) │ │ │ │ -Get binary size of data. │ │ │ │ -DDeeffiinniittiioonn MeshIO.hh:251 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r │ │ │ │ -Base class for all writer modules. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___S_T_L_W_r_i_t_e_r__ │ │ │ │ -Implementation of the STL format writer. │ │ │ │ -DDeeffiinniittiioonn STLWriter.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___S_T_L_W_r_i_t_e_r___:_:_~___S_T_L_W_r_i_t_e_r__ │ │ │ │ -virtual ~_STLWriter_() │ │ │ │ -Destructor. │ │ │ │ -DDeeffiinniittiioonn STLWriter.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___S_T_L_W_r_i_t_e_r___:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -std::string get_description() const override │ │ │ │ -Return short description of the supported file format. │ │ │ │ -DDeeffiinniittiioonn STLWriter.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:___S_T_L_W_r_i_t_e_r___:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -std::string get_extensions() const override │ │ │ │ -Return file format's extension. │ │ │ │ -DDeeffiinniittiioonn STLWriter.hh:92 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00638_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/writer/BaseWriter.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/TriMeshT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
BaseWriter.hh
│ │ │ +
TriMeshT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -141,108 +141,336 @@ │ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45//=============================================================================
│ │ │
46//
│ │ │ -
47// Implements the baseclass for IOManager writer modules
│ │ │ +
47// CLASS TriMeshT
│ │ │
48//
│ │ │
49//=============================================================================
│ │ │
50
│ │ │
51
│ │ │ -
52#ifndef __BASEWRITER_HH__
│ │ │ -
53#define __BASEWRITER_HH__
│ │ │ +
52#ifndef OPENMESH_TRIMESH_HH
│ │ │ +
53#define OPENMESH_TRIMESH_HH
│ │ │
54
│ │ │
55
│ │ │ -
56//=== INCLUDES ================================================================
│ │ │ +
56//== INCLUDES =================================================================
│ │ │
57
│ │ │
58
│ │ │ -
59// STD C++
│ │ │ -
60#include <iosfwd>
│ │ │ -
61#include <string>
│ │ │ -
62
│ │ │ -
63// OpenMesh
│ │ │ -
64#include <OpenMesh/Core/System/config.h>
│ │ │ -
65#include <OpenMesh/Core/IO/Options.hh>
│ │ │ -
66#include <OpenMesh/Core/IO/exporter/BaseExporter.hh>
│ │ │ +
59#include <OpenMesh/Core/System/config.h>
│ │ │ +
60#include <OpenMesh/Core/Mesh/PolyMeshT.hh>
│ │ │ +
61#include <OpenMesh/Core/Mesh/Tags.hh>
│ │ │ +
62#include <vector>
│ │ │ +
63
│ │ │ +
64
│ │ │ +
65//== NAMESPACES ===============================================================
│ │ │ +
66
│ │ │
67
│ │ │ -
68
│ │ │ -
69//== NAMESPACES ===============================================================
│ │ │ +
68namespace OpenMesh {
│ │ │ +
69
│ │ │
70
│ │ │ -
71
│ │ │ -
72namespace OpenMesh {
│ │ │ -
73namespace IO {
│ │ │ -
74
│ │ │ -
75
│ │ │ -
76//=== IMPLEMENTATION ==========================================================
│ │ │ -
77
│ │ │ -
78
│ │ │ -
│ │ │ -
83class OPENMESHDLLEXPORT BaseWriter
│ │ │ -
84{
│ │ │ -
85public:
│ │ │ -
86
│ │ │ -
87 typedef unsigned int Option;
│ │ │ -
88
│ │ │ -
90 virtual ~BaseWriter() {};
│ │ │ -
91
│ │ │ -
93 virtual std::string get_description() const = 0;
│ │ │ -
94
│ │ │ -
96 virtual std::string get_extensions() const = 0;
│ │ │ -
97
│ │ │ -
103 virtual bool can_u_write(const std::string& _filename) const;
│ │ │ -
104
│ │ │ -
111 virtual bool write(const std::string& _filename,
│ │ │ -
112 BaseExporter& _be,
│ │ │ -
113 const Options& _writeOptions,
│ │ │ -
114 std::streamsize _precision = 6) const = 0;
│ │ │ -
115
│ │ │ -
122 virtual bool write(std::ostream& _os,
│ │ │ -
123 BaseExporter& _be,
│ │ │ -
124 const Options& _writeOptions,
│ │ │ -
125 std::streamsize _precision = 6) const = 0;
│ │ │ +
71//== CLASS DEFINITION =========================================================
│ │ │ +
72
│ │ │ +
73
│ │ │ +
90template <class Kernel>
│ │ │ +
│ │ │ +
91class TriMeshT : public PolyMeshT<Kernel>
│ │ │ +
92{
│ │ │ +
93
│ │ │ +
94public:
│ │ │ +
95
│ │ │ +
96
│ │ │ +
97 // self
│ │ │ +
98 typedef TriMeshT<Kernel> This;
│ │ │ + │ │ │ +
100
│ │ │ +
102
│ │ │ +
103 static constexpr bool is_polymesh() { return false; }
│ │ │ +
104 static constexpr bool is_trimesh() { return true; }
│ │ │ +
105 using ConnectivityTag = TriConnectivityTag;
│ │ │ +
106 enum { IsPolyMesh = 0 };
│ │ │ +
107 enum { IsTriMesh = 1 };
│ │ │ +
109
│ │ │ +
110 //--- items ---
│ │ │ +
111
│ │ │ +
112 typedef typename PolyMesh::Scalar Scalar;
│ │ │ +
113 typedef typename PolyMesh::Point Point;
│ │ │ +
114 typedef typename PolyMesh::Normal Normal;
│ │ │ +
115 typedef typename PolyMesh::Color Color;
│ │ │ +
116 typedef typename PolyMesh::TexCoord1D TexCoord1D;
│ │ │ +
117 typedef typename PolyMesh::TexCoord2D TexCoord2D;
│ │ │ +
118 typedef typename PolyMesh::TexCoord3D TexCoord3D;
│ │ │ +
119 typedef typename PolyMesh::Vertex Vertex;
│ │ │ +
120 typedef typename PolyMesh::Halfedge Halfedge;
│ │ │ +
121 typedef typename PolyMesh::Edge Edge;
│ │ │ +
122 typedef typename PolyMesh::Face Face;
│ │ │ +
123
│ │ │ +
124
│ │ │ +
125 //--- handles ---
│ │ │
126
│ │ │ -
128 virtual size_t binary_size(BaseExporter&, const Options&) const { return 0; }
│ │ │ -
129
│ │ │ -
130
│ │ │ +
127 typedef typename PolyMesh::VertexHandle VertexHandle;
│ │ │ +
128 typedef typename PolyMesh::HalfedgeHandle HalfedgeHandle;
│ │ │ +
129 typedef typename PolyMesh::EdgeHandle EdgeHandle;
│ │ │ +
130 typedef typename PolyMesh::FaceHandle FaceHandle;
│ │ │
131
│ │ │ -
132protected:
│ │ │ -
133
│ │ │ -
134 bool check(BaseExporter& _be, const Options& _writeOptions) const
│ │ │ -
135 {
│ │ │ -
136 // Check for all Options. When we want to write them (_opt.check() ) , they have to be available ( has_ )
│ │ │ -
137 // Converts to not A (write them) or B (available)
│ │ │ -
138 return ( !_writeOptions.check(Options::VertexNormal ) || _be.has_vertex_normals())
│ │ │ -
139 && ( !_writeOptions.check(Options::VertexTexCoord)|| _be.has_vertex_texcoords())
│ │ │ -
140 && ( !_writeOptions.check(Options::VertexColor) || _be.has_vertex_colors())
│ │ │ -
141 && ( !_writeOptions.check(Options::FaceNormal) || _be.has_face_normals())
│ │ │ -
142 && ( !_writeOptions.check(Options::FaceColor) || _be.has_face_colors());
│ │ │ -
143 }
│ │ │ -
144};
│ │ │ -
│ │ │ +
132
│ │ │ +
133 //--- iterators ---
│ │ │ +
134
│ │ │ +
135 typedef typename PolyMesh::VertexIter VertexIter;
│ │ │ +
136 typedef typename PolyMesh::ConstVertexIter ConstVertexIter;
│ │ │ +
137 typedef typename PolyMesh::EdgeIter EdgeIter;
│ │ │ +
138 typedef typename PolyMesh::ConstEdgeIter ConstEdgeIter;
│ │ │ +
139 typedef typename PolyMesh::FaceIter FaceIter;
│ │ │ +
140 typedef typename PolyMesh::ConstFaceIter ConstFaceIter;
│ │ │ +
141
│ │ │ +
142
│ │ │ +
143
│ │ │ +
144 //--- circulators ---
│ │ │
145
│ │ │ -
146
│ │ │ -
147//=============================================================================
│ │ │ -
148} // namespace IO
│ │ │ -
149} // namespace OpenMesh
│ │ │ -
150//=============================================================================
│ │ │ -
151#endif
│ │ │ -
152//=============================================================================
│ │ │ +
146 typedef typename PolyMesh::VertexVertexIter VertexVertexIter;
│ │ │ +
147 typedef typename PolyMesh::VertexOHalfedgeIter VertexOHalfedgeIter;
│ │ │ +
148 typedef typename PolyMesh::VertexIHalfedgeIter VertexIHalfedgeIter;
│ │ │ +
149 typedef typename PolyMesh::VertexEdgeIter VertexEdgeIter;
│ │ │ +
150 typedef typename PolyMesh::VertexFaceIter VertexFaceIter;
│ │ │ +
151 typedef typename PolyMesh::FaceVertexIter FaceVertexIter;
│ │ │ +
152 typedef typename PolyMesh::FaceHalfedgeIter FaceHalfedgeIter;
│ │ │ +
153 typedef typename PolyMesh::FaceEdgeIter FaceEdgeIter;
│ │ │ +
154 typedef typename PolyMesh::FaceFaceIter FaceFaceIter;
│ │ │ +
155 typedef typename PolyMesh::ConstVertexVertexIter ConstVertexVertexIter;
│ │ │ +
156 typedef typename PolyMesh::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter;
│ │ │ +
157 typedef typename PolyMesh::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter;
│ │ │ +
158 typedef typename PolyMesh::ConstVertexEdgeIter ConstVertexEdgeIter;
│ │ │ +
159 typedef typename PolyMesh::ConstVertexFaceIter ConstVertexFaceIter;
│ │ │ +
160 typedef typename PolyMesh::ConstFaceVertexIter ConstFaceVertexIter;
│ │ │ +
161 typedef typename PolyMesh::ConstFaceHalfedgeIter ConstFaceHalfedgeIter;
│ │ │ +
162 typedef typename PolyMesh::ConstFaceEdgeIter ConstFaceEdgeIter;
│ │ │ +
163 typedef typename PolyMesh::ConstFaceFaceIter ConstFaceFaceIter;
│ │ │ +
164
│ │ │ +
165 // --- constructor/destructor
│ │ │ +
166
│ │ │ + │ │ │ +
169 explicit TriMeshT(PolyMesh rhs) : PolyMesh((rhs.triangulate(), rhs))
│ │ │ +
170 {
│ │ │ +
171 }
│ │ │ +
172
│ │ │ +
174 virtual ~TriMeshT() {}
│ │ │ +
175
│ │ │ +
176 //--- halfedge collapse / vertex split ---
│ │ │ +
177
│ │ │ +
│ │ │ +
218 inline HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1,
│ │ │ +
219 VertexHandle _vl, VertexHandle _vr)
│ │ │ +
220 { return PolyMesh::vertex_split(this->add_vertex(_v0_point), _v1, _vl, _vr); }
│ │ │ +
│ │ │ +
221
│ │ │ +
│ │ │ +
262 inline HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1,
│ │ │ +
263 VertexHandle _vl, VertexHandle _vr)
│ │ │ +
264 { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); }
│ │ │ +
│ │ │ +
265
│ │ │ +
│ │ │ +
275 inline SmartVertexHandle split(EdgeHandle _eh, const Point& _p)
│ │ │ +
276 {
│ │ │ +
277 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ +
278 const SmartVertexHandle vh = this->add_vertex(_p); Kernel::split(_eh, vh); return vh;
│ │ │ +
279 }
│ │ │ +
│ │ │ +
280
│ │ │ +
│ │ │ +
289 inline SmartVertexHandle split_copy(EdgeHandle _eh, const Point& _p)
│ │ │ +
290 {
│ │ │ +
291 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ +
292 const SmartVertexHandle vh = this->add_vertex(_p); Kernel::split_copy(_eh, vh); return vh;
│ │ │ +
293 }
│ │ │ +
│ │ │ +
294
│ │ │ +
│ │ │ +
302 inline void split(EdgeHandle _eh, VertexHandle _vh)
│ │ │ +
303 {
│ │ │ +
304 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ +
305 Kernel::split(_eh, _vh);
│ │ │ +
306 }
│ │ │ +
│ │ │ +
307
│ │ │ +
│ │ │ +
315 inline void split_copy(EdgeHandle _eh, VertexHandle _vh)
│ │ │ +
316 {
│ │ │ +
317 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ +
318 Kernel::split_copy(_eh, _vh);
│ │ │ +
319 }
│ │ │ +
│ │ │ +
320
│ │ │ +
│ │ │ +
330 inline SmartVertexHandle split(FaceHandle _fh, const Point& _p)
│ │ │ +
331 { const SmartVertexHandle vh = this->add_vertex(_p); PolyMesh::split(_fh, vh); return vh; }
│ │ │ +
│ │ │ +
332
│ │ │ +
│ │ │ +
342 inline SmartVertexHandle split_copy(FaceHandle _fh, const Point& _p)
│ │ │ +
343 { const SmartVertexHandle vh = this->add_vertex(_p); PolyMesh::split_copy(_fh, vh); return vh; }
│ │ │ +
│ │ │ +
344
│ │ │ +
345
│ │ │ +
│ │ │ +
350 inline void split(FaceHandle _fh)
│ │ │ +
351 {
│ │ │ +
352 // Collect halfedges of face
│ │ │ +
353 HalfedgeHandle he0 = this->halfedge_handle(_fh);
│ │ │ +
354 HalfedgeHandle he1 = this->next_halfedge_handle(he0);
│ │ │ +
355 HalfedgeHandle he2 = this->next_halfedge_handle(he1);
│ │ │ +
356
│ │ │ +
357 EdgeHandle eh0 = this->edge_handle(he0);
│ │ │ +
358 EdgeHandle eh1 = this->edge_handle(he1);
│ │ │ +
359 EdgeHandle eh2 = this->edge_handle(he2);
│ │ │ +
360
│ │ │ +
361 // Collect points of face
│ │ │ +
362 VertexHandle p0 = this->to_vertex_handle(he0);
│ │ │ +
363 VertexHandle p1 = this->to_vertex_handle(he1);
│ │ │ +
364 VertexHandle p2 = this->to_vertex_handle(he2);
│ │ │ +
365
│ │ │ +
366 // Calculate midpoint coordinates
│ │ │ +
367 const Point new0 = (this->point(p0) + this->point(p2)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
│ │ │ +
368 const Point new1 = (this->point(p0) + this->point(p1)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
│ │ │ +
369 const Point new2 = (this->point(p1) + this->point(p2)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
│ │ │ +
370
│ │ │ +
371 // Add vertices at midpoint coordinates
│ │ │ +
372 VertexHandle v0 = this->add_vertex(new0);
│ │ │ +
373 VertexHandle v1 = this->add_vertex(new1);
│ │ │ +
374 VertexHandle v2 = this->add_vertex(new2);
│ │ │ +
375
│ │ │ +
376 const bool split0 = !this->is_boundary(eh0);
│ │ │ +
377 const bool split1 = !this->is_boundary(eh1);
│ │ │ +
378 const bool split2 = !this->is_boundary(eh2);
│ │ │ +
379
│ │ │ +
380 // delete original face
│ │ │ +
381 this->delete_face(_fh);
│ │ │ +
382
│ │ │ +
383 // split boundary edges of deleted face ( if not boundary )
│ │ │ +
384 if ( split0 ) {
│ │ │ +
385 this->split(eh0,v0);
│ │ │ +
386 }
│ │ │ +
387
│ │ │ +
388 if ( split1 ) {
│ │ │ +
389 this->split(eh1,v1);
│ │ │ +
390 }
│ │ │ +
391
│ │ │ +
392 if ( split2 ) {
│ │ │ +
393 this->split(eh2,v2);
│ │ │ +
394 }
│ │ │ +
395
│ │ │ +
396 // Retriangulate
│ │ │ +
397 this->add_face(v0 , p0, v1);
│ │ │ +
398 this->add_face(p2, v0 , v2);
│ │ │ +
399 this->add_face(v2,v1,p1);
│ │ │ +
400 this->add_face(v2 , v0, v1);
│ │ │ +
401 }
│ │ │ +
│ │ │ +
402
│ │ │ +
│ │ │ +
410 inline void split(FaceHandle _fh, VertexHandle _vh)
│ │ │ +
411 { PolyMesh::split(_fh, _vh); }
│ │ │ +
│ │ │ +
412
│ │ │ +
│ │ │ +
420 inline void split_copy(FaceHandle _fh, VertexHandle _vh)
│ │ │ +
421 { PolyMesh::split_copy(_fh, _vh); }
│ │ │ +
│ │ │ +
422
│ │ │ +
│ │ │ +
427 Scalar calc_face_area(FaceHandle _fh) const
│ │ │ +
428 {
│ │ │ +
429 const HalfedgeHandle heh = this->halfedge_handle(_fh);
│ │ │ +
430 return this->calc_sector_area(heh);
│ │ │ +
431 }
│ │ │ +
│ │ │ +
432
│ │ │ +
436
│ │ │ +
438 Normal calc_face_normal(FaceHandle _fh) const;
│ │ │ +
439
│ │ │ +
441};
│ │ │ +
│ │ │ +
442
│ │ │ +
443
│ │ │ +
444//=============================================================================
│ │ │ +
445} // namespace OpenMesh
│ │ │ +
446//=============================================================================
│ │ │ +
447#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C)
│ │ │ +
448#define OPENMESH_TRIMESH_TEMPLATES
│ │ │ +
449#include "TriMeshT_impl.hh"
│ │ │ +
450#endif
│ │ │ +
451//=============================================================================
│ │ │ +
452#endif // OPENMESH_TRIMESH_HH defined
│ │ │ +
453//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Definition mconvert.cc:103
│ │ │ -
Base class for exporter modules.
Definition BaseExporter.hh:85
│ │ │ -
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ -
Base class for all writer modules.
Definition BaseWriter.hh:84
│ │ │ -
virtual bool write(std::ostream &_os, BaseExporter &_be, const Options &_writeOptions, std::streamsize _precision=6) const =0
Write to a std::ostream.
│ │ │ -
virtual std::string get_extensions() const =0
Return file format's extension.
│ │ │ -
virtual bool write(const std::string &_filename, BaseExporter &_be, const Options &_writeOptions, std::streamsize _precision=6) const =0
Write to a file.
│ │ │ -
virtual ~BaseWriter()
Destructor.
Definition BaseWriter.hh:90
│ │ │ -
virtual size_t binary_size(BaseExporter &, const Options &) const
Returns expected size of file if binary format is supported else 0.
Definition BaseWriter.hh:128
│ │ │ -
virtual std::string get_description() const =0
Return short description of the supported file format.
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ +
Kernel::Vertex Vertex
Vertex type.
Definition PolyMeshT.hh:124
│ │ │ +
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition PolyMeshT.hh:169
│ │ │ +
Kernel::ConstFaceIter ConstFaceIter
Scalar type.
Definition PolyMeshT.hh:151
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ +
Kernel::ConstVertexVertexIter ConstVertexVertexIter
Circulator.
Definition PolyMeshT.hh:172
│ │ │ +
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:178
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
Kernel::VertexFaceIter VertexFaceIter
Circulator.
Definition PolyMeshT.hh:166
│ │ │ +
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition PolyMeshT.hh:177
│ │ │ +
Kernel::Halfedge Halfedge
Halfedge type.
Definition PolyMeshT.hh:126
│ │ │ +
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │ +
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ +
Kernel::FaceVertexIter FaceVertexIter
Circulator.
Definition PolyMeshT.hh:167
│ │ │ +
Kernel::VertexIHalfedgeIter VertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:164
│ │ │ +
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition PolyMeshT.hh:120
│ │ │ +
Scalar calc_sector_area(HalfedgeHandle _in_heh) const
calculates the area of the face sector defined by the angle <(_in_heh,next_halfedge(_in_heh)) NOTE: s...
Definition PolyMeshT.hh:524
│ │ │ +
Kernel::ConstFaceEdgeIter ConstFaceEdgeIter
Circulator.
Definition PolyMeshT.hh:179
│ │ │ +
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition PolyMeshT.hh:122
│ │ │ +
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition PolyMeshT.hh:176
│ │ │ +
Kernel::VertexOHalfedgeIter VertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:163
│ │ │ +
Kernel::VertexEdgeIter VertexEdgeIter
Circulator.
Definition PolyMeshT.hh:165
│ │ │ +
Kernel::Face Face
Face type.
Definition PolyMeshT.hh:130
│ │ │ +
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:174
│ │ │ +
Kernel::FaceFaceIter FaceFaceIter
Circulator.
Definition PolyMeshT.hh:170
│ │ │ +
Kernel::ConstVertexEdgeIter ConstVertexEdgeIter
Circulator.
Definition PolyMeshT.hh:175
│ │ │ +
SmartVertexHandle add_vertex(const Point _p)
Alias for new_vertex(const Point&).
Definition PolyMeshT.hh:238
│ │ │ +
Kernel::Edge Edge
Edge type.
Definition PolyMeshT.hh:128
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ +
Kernel::ConstEdgeIter ConstEdgeIter
Scalar type.
Definition PolyMeshT.hh:150
│ │ │ +
Kernel::ConstVertexIter ConstVertexIter
Scalar type.
Definition PolyMeshT.hh:148
│ │ │ +
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:173
│ │ │ +
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition PolyMeshT.hh:162
│ │ │ +
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:168
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
Kernel::ConstFaceFaceIter ConstFaceFaceIter
Circulator.
Definition PolyMeshT.hh:180
│ │ │ +
void split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-n split)
Definition PolyMeshT.hh:589
│ │ │ +
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │ +
Kernel::TexCoord1D TexCoord1D
TexCoord1D type.
Definition PolyMeshT.hh:118
│ │ │ +
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ +
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ +
Base type for a triangle mesh.
Definition TriMeshT.hh:92
│ │ │ +
void split(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:302
│ │ │ +
void split(FaceHandle _fh)
Face split (= 1-to-4) split, splits edges at midpoints and adds 4 new faces in the interior).
Definition TriMeshT.hh:350
│ │ │ +
TriMeshT()
Default constructor.
Definition TriMeshT.hh:168
│ │ │ +
void split(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:410
│ │ │ +
Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh (specialized for TriMesh).
Definition TriMeshT_impl.hh:74
│ │ │ +
SmartVertexHandle split(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:275
│ │ │ +
HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
Definition TriMeshT.hh:218
│ │ │ +
static constexpr bool is_polymesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition TriMeshT.hh:103
│ │ │ +
Scalar calc_face_area(FaceHandle _fh) const
Calculates the area of a face.
Definition TriMeshT.hh:427
│ │ │ +
SmartVertexHandle split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:330
│ │ │ +
virtual ~TriMeshT()
Destructor.
Definition TriMeshT.hh:174
│ │ │ +
void split_copy(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:420
│ │ │ +
SmartVertexHandle split_copy(FaceHandle _fh, const Point &_p)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:342
│ │ │ +
HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
Definition TriMeshT.hh:262
│ │ │ +
void split_copy(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:315
│ │ │ +
SmartVertexHandle split_copy(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:289
│ │ │ +
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -BaseWriter.hh │ │ │ │ +TriMeshT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -51,139 +51,520 @@ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45// │ │ │ │ ============================================================================= │ │ │ │ 46// │ │ │ │ -47// Implements the baseclass for IOManager writer modules │ │ │ │ +47// CLASS TriMeshT │ │ │ │ 48// │ │ │ │ 49// │ │ │ │ ============================================================================= │ │ │ │ 50 │ │ │ │ 51 │ │ │ │ -52#ifndef __BASEWRITER_HH__ │ │ │ │ -53#define __BASEWRITER_HH__ │ │ │ │ +52#ifndef OPENMESH_TRIMESH_HH │ │ │ │ +53#define OPENMESH_TRIMESH_HH │ │ │ │ 54 │ │ │ │ 55 │ │ │ │ -56//=== INCLUDES │ │ │ │ -================================================================ │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 57 │ │ │ │ 58 │ │ │ │ -59// STD C++ │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62 │ │ │ │ -63// OpenMesh │ │ │ │ -64#include │ │ │ │ -65#include │ │ │ │ -66#include │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -69//== NAMESPACES │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include │ │ │ │ +63 │ │ │ │ +64 │ │ │ │ +65//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ +66 │ │ │ │ +67 │ │ │ │ +68namespace _O_p_e_n_M_e_s_h { │ │ │ │ +69 │ │ │ │ 70 │ │ │ │ -71 │ │ │ │ -72namespace _O_p_e_n_M_e_s_h { │ │ │ │ -73namespace IO { │ │ │ │ -74 │ │ │ │ -75 │ │ │ │ -76//=== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -77 │ │ │ │ -78 │ │ │ │ -_8_3class OPENMESHDLLEXPORT _B_a_s_e_W_r_i_t_e_r │ │ │ │ -84{ │ │ │ │ -85public: │ │ │ │ -86 │ │ │ │ -87 typedef unsigned int _O_p_t_i_o_n; │ │ │ │ -88 │ │ │ │ -_9_0 virtual _~_B_a_s_e_W_r_i_t_e_r() {}; │ │ │ │ -91 │ │ │ │ -_9_3 virtual std::string _g_e_t___d_e_s_c_r_i_p_t_i_o_n() const = 0; │ │ │ │ -94 │ │ │ │ -_9_6 virtual std::string _g_e_t___e_x_t_e_n_s_i_o_n_s() const = 0; │ │ │ │ -97 │ │ │ │ -103 virtual bool can_u_write(const std::string& _filename) const; │ │ │ │ -104 │ │ │ │ -_1_1_1 virtual bool _w_r_i_t_e(const std::string& _filename, │ │ │ │ -112 _B_a_s_e_E_x_p_o_r_t_e_r& _be, │ │ │ │ -113 const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -114 std::streamsize _precision = 6) const = 0; │ │ │ │ -115 │ │ │ │ -_1_2_2 virtual bool _w_r_i_t_e(std::ostream& _os, │ │ │ │ -123 _B_a_s_e_E_x_p_o_r_t_e_r& _be, │ │ │ │ -124 const _O_p_t_i_o_n_s& _writeOptions, │ │ │ │ -125 std::streamsize _precision = 6) const = 0; │ │ │ │ +71//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +72 │ │ │ │ +73 │ │ │ │ +90template │ │ │ │ +_9_1class _T_r_i_M_e_s_h_T : public _P_o_l_y_M_e_s_h_T │ │ │ │ +92{ │ │ │ │ +93 │ │ │ │ +94public: │ │ │ │ +95 │ │ │ │ +96 │ │ │ │ +97 // self │ │ │ │ +98 typedef _T_r_i_M_e_s_h_T_<_K_e_r_n_e_l_> _T_h_i_s; │ │ │ │ +99 typedef _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_> _P_o_l_y_M_e_s_h; │ │ │ │ +100 │ │ │ │ +102 │ │ │ │ +_1_0_3 static constexpr bool _i_s___p_o_l_y_m_e_s_h() { return false; } │ │ │ │ +104 static constexpr bool is_trimesh() { return true; } │ │ │ │ +105 using ConnectivityTag = TriConnectivityTag; │ │ │ │ +106 enum { IsPolyMesh = 0 }; │ │ │ │ +107 enum { IsTriMesh = 1 }; │ │ │ │ +109 │ │ │ │ +110 //--- items --- │ │ │ │ +111 │ │ │ │ +112 typedef typename _P_o_l_y_M_e_s_h_:_:_S_c_a_l_a_r Scalar; │ │ │ │ +113 typedef typename _P_o_l_y_M_e_s_h_:_:_P_o_i_n_t Point; │ │ │ │ +114 typedef typename _P_o_l_y_M_e_s_h_:_:_N_o_r_m_a_l Normal; │ │ │ │ +115 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_l_o_r Color; │ │ │ │ +116 typedef typename _P_o_l_y_M_e_s_h_:_:_T_e_x_C_o_o_r_d_1_D TexCoord1D; │ │ │ │ +117 typedef typename _P_o_l_y_M_e_s_h_:_:_T_e_x_C_o_o_r_d_2_D TexCoord2D; │ │ │ │ +118 typedef typename _P_o_l_y_M_e_s_h_:_:_T_e_x_C_o_o_r_d_3_D TexCoord3D; │ │ │ │ +119 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x Vertex; │ │ │ │ +120 typedef typename _P_o_l_y_M_e_s_h_:_:_H_a_l_f_e_d_g_e Halfedge; │ │ │ │ +121 typedef typename _P_o_l_y_M_e_s_h_:_:_E_d_g_e Edge; │ │ │ │ +122 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e Face; │ │ │ │ +123 │ │ │ │ +124 │ │ │ │ +125 //--- handles --- │ │ │ │ 126 │ │ │ │ -_1_2_8 virtual size_t _b_i_n_a_r_y___s_i_z_e(_B_a_s_e_E_x_p_o_r_t_e_r&, const _O_p_t_i_o_n_s&) const { return 0; │ │ │ │ -} │ │ │ │ -129 │ │ │ │ -130 │ │ │ │ +127 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e VertexHandle; │ │ │ │ +128 typedef typename _P_o_l_y_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e HalfedgeHandle; │ │ │ │ +129 typedef typename _P_o_l_y_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e EdgeHandle; │ │ │ │ +130 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e FaceHandle; │ │ │ │ 131 │ │ │ │ -132protected: │ │ │ │ -133 │ │ │ │ -134 bool check(_B_a_s_e_E_x_p_o_r_t_e_r& _be, const _O_p_t_i_o_n_s& _writeOptions) const │ │ │ │ -135 { │ │ │ │ -136 // Check for all Options. When we want to write them (_opt.check() ) , they │ │ │ │ -have to be available ( has_ ) │ │ │ │ -137 // Converts to not A (write them) or B (available) │ │ │ │ -138 return ( !_writeOptions.check(Options::VertexNormal ) || │ │ │ │ -_be.has_vertex_normals()) │ │ │ │ -139 && ( !_writeOptions.check(Options::VertexTexCoord)|| │ │ │ │ -_be.has_vertex_texcoords()) │ │ │ │ -140 && ( !_writeOptions.check(Options::VertexColor) || _be.has_vertex_colors()) │ │ │ │ -141 && ( !_writeOptions.check(Options::FaceNormal) || _be.has_face_normals()) │ │ │ │ -142 && ( !_writeOptions.check(Options::FaceColor) || _be.has_face_colors()); │ │ │ │ -143 } │ │ │ │ -144}; │ │ │ │ +132 │ │ │ │ +133 //--- iterators --- │ │ │ │ +134 │ │ │ │ +135 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_I_t_e_r VertexIter; │ │ │ │ +136 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r ConstVertexIter; │ │ │ │ +137 typedef typename _P_o_l_y_M_e_s_h_:_:_E_d_g_e_I_t_e_r EdgeIter; │ │ │ │ +138 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r ConstEdgeIter; │ │ │ │ +139 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_I_t_e_r FaceIter; │ │ │ │ +140 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r ConstFaceIter; │ │ │ │ +141 │ │ │ │ +142 │ │ │ │ +143 │ │ │ │ +144 //--- circulators --- │ │ │ │ 145 │ │ │ │ -146 │ │ │ │ -147// │ │ │ │ +146 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r VertexVertexIter; │ │ │ │ +147 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r VertexOHalfedgeIter; │ │ │ │ +148 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r VertexIHalfedgeIter; │ │ │ │ +149 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r VertexEdgeIter; │ │ │ │ +150 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r VertexFaceIter; │ │ │ │ +151 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r FaceVertexIter; │ │ │ │ +152 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r FaceHalfedgeIter; │ │ │ │ +153 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_E_d_g_e_I_t_e_r FaceEdgeIter; │ │ │ │ +154 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_F_a_c_e_I_t_e_r FaceFaceIter; │ │ │ │ +155 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r ConstVertexVertexIter; │ │ │ │ +156 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +ConstVertexOHalfedgeIter; │ │ │ │ +157 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +ConstVertexIHalfedgeIter; │ │ │ │ +158 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r ConstVertexEdgeIter; │ │ │ │ +159 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r ConstVertexFaceIter; │ │ │ │ +160 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r ConstFaceVertexIter; │ │ │ │ +161 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r ConstFaceHalfedgeIter; │ │ │ │ +162 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r ConstFaceEdgeIter; │ │ │ │ +163 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r ConstFaceFaceIter; │ │ │ │ +164 │ │ │ │ +165 // --- constructor/destructor │ │ │ │ +166 │ │ │ │ +_1_6_8 _T_r_i_M_e_s_h_T() : _P_o_l_y_M_e_s_h() {} │ │ │ │ +169 explicit _T_r_i_M_e_s_h_T(_P_o_l_y_M_e_s_h rhs) : _P_o_l_y_M_e_s_h((rhs.triangulate(), rhs)) │ │ │ │ +170 { │ │ │ │ +171 } │ │ │ │ +172 │ │ │ │ +_1_7_4 virtual _~_T_r_i_M_e_s_h_T() {} │ │ │ │ +175 │ │ │ │ +176 //--- halfedge collapse / vertex split --- │ │ │ │ +177 │ │ │ │ +_2_1_8 inline HalfedgeHandle _v_e_r_t_e_x___s_p_l_i_t(Point _v0_point, VertexHandle _v1, │ │ │ │ +219 VertexHandle _vl, VertexHandle _vr) │ │ │ │ +220 { return PolyMesh::vertex_split(this->_a_d_d___v_e_r_t_e_x(_v0_point), _v1, _vl, │ │ │ │ +_vr); } │ │ │ │ +221 │ │ │ │ +_2_6_2 inline HalfedgeHandle _v_e_r_t_e_x___s_p_l_i_t(VertexHandle _v0, VertexHandle _v1, │ │ │ │ +263 VertexHandle _vl, VertexHandle _vr) │ │ │ │ +264 { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); } │ │ │ │ +265 │ │ │ │ +_2_7_5 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t(EdgeHandle _eh, const Point& _p) │ │ │ │ +276 { │ │ │ │ +277 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ +278 const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); Kernel::split(_eh, vh); │ │ │ │ +return vh; │ │ │ │ +279 } │ │ │ │ +280 │ │ │ │ +_2_8_9 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t___c_o_p_y(EdgeHandle _eh, const Point& _p) │ │ │ │ +290 { │ │ │ │ +291 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ +292 const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); Kernel::split_copy(_eh, │ │ │ │ +vh); return vh; │ │ │ │ +293 } │ │ │ │ +294 │ │ │ │ +_3_0_2 inline void _s_p_l_i_t(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +303 { │ │ │ │ +304 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ +305 Kernel::split(_eh, _vh); │ │ │ │ +306 } │ │ │ │ +307 │ │ │ │ +_3_1_5 inline void _s_p_l_i_t___c_o_p_y(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +316 { │ │ │ │ +317 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ +318 Kernel::split_copy(_eh, _vh); │ │ │ │ +319 } │ │ │ │ +320 │ │ │ │ +_3_3_0 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t(FaceHandle _fh, const Point& _p) │ │ │ │ +331 { const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); _P_o_l_y_M_e_s_h_:_:_s_p_l_i_t(_fh, │ │ │ │ +vh); return vh; } │ │ │ │ +332 │ │ │ │ +_3_4_2 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t___c_o_p_y(FaceHandle _fh, const Point& _p) │ │ │ │ +343 { const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); PolyMesh::split_copy │ │ │ │ +(_fh, vh); return vh; } │ │ │ │ +344 │ │ │ │ +345 │ │ │ │ +_3_5_0 inline void _s_p_l_i_t(FaceHandle _fh) │ │ │ │ +351 { │ │ │ │ +352 // Collect halfedges of face │ │ │ │ +353 HalfedgeHandle he0 = this->halfedge_handle(_fh); │ │ │ │ +354 HalfedgeHandle he1 = this->next_halfedge_handle(he0); │ │ │ │ +355 HalfedgeHandle he2 = this->next_halfedge_handle(he1); │ │ │ │ +356 │ │ │ │ +357 EdgeHandle eh0 = this->edge_handle(he0); │ │ │ │ +358 EdgeHandle eh1 = this->edge_handle(he1); │ │ │ │ +359 EdgeHandle eh2 = this->edge_handle(he2); │ │ │ │ +360 │ │ │ │ +361 // Collect points of face │ │ │ │ +362 VertexHandle p0 = this->to_vertex_handle(he0); │ │ │ │ +363 VertexHandle p1 = this->to_vertex_handle(he1); │ │ │ │ +364 VertexHandle p2 = this->to_vertex_handle(he2); │ │ │ │ +365 │ │ │ │ +366 // Calculate midpoint coordinates │ │ │ │ +367 const Point new0 = (this->point(p0) + this->point(p2)) * │ │ │ │ +static_cast_:_:_v_a_l_u_e___t_y_p_e >(0.5); │ │ │ │ +368 const Point new1 = (this->point(p0) + this->point(p1)) * │ │ │ │ +static_cast_:_:_v_a_l_u_e___t_y_p_e >(0.5); │ │ │ │ +369 const Point new2 = (this->point(p1) + this->point(p2)) * │ │ │ │ +static_cast_:_:_v_a_l_u_e___t_y_p_e >(0.5); │ │ │ │ +370 │ │ │ │ +371 // Add vertices at midpoint coordinates │ │ │ │ +372 VertexHandle v0 = this->_a_d_d___v_e_r_t_e_x(new0); │ │ │ │ +373 VertexHandle v1 = this->_a_d_d___v_e_r_t_e_x(new1); │ │ │ │ +374 VertexHandle v2 = this->_a_d_d___v_e_r_t_e_x(new2); │ │ │ │ +375 │ │ │ │ +376 const bool split0 = !this->is_boundary(eh0); │ │ │ │ +377 const bool split1 = !this->is_boundary(eh1); │ │ │ │ +378 const bool split2 = !this->is_boundary(eh2); │ │ │ │ +379 │ │ │ │ +380 // delete original face │ │ │ │ +381 this->delete_face(_fh); │ │ │ │ +382 │ │ │ │ +383 // split boundary edges of deleted face ( if not boundary ) │ │ │ │ +384 if ( split0 ) { │ │ │ │ +385 this->_s_p_l_i_t(eh0,v0); │ │ │ │ +386 } │ │ │ │ +387 │ │ │ │ +388 if ( split1 ) { │ │ │ │ +389 this->_s_p_l_i_t(eh1,v1); │ │ │ │ +390 } │ │ │ │ +391 │ │ │ │ +392 if ( split2 ) { │ │ │ │ +393 this->_s_p_l_i_t(eh2,v2); │ │ │ │ +394 } │ │ │ │ +395 │ │ │ │ +396 // Retriangulate │ │ │ │ +397 this->add_face(v0 , p0, v1); │ │ │ │ +398 this->add_face(p2, v0 , v2); │ │ │ │ +399 this->add_face(v2,v1,p1); │ │ │ │ +400 this->add_face(v2 , v0, v1); │ │ │ │ +401 } │ │ │ │ +402 │ │ │ │ +_4_1_0 inline void _s_p_l_i_t(FaceHandle _fh, VertexHandle _vh) │ │ │ │ +411 { _P_o_l_y_M_e_s_h_:_:_s_p_l_i_t(_fh, _vh); } │ │ │ │ +412 │ │ │ │ +_4_2_0 inline void _s_p_l_i_t___c_o_p_y(FaceHandle _fh, VertexHandle _vh) │ │ │ │ +421 { PolyMesh::split_copy(_fh, _vh); } │ │ │ │ +422 │ │ │ │ +_4_2_7 Scalar _c_a_l_c___f_a_c_e___a_r_e_a(FaceHandle _fh) const │ │ │ │ +428 { │ │ │ │ +429 const HalfedgeHandle heh = this->halfedge_handle(_fh); │ │ │ │ +430 return this->_c_a_l_c___s_e_c_t_o_r___a_r_e_a(heh); │ │ │ │ +431 } │ │ │ │ +432 │ │ │ │ +436 │ │ │ │ +438 Normal _c_a_l_c___f_a_c_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +439 │ │ │ │ +441}; │ │ │ │ +442 │ │ │ │ +443 │ │ │ │ +444// │ │ │ │ +============================================================================= │ │ │ │ +445} // namespace OpenMesh │ │ │ │ +446// │ │ │ │ ============================================================================= │ │ │ │ -148} // namespace IO │ │ │ │ -149} // namespace OpenMesh │ │ │ │ -150// │ │ │ │ +447#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C) │ │ │ │ +448#define OPENMESH_TRIMESH_TEMPLATES │ │ │ │ +449#include "TriMeshT_impl.hh" │ │ │ │ +450#endif │ │ │ │ +451// │ │ │ │ ============================================================================= │ │ │ │ -151#endif │ │ │ │ -152// │ │ │ │ +452#endif // OPENMESH_TRIMESH_HH defined │ │ │ │ +453// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_t_i_o_n │ │ │ │ -DDeeffiinniittiioonn mconvert.cc:103 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_E_x_p_o_r_t_e_r │ │ │ │ -Base class for exporter modules. │ │ │ │ -DDeeffiinniittiioonn BaseExporter.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ -Set options for reader/writer modules. │ │ │ │ -DDeeffiinniittiioonn Options.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r │ │ │ │ -Base class for all writer modules. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_w_r_i_t_e │ │ │ │ -virtual bool write(std::ostream &_os, BaseExporter &_be, const Options │ │ │ │ -&_writeOptions, std::streamsize _precision=6) const =0 │ │ │ │ -Write to a std::ostream. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_g_e_t___e_x_t_e_n_s_i_o_n_s │ │ │ │ -virtual std::string get_extensions() const =0 │ │ │ │ -Return file format's extension. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_w_r_i_t_e │ │ │ │ -virtual bool write(const std::string &_filename, BaseExporter &_be, const │ │ │ │ -Options &_writeOptions, std::streamsize _precision=6) const =0 │ │ │ │ -Write to a file. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_~_B_a_s_e_W_r_i_t_e_r │ │ │ │ -virtual ~BaseWriter() │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ +Base type for a polygonal mesh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x │ │ │ │ +Kernel::Vertex Vertex │ │ │ │ +Vertex type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::FaceEdgeIter FaceEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceIter ConstFaceIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:151 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ +Kernel::Scalar Scalar │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstVertexVertexIter ConstVertexVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:172 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::VertexFaceIter VertexFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:166 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstFaceVertexIter ConstFaceVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:177 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e │ │ │ │ +Kernel::Halfedge Halfedge │ │ │ │ +Halfedge type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:126 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::FaceIter FaceIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ +Kernel::Normal Normal │ │ │ │ +Normal type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::FaceVertexIter FaceVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:167 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::VertexIHalfedgeIter VertexIHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:164 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ +Kernel::TexCoord2D TexCoord2D │ │ │ │ +TexCoord2D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___a_r_e_a │ │ │ │ +Scalar calc_sector_area(HalfedgeHandle _in_heh) const │ │ │ │ +calculates the area of the face sector defined by the angle < │ │ │ │ +(_in_heh,next_halfedge(_in_heh)) NOTE: s... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:524 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceEdgeIter ConstFaceEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:179 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ +Kernel::TexCoord3D TexCoord3D │ │ │ │ +TexCoord3D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexFaceIter ConstVertexFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::VertexOHalfedgeIter VertexOHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:163 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::VertexEdgeIter VertexEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:165 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e │ │ │ │ +Kernel::Face Face │ │ │ │ +Face type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:130 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::FaceFaceIter FaceFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:170 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexEdgeIter ConstVertexEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:175 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle add_vertex(const Point _p) │ │ │ │ +Alias for new_vertex(const Point&). │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:238 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e │ │ │ │ +Kernel::Edge Edge │ │ │ │ +Edge type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::EdgeIter EdgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstEdgeIter ConstEdgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:150 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstVertexIter ConstVertexIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:148 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:173 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexVertexIter VertexVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:162 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::FaceHalfedgeIter FaceHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:168 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceFaceIter ConstFaceFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:180 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(FaceHandle _fh, const Point &_p) │ │ │ │ +Face split (= 1-to-n split) │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:589 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ +Kernel::Color Color │ │ │ │ +Color type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_1_D │ │ │ │ +Kernel::TexCoord1D TexCoord1D │ │ │ │ +TexCoord1D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:118 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexIter VertexIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ +allows easier access t... │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T │ │ │ │ +Base type for a triangle mesh. │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +Edge split (= 2-to-4 split) │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(FaceHandle _fh) │ │ │ │ +Face split (= 1-to-4) split, splits edges at midpoints and adds 4 new faces in │ │ │ │ +the interior). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_T_r_i_M_e_s_h_T │ │ │ │ +TriMeshT() │ │ │ │ +Default constructor. │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:168 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(FaceHandle _fh, VertexHandle _vh) │ │ │ │ +Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:410 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ +Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ +Calculate normal vector for face _fh (specialized for TriMesh). │ │ │ │ +DDeeffiinniittiioonn TriMeshT_impl.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +SmartVertexHandle split(EdgeHandle _eh, const Point &_p) │ │ │ │ +Edge split (= 2-to-4 split) │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:275 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_v_e_r_t_e_x___s_p_l_i_t │ │ │ │ +HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, VertexHandle │ │ │ │ +_vl, VertexHandle _vr) │ │ │ │ +Vertex Split: inverse operation to collapse(). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:218 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_i_s___p_o_l_y_m_e_s_h │ │ │ │ +static constexpr bool is_polymesh() │ │ │ │ +Determine whether this is a PolyMeshT or TriMeshT (This function does not check │ │ │ │ +the per face vertex c... │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:103 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___a_r_e_a │ │ │ │ +Scalar calc_face_area(FaceHandle _fh) const │ │ │ │ +Calculates the area of a face. │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:427 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +SmartVertexHandle split(FaceHandle _fh, const Point &_p) │ │ │ │ +Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:330 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_~_T_r_i_M_e_s_h_T │ │ │ │ +virtual ~TriMeshT() │ │ │ │ Destructor. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:90 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ -virtual size_t binary_size(BaseExporter &, const Options &) const │ │ │ │ -Returns expected size of file if binary format is supported else 0. │ │ │ │ -DDeeffiinniittiioonn BaseWriter.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_W_r_i_t_e_r_:_:_g_e_t___d_e_s_c_r_i_p_t_i_o_n │ │ │ │ -virtual std::string get_description() const =0 │ │ │ │ -Return short description of the supported file format. │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ +void split_copy(FaceHandle _fh, VertexHandle _vh) │ │ │ │ +Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:420 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ +SmartVertexHandle split_copy(FaceHandle _fh, const Point &_p) │ │ │ │ +Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:342 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_v_e_r_t_e_x___s_p_l_i_t │ │ │ │ +HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1, VertexHandle │ │ │ │ +_vl, VertexHandle _vr) │ │ │ │ +Vertex Split: inverse operation to collapse(). │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:262 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ +void split_copy(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +Edge split (= 2-to-4 split) │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:315 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ +SmartVertexHandle split_copy(EdgeHandle _eh, const Point &_p) │ │ │ │ +Edge split (= 2-to-4 split) │ │ │ │ +DDeeffiinniittiioonn TriMeshT.hh:289 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +T::value_type value_type │ │ │ │ +Type of the scalar value. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00641_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/SR_binary_vector_of_bool.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/TriMeshT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,125 +92,111 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SR_binary_vector_of_bool.hh
│ │ │ +
TriMeshT_impl.hh
│ │ │
│ │ │
│ │ │ -
1
│ │ │ -
│ │ │ -
2template <> struct binary< std::vector<bool> >
│ │ │ -
3{
│ │ │ -
4 typedef std::vector< bool > value_type;
│ │ │ -
5 typedef value_type::value_type elem_type;
│ │ │ -
6
│ │ │ -
7 static const bool is_streamable = true;
│ │ │ -
8
│ │ │ -
9 static size_t size_of(bool /*_store_size*/ = true) { return UnknownSize; }
│ │ │ -
10 static size_t size_of(const value_type& _v, bool _store_size = true)
│ │ │ -
11 {
│ │ │ -
12 size_t size = _v.size() / 8 + ((_v.size() % 8)!=0);
│ │ │ -
13 if(_store_size)
│ │ │ -
14 size += binary<unsigned int>::size_of();
│ │ │ -
15 return size;
│ │ │ -
16 }
│ │ │ -
17 static std::string type_identifier(void) { return "std::vector<bool>"; }
│ │ │ -
18 static
│ │ │ -
19 size_t store( std::ostream& _ostr, const value_type& _v, bool _swap, bool _store_size = true)
│ │ │ -
20 {
│ │ │ -
21 size_t bytes = 0;
│ │ │ -
22
│ │ │ -
23 size_t N = _v.size() / 8;
│ │ │ -
24 size_t R = _v.size() % 8;
│ │ │ -
25
│ │ │ -
26 if(_store_size)
│ │ │ -
27 {
│ │ │ -
28 unsigned int size_N = static_cast<unsigned int>(_v.size());
│ │ │ -
29 bytes += binary<unsigned int>::store( _ostr, size_N, _swap );
│ │ │ -
30 }
│ │ │ -
31
│ │ │ -
32 size_t idx; // element index
│ │ │ -
33 size_t bidx;
│ │ │ -
34 unsigned char bits; // bitset
│ │ │ -
35
│ │ │ -
36 for (bidx=idx=0; idx < N; ++idx, bidx+=8)
│ │ │ -
37 {
│ │ │ -
38 bits = static_cast<unsigned char>(_v[bidx])
│ │ │ -
39 | (static_cast<unsigned char>(_v[bidx+1]) << 1)
│ │ │ -
40 | (static_cast<unsigned char>(_v[bidx+2]) << 2)
│ │ │ -
41 | (static_cast<unsigned char>(_v[bidx+3]) << 3)
│ │ │ -
42 | (static_cast<unsigned char>(_v[bidx+4]) << 4)
│ │ │ -
43 | (static_cast<unsigned char>(_v[bidx+5]) << 5)
│ │ │ -
44 | (static_cast<unsigned char>(_v[bidx+6]) << 6)
│ │ │ -
45 | (static_cast<unsigned char>(_v[bidx+7]) << 7);
│ │ │ -
46 _ostr << bits;
│ │ │ -
47 }
│ │ │ -
48 bytes += N;
│ │ │ -
49
│ │ │ -
50 if (R)
│ │ │ -
51 {
│ │ │ -
52 bits = 0;
│ │ │ -
53 for (idx=0; idx < R; ++idx)
│ │ │ -
54 bits |= static_cast<unsigned char>(_v[bidx+idx]) << idx;
│ │ │ -
55 _ostr << bits;
│ │ │ -
56 ++bytes;
│ │ │ -
57 }
│ │ │ -
58 assert( bytes == size_of(_v, _store_size) );
│ │ │ -
59
│ │ │ -
60 return bytes;
│ │ │ -
61 }
│ │ │ +
1/* ========================================================================= *
│ │ │ +
2 * *
│ │ │ +
3 * OpenMesh *
│ │ │ +
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
5 * Department of Computer Graphics and Multimedia *
│ │ │ +
6 * All rights reserved. *
│ │ │ +
7 * www.openmesh.org *
│ │ │ +
8 * *
│ │ │ +
9 *---------------------------------------------------------------------------*
│ │ │ +
10 * This file is part of OpenMesh. *
│ │ │ +
11 *---------------------------------------------------------------------------*
│ │ │ +
12 * *
│ │ │ +
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ +
14 * modification, are permitted provided that the following conditions *
│ │ │ +
15 * are met: *
│ │ │ +
16 * *
│ │ │ +
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ +
18 * this list of conditions and the following disclaimer. *
│ │ │ +
19 * *
│ │ │ +
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ +
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ +
22 * documentation and/or other materials provided with the distribution. *
│ │ │ +
23 * *
│ │ │ +
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ +
25 * contributors may be used to endorse or promote products derived from *
│ │ │ +
26 * this software without specific prior written permission. *
│ │ │ +
27 * *
│ │ │ +
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ +
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ +
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ +
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ +
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ +
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ +
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ +
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ +
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ +
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ +
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ +
39 * *
│ │ │ +
40 * ========================================================================= */
│ │ │ +
41
│ │ │ +
42
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// CLASS TriMeshT - IMPLEMENTATION
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52#define OPENMESH_TRIMESH_C
│ │ │ +
53
│ │ │ +
54
│ │ │ +
55//== INCLUDES =================================================================
│ │ │ +
56
│ │ │ +
57
│ │ │ +
58#include <OpenMesh/Core/Mesh/TriMeshT.hh>
│ │ │ + │ │ │ +
60#include <vector>
│ │ │ +
61
│ │ │
62
│ │ │ -
63 static
│ │ │ -
64 size_t restore( std::istream& _istr, value_type& _v, bool _swap, bool _restore_size = true)
│ │ │ -
65 {
│ │ │ -
66 size_t bytes = 0;
│ │ │ +
63//== NAMESPACES ==============================================================
│ │ │ +
64
│ │ │ +
65
│ │ │ +
66namespace OpenMesh {
│ │ │
67
│ │ │ -
68 if(_restore_size)
│ │ │ -
69 {
│ │ │ -
70 unsigned int size_of_vec;
│ │ │ -
71 bytes += binary<unsigned int>::restore(_istr, size_of_vec, _swap);
│ │ │ -
72 _v.resize(size_of_vec);
│ │ │ -
73 }
│ │ │ -
74
│ │ │ -
75 size_t N = _v.size() / 8;
│ │ │ -
76 size_t R = _v.size() % 8;
│ │ │ -
77
│ │ │ -
78 size_t idx; // element index
│ │ │ -
79 size_t bidx; //
│ │ │ -
80 unsigned char bits; // bitset
│ │ │ -
81
│ │ │ -
82 for (bidx=idx=0; idx < N; ++idx, bidx+=8)
│ │ │ -
83 {
│ │ │ -
84 _istr >> bits;
│ │ │ -
85 _v[bidx+0] = (bits & 0x01) != 0;
│ │ │ -
86 _v[bidx+1] = (bits & 0x02) != 0;
│ │ │ -
87 _v[bidx+2] = (bits & 0x04) != 0;
│ │ │ -
88 _v[bidx+3] = (bits & 0x08) != 0;
│ │ │ -
89 _v[bidx+4] = (bits & 0x10) != 0;
│ │ │ -
90 _v[bidx+5] = (bits & 0x20) != 0;
│ │ │ -
91 _v[bidx+6] = (bits & 0x40) != 0;
│ │ │ -
92 _v[bidx+7] = (bits & 0x80) != 0;
│ │ │ -
93 }
│ │ │ -
94 bytes += N;
│ │ │ -
95
│ │ │ -
96 if (R)
│ │ │ -
97 {
│ │ │ -
98 _istr >> bits;
│ │ │ -
99 for (idx=0; idx < R; ++idx)
│ │ │ -
100 _v[bidx+idx] = (bits & (1<<idx)) != 0;
│ │ │ -
101 ++bytes;
│ │ │ -
102 }
│ │ │ -
103
│ │ │ -
104 return bytes;
│ │ │ -
105 }
│ │ │ -
106};
│ │ │ -
│ │ │ +
68
│ │ │ +
69//== IMPLEMENTATION ==========================================================
│ │ │ +
70
│ │ │ +
71template <class Kernel>
│ │ │ +
72typename TriMeshT<Kernel>::Normal
│ │ │ +
│ │ │ + │ │ │ +
74calc_face_normal(FaceHandle _fh) const
│ │ │ +
75{
│ │ │ +
76 assert(this->halfedge_handle(_fh).is_valid());
│ │ │ +
77 ConstFaceVertexIter fv_it(this->cfv_iter(_fh));
│ │ │ +
78
│ │ │ +
79 const Point& p0(this->point(*fv_it)); ++fv_it;
│ │ │ +
80 const Point& p1(this->point(*fv_it)); ++fv_it;
│ │ │ +
81 const Point& p2(this->point(*fv_it));
│ │ │ +
82
│ │ │ +
83 return PolyMesh::calc_face_normal(p0, p1, p2);
│ │ │ +
84}
│ │ │ +
│ │ │ +
85
│ │ │ +
86//=============================================================================
│ │ │ +
87} // namespace OpenMesh
│ │ │ +
88//=============================================================================
│ │ │ +
This file provides the streams omlog, omout, and omerr.
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition PolyMeshT_impl.hh:97
│ │ │ +
Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh (specialized for TriMesh).
Definition TriMeshT_impl.hh:74
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,116 +1,122 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SR_binary_vector_of_bool.hh │ │ │ │ -1 │ │ │ │ -_2template <> struct binary< std::vector > │ │ │ │ -3{ │ │ │ │ -4 typedef std::vector< bool > value_type; │ │ │ │ -5 typedef value_type::value_type elem_type; │ │ │ │ -6 │ │ │ │ -7 static const bool is_streamable = true; │ │ │ │ -8 │ │ │ │ -9 static size_t size_of(bool /*_store_size*/ = true) { return UnknownSize; } │ │ │ │ -10 static size_t size_of(const value_type& _v, bool _store_size = true) │ │ │ │ -11 { │ │ │ │ -12 size_t size = _v.size() / 8 + ((_v.size() % 8)!=0); │ │ │ │ -13 if(_store_size) │ │ │ │ -14 size += binary::size_of(); │ │ │ │ -15 return size; │ │ │ │ -16 } │ │ │ │ -17 static std::string type_identifier(void) { return "std::vector"; } │ │ │ │ -18 static │ │ │ │ -19 size_t store( std::ostream& _ostr, const value_type& _v, bool _swap, bool │ │ │ │ -_store_size = true) │ │ │ │ -20 { │ │ │ │ -21 size_t bytes = 0; │ │ │ │ -22 │ │ │ │ -23 size_t N = _v.size() / 8; │ │ │ │ -24 size_t R = _v.size() % 8; │ │ │ │ -25 │ │ │ │ -26 if(_store_size) │ │ │ │ -27 { │ │ │ │ -28 unsigned int size_N = static_cast(_v.size()); │ │ │ │ -29 bytes += binary::store( _ostr, size_N, _swap ); │ │ │ │ -30 } │ │ │ │ -31 │ │ │ │ -32 size_t idx; // element index │ │ │ │ -33 size_t bidx; │ │ │ │ -34 unsigned char bits; // bitset │ │ │ │ -35 │ │ │ │ -36 for (bidx=idx=0; idx < N; ++idx, bidx+=8) │ │ │ │ -37 { │ │ │ │ -38 bits = static_cast(_v[bidx]) │ │ │ │ -39 | (static_cast(_v[bidx+1]) << 1) │ │ │ │ -40 | (static_cast(_v[bidx+2]) << 2) │ │ │ │ -41 | (static_cast(_v[bidx+3]) << 3) │ │ │ │ -42 | (static_cast(_v[bidx+4]) << 4) │ │ │ │ -43 | (static_cast(_v[bidx+5]) << 5) │ │ │ │ -44 | (static_cast(_v[bidx+6]) << 6) │ │ │ │ -45 | (static_cast(_v[bidx+7]) << 7); │ │ │ │ -46 _ostr << bits; │ │ │ │ -47 } │ │ │ │ -48 bytes += N; │ │ │ │ -49 │ │ │ │ -50 if (R) │ │ │ │ -51 { │ │ │ │ -52 bits = 0; │ │ │ │ -53 for (idx=0; idx < R; ++idx) │ │ │ │ -54 bits |= static_cast(_v[bidx+idx]) << idx; │ │ │ │ -55 _ostr << bits; │ │ │ │ -56 ++bytes; │ │ │ │ -57 } │ │ │ │ -58 assert( bytes == size_of(_v, _store_size) ); │ │ │ │ -59 │ │ │ │ -60 return bytes; │ │ │ │ -61 } │ │ │ │ +TriMeshT_impl.hh │ │ │ │ +1/* ========================================================================= * │ │ │ │ +2 * * │ │ │ │ +3 * OpenMesh * │ │ │ │ +4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +5 * Department of Computer Graphics and Multimedia * │ │ │ │ +6 * All rights reserved. * │ │ │ │ +7 * www.openmesh.org * │ │ │ │ +8 * * │ │ │ │ +9 *---------------------------------------------------------------------------* │ │ │ │ +10 * This file is part of OpenMesh. * │ │ │ │ +11 *--------------------------------------------------------------------------- │ │ │ │ +* │ │ │ │ +12 * * │ │ │ │ +13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ +14 * modification, are permitted provided that the following conditions * │ │ │ │ +15 * are met: * │ │ │ │ +16 * * │ │ │ │ +17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ +* │ │ │ │ +18 * this list of conditions and the following disclaimer. * │ │ │ │ +19 * * │ │ │ │ +20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ +21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ +22 * documentation and/or other materials provided with the distribution. * │ │ │ │ +23 * * │ │ │ │ +24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ +25 * contributors may be used to endorse or promote products derived from * │ │ │ │ +26 * this software without specific prior written permission. * │ │ │ │ +27 * * │ │ │ │ +28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ +29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ +* │ │ │ │ +30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ +31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ +* │ │ │ │ +32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ +33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ +34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ +35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ +36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ +37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ +38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ +39 * * │ │ │ │ +40 * ========================================================================= │ │ │ │ +*/ │ │ │ │ +41 │ │ │ │ +42 │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// CLASS TriMeshT - IMPLEMENTATION │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52#define OPENMESH_TRIMESH_C │ │ │ │ +53 │ │ │ │ +54 │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +56 │ │ │ │ +57 │ │ │ │ +58#include │ │ │ │ +59#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ +60#include │ │ │ │ +61 │ │ │ │ 62 │ │ │ │ -63 static │ │ │ │ -64 size_t restore( std::istream& _istr, value_type& _v, bool _swap, bool │ │ │ │ -_restore_size = true) │ │ │ │ -65 { │ │ │ │ -66 size_t bytes = 0; │ │ │ │ +63//== NAMESPACES │ │ │ │ +============================================================== │ │ │ │ +64 │ │ │ │ +65 │ │ │ │ +66namespace _O_p_e_n_M_e_s_h { │ │ │ │ 67 │ │ │ │ -68 if(_restore_size) │ │ │ │ -69 { │ │ │ │ -70 unsigned int size_of_vec; │ │ │ │ -71 bytes += binary::restore(_istr, size_of_vec, _swap); │ │ │ │ -72 _v.resize(size_of_vec); │ │ │ │ -73 } │ │ │ │ -74 │ │ │ │ -75 size_t N = _v.size() / 8; │ │ │ │ -76 size_t R = _v.size() % 8; │ │ │ │ -77 │ │ │ │ -78 size_t idx; // element index │ │ │ │ -79 size_t bidx; // │ │ │ │ -80 unsigned char bits; // bitset │ │ │ │ -81 │ │ │ │ -82 for (bidx=idx=0; idx < N; ++idx, bidx+=8) │ │ │ │ -83 { │ │ │ │ -84 _istr >> bits; │ │ │ │ -85 _v[bidx+0] = (bits & 0x01) != 0; │ │ │ │ -86 _v[bidx+1] = (bits & 0x02) != 0; │ │ │ │ -87 _v[bidx+2] = (bits & 0x04) != 0; │ │ │ │ -88 _v[bidx+3] = (bits & 0x08) != 0; │ │ │ │ -89 _v[bidx+4] = (bits & 0x10) != 0; │ │ │ │ -90 _v[bidx+5] = (bits & 0x20) != 0; │ │ │ │ -91 _v[bidx+6] = (bits & 0x40) != 0; │ │ │ │ -92 _v[bidx+7] = (bits & 0x80) != 0; │ │ │ │ -93 } │ │ │ │ -94 bytes += N; │ │ │ │ -95 │ │ │ │ -96 if (R) │ │ │ │ -97 { │ │ │ │ -98 _istr >> bits; │ │ │ │ -99 for (idx=0; idx < R; ++idx) │ │ │ │ -100 _v[bidx+idx] = (bits & (1< │ │ │ │ +72typename TriMeshT::Normal │ │ │ │ +_7_3_T_r_i_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ +74_c_a_l_c___f_a_c_e___n_o_r_m_a_l(FaceHandle _fh) const │ │ │ │ +75{ │ │ │ │ +76 assert(this->halfedge_handle(_fh).is_valid()); │ │ │ │ +77 ConstFaceVertexIter fv_it(this->cfv_iter(_fh)); │ │ │ │ +78 │ │ │ │ +79 const Point& p0(this->point(*fv_it)); ++fv_it; │ │ │ │ +80 const Point& p1(this->point(*fv_it)); ++fv_it; │ │ │ │ +81 const Point& p2(this->point(*fv_it)); │ │ │ │ +82 │ │ │ │ +83 return _P_o_l_y_M_e_s_h_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l(p0, p1, p2); │ │ │ │ +84} │ │ │ │ +85 │ │ │ │ +86// │ │ │ │ +============================================================================= │ │ │ │ +87} // namespace OpenMesh │ │ │ │ +88// │ │ │ │ +============================================================================= │ │ │ │ +_o_m_s_t_r_e_a_m_._h_h │ │ │ │ +This file provides the streams omlog, omout, and omerr. │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ +virtual Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ +Calculate normal vector for face _fh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ +Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ +Calculate normal vector for face _fh (specialized for TriMesh). │ │ │ │ +DDeeffiinniittiioonn TriMeshT_impl.hh:74 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00647_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/IO/BinaryHelper.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/FinalMeshItemsT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
BinaryHelper.hh
│ │ │ +
FinalMeshItemsT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,102 +138,185 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Helper Functions for binary reading / writing
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ +
44#ifndef OPENMESH_MESH_ITEMS_HH
│ │ │ +
45#define OPENMESH_MESH_ITEMS_HH
│ │ │ +
46
│ │ │ +
47
│ │ │ +
48//== INCLUDES =================================================================
│ │ │ +
49
│ │ │
50
│ │ │ -
51#ifndef OPENMESH_BINARY_HELPER_HH
│ │ │ -
52#define OPENMESH_BINARY_HELPER_HH
│ │ │ -
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ +
51#include <OpenMesh/Core/System/config.h>
│ │ │ +
52#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ +
53#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ +
54#include <OpenMesh/Core/Mesh/Handles.hh>
│ │ │ +
55
│ │ │
56
│ │ │ -
57#include <OpenMesh/Core/System/config.h>
│ │ │ -
58// -------------------- STL
│ │ │ -
59#if defined( OM_CC_MIPS )
│ │ │ -
60# include <stdio.h>
│ │ │ -
61#else
│ │ │ -
62# include <cstdio>
│ │ │ -
63#endif
│ │ │ -
64#include <iosfwd>
│ │ │ -
65// -------------------- OpenMesh
│ │ │ -
66
│ │ │ -
67
│ │ │ -
68//== NAMESPACES ===============================================================
│ │ │ -
69
│ │ │ -
70namespace OpenMesh {
│ │ │ -
71namespace IO {
│ │ │ -
72
│ │ │ -
73
│ │ │ -
74//=============================================================================
│ │ │ +
57//== NAMESPACES ===============================================================
│ │ │ +
58
│ │ │ +
59
│ │ │ +
60namespace OpenMesh {
│ │ │ +
61
│ │ │ +
62
│ │ │ +
63//== CLASS DEFINITION =========================================================
│ │ │ +
64
│ │ │ +
66template <class Traits, bool IsTriMesh>
│ │ │ +
│ │ │ + │ │ │ +
68{
│ │ │ +
69 //--- build Refs structure ---
│ │ │ +
70#ifndef DOXY_IGNORE_THIS
│ │ │ +
71 struct Refs
│ │ │ +
72 {
│ │ │ +
73 typedef typename Traits::Point Point;
│ │ │ +
74 typedef typename vector_traits<Point>::value_type Scalar;
│ │ │
75
│ │ │ -
76
│ │ │ -
81
│ │ │ -
82//-----------------------------------------------------------------------------
│ │ │ -
83
│ │ │ -
84
│ │ │ -
87short int read_short(FILE* _in, bool _swap=false);
│ │ │ -
88
│ │ │ -
91int read_int(FILE* _in, bool _swap=false);
│ │ │ -
92
│ │ │ -
95float read_float(FILE* _in, bool _swap=false);
│ │ │ -
96
│ │ │ -
99double read_double(FILE* _in, bool _swap=false);
│ │ │ -
100
│ │ │ -
103short int read_short(std::istream& _in, bool _swap=false);
│ │ │ -
104
│ │ │ -
107int read_int(std::istream& _in, bool _swap=false);
│ │ │ +
76 typedef typename Traits::Normal Normal;
│ │ │ +
77 typedef typename Traits::Color Color;
│ │ │ +
78 typedef typename Traits::TexCoord1D TexCoord1D;
│ │ │ +
79 typedef typename Traits::TexCoord2D TexCoord2D;
│ │ │ +
80 typedef typename Traits::TexCoord3D TexCoord3D;
│ │ │ +
81 typedef typename Traits::TextureIndex TextureIndex;
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
86 };
│ │ │ +
87#endif
│ │ │ +
88 //--- export Refs types ---
│ │ │ +
89 typedef typename Refs::Point Point;
│ │ │ +
90 typedef typename Refs::Scalar Scalar;
│ │ │ +
91 typedef typename Refs::Normal Normal;
│ │ │ +
92 typedef typename Refs::Color Color;
│ │ │ +
93 typedef typename Refs::TexCoord1D TexCoord1D;
│ │ │ +
94 typedef typename Refs::TexCoord2D TexCoord2D;
│ │ │ +
95 typedef typename Refs::TexCoord3D TexCoord3D;
│ │ │ +
96 typedef typename Refs::TextureIndex TextureIndex;
│ │ │ +
97
│ │ │ +
98 //--- get attribute bits from Traits ---
│ │ │ +
99 enum Attribs
│ │ │ +
100 {
│ │ │ +
101 VAttribs = Traits::VertexAttributes,
│ │ │ +
102 HAttribs = Traits::HalfedgeAttributes,
│ │ │ +
103 EAttribs = Traits::EdgeAttributes,
│ │ │ +
104 FAttribs = Traits::FaceAttributes
│ │ │ +
105 };
│ │ │ +
106 //--- merge internal items with traits items ---
│ │ │ +
107
│ │ │
108
│ │ │ -
111float read_float(std::istream& _in, bool _swap=false);
│ │ │ -
112
│ │ │ -
115double read_double(std::istream& _in, bool _swap=false);
│ │ │ -
116
│ │ │ -
117
│ │ │ -
120void write_short(short int _i, FILE* _out, bool _swap=false);
│ │ │ +
109/*
│ │ │ +
110 typedef typename GenProg::IF<
│ │ │ +
111 (bool)(HAttribs & Attributes::PrevHalfedge),
│ │ │ +
112 typename InternalItems::Halfedge_with_prev,
│ │ │ +
113 typename InternalItems::Halfedge_without_prev
│ │ │ +
114 >::Result InternalHalfedge;
│ │ │ +
115*/
│ │ │ +
116 //typedef typename InternalItems::Vertex InternalVertex;
│ │ │ +
117 //typedef typename InternalItems::template Edge<Halfedge> InternalEdge;
│ │ │ +
118 //typedef typename InternalItems::template Face<IsTriMesh> InternalFace;
│ │ │ +
│ │ │ + │ │ │ +
120 {};
│ │ │ +
│ │ │
121
│ │ │ -
124void write_int(int _i, FILE* _out, bool _swap=false);
│ │ │ -
125
│ │ │ -
128void write_float(float _f, FILE* _out, bool _swap=false);
│ │ │ -
129
│ │ │ -
132void write_double(double _d, FILE* _out, bool _swap=false);
│ │ │ -
133
│ │ │ -
136void write_short(short int _i, std::ostream& _out, bool _swap=false);
│ │ │ -
137
│ │ │ -
140void write_int(int _i, std::ostream& _out, bool _swap=false);
│ │ │ -
141
│ │ │ -
144void write_float(float _f, std::ostream& _out, bool _swap=false);
│ │ │ +
122 typedef typename Traits::template VertexT<ITraits, Refs> VertexData;
│ │ │ +
123 typedef typename Traits::template HalfedgeT<ITraits, Refs> HalfedgeData;
│ │ │ +
124 typedef typename Traits::template EdgeT<ITraits, Refs> EdgeData;
│ │ │ +
125 typedef typename Traits::template FaceT<ITraits, Refs> FaceData;
│ │ │ +
126};
│ │ │ +
│ │ │ +
127
│ │ │ +
128
│ │ │ +
129#ifndef DOXY_IGNORE_THIS
│ │ │ +
130namespace {
│ │ │ +
131namespace TM {
│ │ │ +
132template<typename Lhs, typename Rhs> struct TypeEquality;
│ │ │ +
133template<typename Lhs> struct TypeEquality<Lhs, Lhs> {};
│ │ │ +
134
│ │ │ +
135template<typename LhsTraits, typename RhsTraits> struct ItemsEquality {
│ │ │ +
136 TypeEquality<typename LhsTraits::Point, typename RhsTraits::Point> te1;
│ │ │ +
137 TypeEquality<typename LhsTraits::Scalar, typename RhsTraits::Scalar> te2;
│ │ │ +
138 TypeEquality<typename LhsTraits::Normal, typename RhsTraits::Normal> te3;
│ │ │ +
139 TypeEquality<typename LhsTraits::Color, typename RhsTraits::Color> te4;
│ │ │ +
140 TypeEquality<typename LhsTraits::TexCoord1D, typename RhsTraits::TexCoord1D> te5;
│ │ │ +
141 TypeEquality<typename LhsTraits::TexCoord2D, typename RhsTraits::TexCoord2D> te6;
│ │ │ +
142 TypeEquality<typename LhsTraits::TexCoord3D, typename RhsTraits::TexCoord3D> te7;
│ │ │ +
143 TypeEquality<typename LhsTraits::TextureIndex, typename RhsTraits::TextureIndex> te8;
│ │ │ +
144};
│ │ │
145
│ │ │ -
148void write_double(double _d, std::ostream& _out, bool _swap=false);
│ │ │ +
146} /* namespace TM */
│ │ │ +
147} /* anonymous namespace */
│ │ │ +
148#endif
│ │ │
149
│ │ │ -
151
│ │ │ -
152
│ │ │ -
153//=============================================================================
│ │ │ -
154} // namespace IO
│ │ │ -
155} // namespace OpenMesh
│ │ │ -
156//=============================================================================
│ │ │ -
157#endif // OPENMESH_MESHREADER_HH defined
│ │ │ -
158//=============================================================================
│ │ │ -
159
│ │ │ +
178template<typename LhsMeshT, typename RhsMeshT> struct MeshCast;
│ │ │ +
179
│ │ │ +
180template<typename LhsMeshT, typename RhsMeshT>
│ │ │ +
│ │ │ +
181struct MeshCast<LhsMeshT&, RhsMeshT&> {
│ │ │ +
182 static LhsMeshT &cast(RhsMeshT &rhs) {
│ │ │ +
183 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ +
184 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ +
185 return reinterpret_cast<LhsMeshT&>(rhs);
│ │ │ +
186 }
│ │ │ +
187};
│ │ │ +
│ │ │ +
188
│ │ │ +
189template<typename LhsMeshT, typename RhsMeshT>
│ │ │ +
│ │ │ +
190struct MeshCast<const LhsMeshT&, const RhsMeshT&> {
│ │ │ +
191 static const LhsMeshT &cast(const RhsMeshT &rhs) {
│ │ │ +
192 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ +
193 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ +
194 return reinterpret_cast<const LhsMeshT&>(rhs);
│ │ │ +
195 }
│ │ │ +
196};
│ │ │ +
│ │ │ +
197
│ │ │ +
198template<typename LhsMeshT, typename RhsMeshT>
│ │ │ +
│ │ │ +
199struct MeshCast<LhsMeshT*, RhsMeshT*> {
│ │ │ +
200 static LhsMeshT *cast(RhsMeshT *rhs) {
│ │ │ +
201 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ +
202 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ +
203 return reinterpret_cast<LhsMeshT*>(rhs);
│ │ │ +
204 }
│ │ │ +
205};
│ │ │ +
│ │ │ +
206
│ │ │ +
207template<typename LhsMeshT, typename RhsMeshT>
│ │ │ +
│ │ │ +
208struct MeshCast<const LhsMeshT*, const RhsMeshT*> {
│ │ │ +
209 static const LhsMeshT *cast(const RhsMeshT *rhs) {
│ │ │ +
210 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ +
211 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ +
212 return reinterpret_cast<const LhsMeshT*>(rhs);
│ │ │ +
213 }
│ │ │ +
214};
│ │ │ +
│ │ │ +
215
│ │ │ +
216
│ │ │ +
217//=============================================================================
│ │ │ +
218} // namespace OpenMesh
│ │ │ +
219//=============================================================================
│ │ │ +
220#endif // OPENMESH_MESH_ITEMS_HH defined
│ │ │ +
221//=============================================================================
│ │ │ +
222
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
short int read_short(FILE *_in, bool _swap=false)
Binary read a short from _is and perform byte swapping if _swap is true.
│ │ │ -
float read_float(FILE *_in, bool _swap=false)
Binary read a float from _is and perform byte swapping if _swap is true.
│ │ │ -
void write_int(int _i, FILE *_out, bool _swap=false)
Binary write an int to _os and perform byte swapping if _swap is true.
│ │ │ -
void write_double(double _d, FILE *_out, bool _swap=false)
Binary write a double to _os and perform byte swapping if _swap is true.
│ │ │ -
void write_short(short int _i, FILE *_out, bool _swap=false)
Binary write a short to _os and perform byte swapping if _swap is true.
│ │ │ -
int read_int(FILE *_in, bool _swap=false)
Binary read an int from _is and perform byte swapping if _swap is true.
│ │ │ -
double read_double(FILE *_in, bool _swap=false)
Binary read a double from _is and perform byte swapping if _swap is true.
│ │ │ -
void write_float(float _f, FILE *_out, bool _swap=false)
Binary write a float to _os and perform byte swapping if _swap is true.
│ │ │ +
Definition of the mesh entities (items).
Definition FinalMeshItemsT.hh:68
│ │ │ +
Definition FinalMeshItemsT.hh:120
│ │ │ +
Cast a mesh with different but identical traits into each other.
Definition FinalMeshItemsT.hh:178
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -BinaryHelper.hh │ │ │ │ +FinalMeshItemsT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,126 +47,206 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// Helper Functions for binary reading / writing │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51#ifndef OPENMESH_BINARY_HELPER_HH │ │ │ │ -52#define OPENMESH_BINARY_HELPER_HH │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ +44#ifndef OPENMESH_MESH_ITEMS_HH │ │ │ │ +45#define OPENMESH_MESH_ITEMS_HH │ │ │ │ +46 │ │ │ │ +47 │ │ │ │ +48//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ +49 │ │ │ │ +50 │ │ │ │ +51#include │ │ │ │ +52#include │ │ │ │ +53#include │ │ │ │ +54#include │ │ │ │ +55 │ │ │ │ 56 │ │ │ │ -57#include │ │ │ │ -58// -------------------- STL │ │ │ │ -59#if defined( OM_CC_MIPS ) │ │ │ │ -60# include │ │ │ │ -61#else │ │ │ │ -62# include │ │ │ │ -63#endif │ │ │ │ -64#include │ │ │ │ -65// -------------------- OpenMesh │ │ │ │ -66 │ │ │ │ -67 │ │ │ │ -68//== NAMESPACES │ │ │ │ +57//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -69 │ │ │ │ -70namespace _O_p_e_n_M_e_s_h { │ │ │ │ -71namespace IO { │ │ │ │ -72 │ │ │ │ -73 │ │ │ │ -74// │ │ │ │ -============================================================================= │ │ │ │ +58 │ │ │ │ +59 │ │ │ │ +60namespace _O_p_e_n_M_e_s_h { │ │ │ │ +61 │ │ │ │ +62 │ │ │ │ +63//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +64 │ │ │ │ +66template │ │ │ │ +_6_7struct _F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ +68{ │ │ │ │ +69 //--- build Refs structure --- │ │ │ │ +70#ifndef DOXY_IGNORE_THIS │ │ │ │ +71 struct Refs │ │ │ │ +72 { │ │ │ │ +73 typedef typename Traits::Point Point; │ │ │ │ +74 typedef typename _v_e_c_t_o_r___t_r_a_i_t_s_<_P_o_i_n_t_>_:_:_v_a_l_u_e___t_y_p_e Scalar; │ │ │ │ 75 │ │ │ │ -76 │ │ │ │ -81 │ │ │ │ -82//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -83 │ │ │ │ -84 │ │ │ │ -_8_7short int _r_e_a_d___s_h_o_r_t(FILE* _in, bool _swap=false); │ │ │ │ -88 │ │ │ │ -_9_1int _r_e_a_d___i_n_t(FILE* _in, bool _swap=false); │ │ │ │ -92 │ │ │ │ -_9_5float _r_e_a_d___f_l_o_a_t(FILE* _in, bool _swap=false); │ │ │ │ -96 │ │ │ │ -_9_9double _r_e_a_d___d_o_u_b_l_e(FILE* _in, bool _swap=false); │ │ │ │ -100 │ │ │ │ -_1_0_3short int _r_e_a_d___s_h_o_r_t(std::istream& _in, bool _swap=false); │ │ │ │ -104 │ │ │ │ -_1_0_7int _r_e_a_d___i_n_t(std::istream& _in, bool _swap=false); │ │ │ │ +76 typedef typename Traits::Normal Normal; │ │ │ │ +77 typedef typename Traits::Color Color; │ │ │ │ +78 typedef typename Traits::TexCoord1D TexCoord1D; │ │ │ │ +79 typedef typename Traits::TexCoord2D TexCoord2D; │ │ │ │ +80 typedef typename Traits::TexCoord3D TexCoord3D; │ │ │ │ +81 typedef typename Traits::TextureIndex TextureIndex; │ │ │ │ +82 typedef _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +83 typedef _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _F_a_c_e_H_a_n_d_l_e; │ │ │ │ +84 typedef _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e _E_d_g_e_H_a_n_d_l_e; │ │ │ │ +85 typedef _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +86 }; │ │ │ │ +87#endif │ │ │ │ +88 //--- export Refs types --- │ │ │ │ +89 typedef typename Refs::Point Point; │ │ │ │ +90 typedef typename Refs::Scalar Scalar; │ │ │ │ +91 typedef typename Refs::Normal Normal; │ │ │ │ +92 typedef typename Refs::Color Color; │ │ │ │ +93 typedef typename Refs::TexCoord1D TexCoord1D; │ │ │ │ +94 typedef typename Refs::TexCoord2D TexCoord2D; │ │ │ │ +95 typedef typename Refs::TexCoord3D TexCoord3D; │ │ │ │ +96 typedef typename Refs::TextureIndex TextureIndex; │ │ │ │ +97 │ │ │ │ +98 //--- get attribute bits from Traits --- │ │ │ │ +99 enum Attribs │ │ │ │ +100 { │ │ │ │ +101 VAttribs = Traits::VertexAttributes, │ │ │ │ +102 HAttribs = Traits::HalfedgeAttributes, │ │ │ │ +103 EAttribs = Traits::EdgeAttributes, │ │ │ │ +104 FAttribs = Traits::FaceAttributes │ │ │ │ +105 }; │ │ │ │ +106 //--- merge internal items with traits items --- │ │ │ │ +107 │ │ │ │ 108 │ │ │ │ -_1_1_1float _r_e_a_d___f_l_o_a_t(std::istream& _in, bool _swap=false); │ │ │ │ -112 │ │ │ │ -_1_1_5double _r_e_a_d___d_o_u_b_l_e(std::istream& _in, bool _swap=false); │ │ │ │ -116 │ │ │ │ -117 │ │ │ │ -_1_2_0void _w_r_i_t_e___s_h_o_r_t(short int _i, FILE* _out, bool _swap=false); │ │ │ │ +109/* │ │ │ │ +110 typedef typename GenProg::IF< │ │ │ │ +111 (bool)(HAttribs & Attributes::PrevHalfedge), │ │ │ │ +112 typename InternalItems::Halfedge_with_prev, │ │ │ │ +113 typename InternalItems::Halfedge_without_prev │ │ │ │ +114 >::Result InternalHalfedge; │ │ │ │ +115*/ │ │ │ │ +116 //typedef typename InternalItems::Vertex InternalVertex; │ │ │ │ +117 //typedef typename InternalItems::template Edge InternalEdge; │ │ │ │ +118 //typedef typename InternalItems::template Face InternalFace; │ │ │ │ +_1_1_9 class _I_T_r_a_i_t_s │ │ │ │ +120 {}; │ │ │ │ 121 │ │ │ │ -_1_2_4void _w_r_i_t_e___i_n_t(int _i, FILE* _out, bool _swap=false); │ │ │ │ -125 │ │ │ │ -_1_2_8void _w_r_i_t_e___f_l_o_a_t(float _f, FILE* _out, bool _swap=false); │ │ │ │ -129 │ │ │ │ -_1_3_2void _w_r_i_t_e___d_o_u_b_l_e(double _d, FILE* _out, bool _swap=false); │ │ │ │ -133 │ │ │ │ -_1_3_6void _w_r_i_t_e___s_h_o_r_t(short int _i, std::ostream& _out, bool _swap=false); │ │ │ │ -137 │ │ │ │ -_1_4_0void _w_r_i_t_e___i_n_t(int _i, std::ostream& _out, bool _swap=false); │ │ │ │ -141 │ │ │ │ -_1_4_4void _w_r_i_t_e___f_l_o_a_t(float _f, std::ostream& _out, bool _swap=false); │ │ │ │ +122 typedef typename Traits::template VertexT VertexData; │ │ │ │ +123 typedef typename Traits::template HalfedgeT HalfedgeData; │ │ │ │ +124 typedef typename Traits::template EdgeT EdgeData; │ │ │ │ +125 typedef typename Traits::template FaceT FaceData; │ │ │ │ +126}; │ │ │ │ +127 │ │ │ │ +128 │ │ │ │ +129#ifndef DOXY_IGNORE_THIS │ │ │ │ +130namespace { │ │ │ │ +131namespace TM { │ │ │ │ +132template struct TypeEquality; │ │ │ │ +133template struct TypeEquality {}; │ │ │ │ +134 │ │ │ │ +135template struct ItemsEquality { │ │ │ │ +136 TypeEquality te1; │ │ │ │ +137 TypeEquality te2; │ │ │ │ +138 TypeEquality te3; │ │ │ │ +139 TypeEquality te4; │ │ │ │ +140 TypeEquality te5; │ │ │ │ +141 TypeEquality te6; │ │ │ │ +142 TypeEquality te7; │ │ │ │ +143 TypeEquality te8; │ │ │ │ +144}; │ │ │ │ 145 │ │ │ │ -_1_4_8void _w_r_i_t_e___d_o_u_b_l_e(double _d, std::ostream& _out, bool _swap=false); │ │ │ │ +146} /* namespace TM */ │ │ │ │ +147} /* anonymous namespace */ │ │ │ │ +148#endif │ │ │ │ 149 │ │ │ │ -151 │ │ │ │ -152 │ │ │ │ -153// │ │ │ │ +_1_7_8template struct _M_e_s_h_C_a_s_t; │ │ │ │ +179 │ │ │ │ +180template │ │ │ │ +_1_8_1struct _M_e_s_h_C_a_s_t { │ │ │ │ +182 static LhsMeshT &cast(RhsMeshT &rhs) { │ │ │ │ +183 (void)sizeof(TM::ItemsEquality); │ │ │ │ +184 (void)sizeof(TM::TypeEquality); │ │ │ │ +185 return reinterpret_cast(rhs); │ │ │ │ +186 } │ │ │ │ +187}; │ │ │ │ +188 │ │ │ │ +189template │ │ │ │ +_1_9_0struct _M_e_s_h_C_a_s_t { │ │ │ │ +191 static const LhsMeshT &cast(const RhsMeshT &rhs) { │ │ │ │ +192 (void)sizeof(TM::ItemsEquality); │ │ │ │ +193 (void)sizeof(TM::TypeEquality); │ │ │ │ +194 return reinterpret_cast(rhs); │ │ │ │ +195 } │ │ │ │ +196}; │ │ │ │ +197 │ │ │ │ +198template │ │ │ │ +_1_9_9struct _M_e_s_h_C_a_s_t { │ │ │ │ +200 static LhsMeshT *cast(RhsMeshT *rhs) { │ │ │ │ +201 (void)sizeof(TM::ItemsEquality); │ │ │ │ +202 (void)sizeof(TM::TypeEquality); │ │ │ │ +203 return reinterpret_cast(rhs); │ │ │ │ +204 } │ │ │ │ +205}; │ │ │ │ +206 │ │ │ │ +207template │ │ │ │ +_2_0_8struct _M_e_s_h_C_a_s_t { │ │ │ │ +209 static const LhsMeshT *cast(const RhsMeshT *rhs) { │ │ │ │ +210 (void)sizeof(TM::ItemsEquality); │ │ │ │ +211 (void)sizeof(TM::TypeEquality); │ │ │ │ +212 return reinterpret_cast(rhs); │ │ │ │ +213 } │ │ │ │ +214}; │ │ │ │ +215 │ │ │ │ +216 │ │ │ │ +217// │ │ │ │ ============================================================================= │ │ │ │ -154} // namespace IO │ │ │ │ -155} // namespace OpenMesh │ │ │ │ -156// │ │ │ │ +218} // namespace OpenMesh │ │ │ │ +219// │ │ │ │ ============================================================================= │ │ │ │ -157#endif // OPENMESH_MESHREADER_HH defined │ │ │ │ -158// │ │ │ │ +220#endif // OPENMESH_MESH_ITEMS_HH defined │ │ │ │ +221// │ │ │ │ ============================================================================= │ │ │ │ -159 │ │ │ │ +222 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_a_d___s_h_o_r_t │ │ │ │ -short int read_short(FILE *_in, bool _swap=false) │ │ │ │ -Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_a_d___f_l_o_a_t │ │ │ │ -float read_float(FILE *_in, bool _swap=false) │ │ │ │ -Binary read a float from _is and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_w_r_i_t_e___i_n_t │ │ │ │ -void write_int(int _i, FILE *_out, bool _swap=false) │ │ │ │ -Binary write an int to _os and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_w_r_i_t_e___d_o_u_b_l_e │ │ │ │ -void write_double(double _d, FILE *_out, bool _swap=false) │ │ │ │ -Binary write a double to _os and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_w_r_i_t_e___s_h_o_r_t │ │ │ │ -void write_short(short int _i, FILE *_out, bool _swap=false) │ │ │ │ -Binary write a short to _os and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_a_d___i_n_t │ │ │ │ -int read_int(FILE *_in, bool _swap=false) │ │ │ │ -Binary read an int from _is and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_a_d___d_o_u_b_l_e │ │ │ │ -double read_double(FILE *_in, bool _swap=false) │ │ │ │ -Binary read a double from _is and perform byte swapping if _swap is true. │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_O_:_:_w_r_i_t_e___f_l_o_a_t │ │ │ │ -void write_float(float _f, FILE *_out, bool _swap=false) │ │ │ │ -Binary write a float to _os and perform byte swapping if _swap is true. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ +Definition of the mesh entities (items). │ │ │ │ +DDeeffiinniittiioonn FinalMeshItemsT.hh:68 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T_:_:_I_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn FinalMeshItemsT.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_e_s_h_C_a_s_t │ │ │ │ +Cast a mesh with different but identical traits into each other. │ │ │ │ +DDeeffiinniittiioonn FinalMeshItemsT.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +T::value_type value_type │ │ │ │ +Type of the scalar value. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00650_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/DefaultPolyMesh.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/BaseMesh.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
DefaultPolyMesh.hh
│ │ │ +
BaseMesh.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -137,40 +137,64 @@ │ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │ -
43#ifndef OPENMESH_DEFAULTPOLYMESH_HH
│ │ │ -
44#define OPENMESH_DEFAULTPOLYMESH_HH
│ │ │ -
45
│ │ │ -
46
│ │ │ -
47//== INCLUDES =================================================================
│ │ │ -
48
│ │ │ - │ │ │ -
50#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// CLASS BaseMesh
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │
51
│ │ │ -
52//== NAMESPACES ===============================================================
│ │ │ -
53
│ │ │ -
54namespace OpenMesh {
│ │ │ +
52#ifndef OPENMESH_BASEMESH_HH
│ │ │ +
53#define OPENMESH_BASEMESH_HH
│ │ │ +
54
│ │ │
55
│ │ │ -
56//== TYPEDEFS =================================================================
│ │ │ +
56//== INCLUDES =================================================================
│ │ │
57
│ │ │ -
58typedef PolyMesh_ArrayKernelT<DefaultTraitsDouble> PolyMesh;
│ │ │ -
59
│ │ │ -
60//=============================================================================
│ │ │ -
61} // namespace OpenMesh
│ │ │ -
62//=============================================================================
│ │ │ -
63
│ │ │ -
64//=============================================================================
│ │ │ -
65#endif // OPENMESH_DEFAULTPOLYMESH_HH defined
│ │ │ -
66//=============================================================================
│ │ │ +
58
│ │ │ +
59#include <OpenMesh/Core/System/config.h>
│ │ │ +
60#include <OpenMesh/Core/Mesh/IteratorsT.hh>
│ │ │ +
61#include <OpenMesh/Core/Mesh/CirculatorsT.hh>
│ │ │ + │ │ │ +
63#include <vector>
│ │ │ +
64
│ │ │ +
65
│ │ │ +
66//== NAMESPACES ===============================================================
│ │ │ +
67
│ │ │ +
68
│ │ │ +
69namespace OpenMesh {
│ │ │ +
70
│ │ │ +
71
│ │ │ +
72//== CLASS DEFINITION =========================================================
│ │ │ +
73
│ │ │ +
74
│ │ │ +
│ │ │ +
80class BaseMesh {
│ │ │ +
81public:
│ │ │ +
82 virtual ~BaseMesh(void) {;}
│ │ │ +
83};
│ │ │ +
│ │ │ +
84
│ │ │ +
85
│ │ │ +
86//=============================================================================
│ │ │ +
87} // namespace OpenMesh
│ │ │ +
88//=============================================================================
│ │ │ +
89
│ │ │ +
90//=============================================================================
│ │ │ +
91#endif // OPENMESH_BASEMESH_HH defined
│ │ │ +
92//=============================================================================
│ │ │ +
This file provides some macros containing attribute usage.
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
This file defines the default traits and some convenience macros.
│ │ │ +
Base class for all meshes.
Definition BaseMesh.hh:80
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -DefaultPolyMesh.hh │ │ │ │ +BaseMesh.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -46,47 +46,73 @@ │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ -43#ifndef OPENMESH_DEFAULTPOLYMESH_HH │ │ │ │ -44#define OPENMESH_DEFAULTPOLYMESH_HH │ │ │ │ -45 │ │ │ │ -46 │ │ │ │ -47//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -48 │ │ │ │ -49#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_T_r_a_i_t_s_._h_h> │ │ │ │ -50#include │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// CLASS BaseMesh │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ 51 │ │ │ │ -52//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -53 │ │ │ │ -54namespace _O_p_e_n_M_e_s_h { │ │ │ │ +52#ifndef OPENMESH_BASEMESH_HH │ │ │ │ +53#define OPENMESH_BASEMESH_HH │ │ │ │ +54 │ │ │ │ 55 │ │ │ │ -56//== TYPEDEFS │ │ │ │ +56//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ 57 │ │ │ │ -58typedef PolyMesh_ArrayKernelT PolyMesh; │ │ │ │ -59 │ │ │ │ -60// │ │ │ │ +58 │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_A_t_t_r_i_b_u_t_e_s_._h_h> │ │ │ │ +63#include │ │ │ │ +64 │ │ │ │ +65 │ │ │ │ +66//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +67 │ │ │ │ +68 │ │ │ │ +69namespace _O_p_e_n_M_e_s_h { │ │ │ │ +70 │ │ │ │ +71 │ │ │ │ +72//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +73 │ │ │ │ +74 │ │ │ │ +_8_0class _B_a_s_e_M_e_s_h { │ │ │ │ +81public: │ │ │ │ +82 virtual _~_B_a_s_e_M_e_s_h(void) {;} │ │ │ │ +83}; │ │ │ │ +84 │ │ │ │ +85 │ │ │ │ +86// │ │ │ │ ============================================================================= │ │ │ │ -61} // namespace OpenMesh │ │ │ │ -62// │ │ │ │ +87} // namespace OpenMesh │ │ │ │ +88// │ │ │ │ ============================================================================= │ │ │ │ -63 │ │ │ │ -64// │ │ │ │ +89 │ │ │ │ +90// │ │ │ │ ============================================================================= │ │ │ │ -65#endif // OPENMESH_DEFAULTPOLYMESH_HH defined │ │ │ │ -66// │ │ │ │ +91#endif // OPENMESH_BASEMESH_HH defined │ │ │ │ +92// │ │ │ │ ============================================================================= │ │ │ │ +_A_t_t_r_i_b_u_t_e_s_._h_h │ │ │ │ +This file provides some macros containing attribute usage. │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_T_r_a_i_t_s_._h_h │ │ │ │ -This file defines the default traits and some convenience macros. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_M_e_s_h │ │ │ │ +Base class for all meshes. │ │ │ │ +DDeeffiinniittiioonn BaseMesh.hh:80 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00653_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/Tags.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/DefaultTriMesh.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
Tags.hh
│ │ │ +
DefaultTriMesh.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,26 +136,41 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42#pragma once
│ │ │ -
43
│ │ │ -
44namespace OpenMesh {
│ │ │ +
42
│ │ │ +
43#ifndef OPENMESH_DEFAULTTRIMESH_HH
│ │ │ +
44#define OPENMESH_DEFAULTTRIMESH_HH
│ │ │
45
│ │ │ - │ │ │ - │ │ │ -
50
│ │ │ -
51} // namespace OpenMesh
│ │ │ -
52
│ │ │ +
46
│ │ │ +
47//== INCLUDES =================================================================
│ │ │ +
48
│ │ │ + │ │ │ +
50#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ +
51
│ │ │ +
52//== NAMESPACES ===============================================================
│ │ │ +
53
│ │ │ +
54namespace OpenMesh {
│ │ │ +
55
│ │ │ +
56//== TYPEDEFS =================================================================
│ │ │ +
57
│ │ │ +
58typedef TriMesh_ArrayKernelT<DefaultTraitsDouble> TriMesh;
│ │ │ +
59
│ │ │ +
60//=============================================================================
│ │ │ +
61} // namespace OpenMesh
│ │ │ +
62//=============================================================================
│ │ │ +
63
│ │ │ +
64//=============================================================================
│ │ │ +
65#endif // OPENMESH_DEFAULTTRIMESH_HH defined
│ │ │ +
66//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Connectivity tag indicating that the tagged mesh has polygon connectivity.
Definition Tags.hh:47
│ │ │ -
Connectivity tag indicating that the tagged mesh has triangle connectivity.
Definition Tags.hh:49
│ │ │ +
This file defines the default traits and some convenience macros.
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -Tags.hh │ │ │ │ +DefaultTriMesh.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,29 +45,48 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42#pragma once │ │ │ │ -43 │ │ │ │ -44namespace _O_p_e_n_M_e_s_h { │ │ │ │ +42 │ │ │ │ +43#ifndef OPENMESH_DEFAULTTRIMESH_HH │ │ │ │ +44#define OPENMESH_DEFAULTTRIMESH_HH │ │ │ │ 45 │ │ │ │ -_4_7struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g {}; │ │ │ │ -_4_9struct _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g {}; │ │ │ │ -50 │ │ │ │ -51} // namespace OpenMesh │ │ │ │ -52 │ │ │ │ +46 │ │ │ │ +47//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +48 │ │ │ │ +49#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_T_r_a_i_t_s_._h_h> │ │ │ │ +50#include │ │ │ │ +51 │ │ │ │ +52//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +53 │ │ │ │ +54namespace _O_p_e_n_M_e_s_h { │ │ │ │ +55 │ │ │ │ +56//== TYPEDEFS │ │ │ │ +================================================================= │ │ │ │ +57 │ │ │ │ +58typedef TriMesh_ArrayKernelT TriMesh; │ │ │ │ +59 │ │ │ │ +60// │ │ │ │ +============================================================================= │ │ │ │ +61} // namespace OpenMesh │ │ │ │ +62// │ │ │ │ +============================================================================= │ │ │ │ +63 │ │ │ │ +64// │ │ │ │ +============================================================================= │ │ │ │ +65#endif // OPENMESH_DEFAULTTRIMESH_HH defined │ │ │ │ +66// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g │ │ │ │ -Connectivity tag indicating that the tagged mesh has polygon connectivity. │ │ │ │ -DDeeffiinniittiioonn Tags.hh:47 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g │ │ │ │ -Connectivity tag indicating that the tagged mesh has triangle connectivity. │ │ │ │ -DDeeffiinniittiioonn Tags.hh:49 │ │ │ │ +_T_r_a_i_t_s_._h_h │ │ │ │ +This file defines the default traits and some convenience macros. │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00656_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/TriConnectivity.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/PolyMeshT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
TriConnectivity.hh
│ │ │ +
PolyMeshT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,121 +138,595 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44#ifndef OPENMESH_TRICONNECTIVITY_HH
│ │ │ -
45#define OPENMESH_TRICONNECTIVITY_HH
│ │ │ -
46
│ │ │ -
47#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ -
48
│ │ │ -
49namespace OpenMesh {
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// CLASS PolyMeshT
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │
50
│ │ │ -
│ │ │ -
53class OPENMESHDLLEXPORT TriConnectivity : public PolyConnectivity
│ │ │ -
54{
│ │ │ -
55public:
│ │ │ -
56
│ │ │ - │ │ │ -
58 virtual ~TriConnectivity() {}
│ │ │ -
59
│ │ │ -
60 inline static bool is_triangles()
│ │ │ -
61 { return true; }
│ │ │ -
62
│ │ │ -
│ │ │ -
66 inline void assign_connectivity(const TriConnectivity& _other)
│ │ │ -
67 { PolyConnectivity::assign_connectivity(_other); }
│ │ │ -
│ │ │ -
68
│ │ │ -
69 inline void assign_connectivity(const PolyConnectivity& _other)
│ │ │ -
70 {
│ │ │ -
71 PolyConnectivity::assign_connectivity(_other);
│ │ │ -
72 triangulate();
│ │ │ -
73 }
│ │ │ -
74
│ │ │ -
79
│ │ │ -
88 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);
│ │ │ -
89
│ │ │ -
98 SmartFaceHandle add_face(const std::vector<VertexHandle>& _vhandles);
│ │ │ +
51
│ │ │ +
52#ifndef OPENMESH_POLYMESHT_HH
│ │ │ +
53#define OPENMESH_POLYMESHT_HH
│ │ │ +
54
│ │ │ +
55
│ │ │ +
56//== INCLUDES =================================================================
│ │ │ +
57
│ │ │ +
58
│ │ │ +
59#include <OpenMesh/Core/System/config.h>
│ │ │ +
60#include <OpenMesh/Core/Geometry/MathDefs.hh>
│ │ │ +
61#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
62#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>
│ │ │ +
63#include <OpenMesh/Core/Mesh/Tags.hh>
│ │ │ +
64#include <vector>
│ │ │ +
65
│ │ │ +
66
│ │ │ +
67//== NAMESPACES ===============================================================
│ │ │ +
68
│ │ │ +
69
│ │ │ +
70namespace OpenMesh {
│ │ │ +
71
│ │ │ +
72//== CLASS DEFINITION =========================================================
│ │ │ +
73
│ │ │ +
74
│ │ │ +
89template <class Kernel>
│ │ │ +
│ │ │ +
90class PolyMeshT : public Kernel
│ │ │ +
91{
│ │ │ +
92public:
│ │ │ +
93
│ │ │ + │ │ │ +
96 //--- item types ---
│ │ │ +
97
│ │ │
99
│ │ │ -
108 SmartFaceHandle add_face(const std::vector<SmartVertexHandle>& _vhandles);
│ │ │ +
100 static constexpr bool is_polymesh() { return true; }
│ │ │ +
101 static constexpr bool is_trimesh() { return false; }
│ │ │ +
102 using ConnectivityTag = PolyConnectivityTag;
│ │ │ +
103 enum { IsPolyMesh = 1 };
│ │ │ +
104 enum { IsTriMesh = 0 };
│ │ │ +
106
│ │ │ +
108
│ │ │
109
│ │ │ -
120 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);
│ │ │ -
121
│ │ │ -
123
│ │ │ -
│ │ │ - │ │ │ -
128 {
│ │ │ -
129 return is_boundary(_heh) ? InvalidVertexHandle :
│ │ │ -
130 to_vertex_handle(next_halfedge_handle(_heh));
│ │ │ -
131 }
│ │ │ -
│ │ │ +
110 typedef typename Kernel::Scalar Scalar;
│ │ │ +
112 typedef typename Kernel::Point Point;
│ │ │ +
114 typedef typename Kernel::Normal Normal;
│ │ │ +
116 typedef typename Kernel::Color Color;
│ │ │ +
118 typedef typename Kernel::TexCoord1D TexCoord1D;
│ │ │ +
120 typedef typename Kernel::TexCoord2D TexCoord2D;
│ │ │ +
122 typedef typename Kernel::TexCoord3D TexCoord3D;
│ │ │ +
124 typedef typename Kernel::Vertex Vertex;
│ │ │ +
126 typedef typename Kernel::Halfedge Halfedge;
│ │ │ +
128 typedef typename Kernel::Edge Edge;
│ │ │ +
130 typedef typename Kernel::Face Face;
│ │ │
132
│ │ │ -
│ │ │ - │ │ │ -
137 { return opposite_vh(opposite_halfedge_handle(_heh)); }
│ │ │ -
│ │ │ -
138
│ │ │ +
133 //--- handle types ---
│ │ │ +
134
│ │ │ +
136 typedef typename Kernel::VertexHandle VertexHandle;
│ │ │ +
137 typedef typename Kernel::HalfedgeHandle HalfedgeHandle;
│ │ │ +
138 typedef typename Kernel::EdgeHandle EdgeHandle;
│ │ │ +
139 typedef typename Kernel::FaceHandle FaceHandle;
│ │ │ +
140
│ │ │ +
141
│ │ │
142
│ │ │ -
143
│ │ │ -
148 bool is_collapse_ok(HalfedgeHandle _heh);
│ │ │ -
149
│ │ │ -
151 HalfedgeHandle vertex_split(VertexHandle v0, VertexHandle v1,
│ │ │ - │ │ │ +
143 typedef typename Kernel::VertexIter VertexIter;
│ │ │ +
144 typedef typename Kernel::HalfedgeIter HalfedgeIter;
│ │ │ +
145 typedef typename Kernel::EdgeIter EdgeIter;
│ │ │ +
146 typedef typename Kernel::FaceIter FaceIter;
│ │ │ +
147
│ │ │ +
148 typedef typename Kernel::ConstVertexIter ConstVertexIter;
│ │ │ +
149 typedef typename Kernel::ConstHalfedgeIter ConstHalfedgeIter;
│ │ │ +
150 typedef typename Kernel::ConstEdgeIter ConstEdgeIter;
│ │ │ +
151 typedef typename Kernel::ConstFaceIter ConstFaceIter;
│ │ │
153
│ │ │ -
155 bool is_flip_ok(EdgeHandle _eh) const;
│ │ │ -
156
│ │ │ -
159 void flip(EdgeHandle _eh);
│ │ │ -
160
│ │ │ -
161
│ │ │ -
173 void split(EdgeHandle _eh, VertexHandle _vh);
│ │ │ -
174
│ │ │ -
190 inline void split_edge(EdgeHandle _eh, VertexHandle _vh) { TriConnectivity::split(_eh, _vh); }
│ │ │ -
191
│ │ │ -
204 void split_copy(EdgeHandle _eh, VertexHandle _vh);
│ │ │ -
205
│ │ │ -
222 inline void split_edge_copy(EdgeHandle _eh, VertexHandle _vh) { TriConnectivity::split_copy(_eh, _vh); }
│ │ │ -
223
│ │ │ -
│ │ │ -
229 inline void split(FaceHandle _fh, VertexHandle _vh)
│ │ │ -
230 { PolyConnectivity::split(_fh, _vh); }
│ │ │ -
│ │ │ -
231
│ │ │ -
│ │ │ -
237 inline void split_copy(FaceHandle _fh, VertexHandle _vh)
│ │ │ -
238 { PolyConnectivity::split_copy(_fh, _vh); }
│ │ │ -
│ │ │ -
239
│ │ │ -
241
│ │ │ -
242private:
│ │ │ -
244 HalfedgeHandle insert_loop(HalfedgeHandle _hh);
│ │ │ -
246 HalfedgeHandle insert_edge(VertexHandle _vh,
│ │ │ - │ │ │ -
248};
│ │ │ -
│ │ │ -
249
│ │ │ -
250}
│ │ │ -
251
│ │ │ -
252#endif//OPENMESH_TRICONNECTIVITY_HH
│ │ │ +
154 //--- circulators ---
│ │ │ +
155
│ │ │ +
162 typedef typename Kernel::VertexVertexIter VertexVertexIter;
│ │ │ +
163 typedef typename Kernel::VertexOHalfedgeIter VertexOHalfedgeIter;
│ │ │ +
164 typedef typename Kernel::VertexIHalfedgeIter VertexIHalfedgeIter;
│ │ │ +
165 typedef typename Kernel::VertexEdgeIter VertexEdgeIter;
│ │ │ +
166 typedef typename Kernel::VertexFaceIter VertexFaceIter;
│ │ │ +
167 typedef typename Kernel::FaceVertexIter FaceVertexIter;
│ │ │ +
168 typedef typename Kernel::FaceHalfedgeIter FaceHalfedgeIter;
│ │ │ +
169 typedef typename Kernel::FaceEdgeIter FaceEdgeIter;
│ │ │ +
170 typedef typename Kernel::FaceFaceIter FaceFaceIter;
│ │ │ +
171
│ │ │ +
172 typedef typename Kernel::ConstVertexVertexIter ConstVertexVertexIter;
│ │ │ +
173 typedef typename Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter;
│ │ │ +
174 typedef typename Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter;
│ │ │ +
175 typedef typename Kernel::ConstVertexEdgeIter ConstVertexEdgeIter;
│ │ │ +
176 typedef typename Kernel::ConstVertexFaceIter ConstVertexFaceIter;
│ │ │ +
177 typedef typename Kernel::ConstFaceVertexIter ConstFaceVertexIter;
│ │ │ +
178 typedef typename Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter;
│ │ │ +
179 typedef typename Kernel::ConstFaceEdgeIter ConstFaceEdgeIter;
│ │ │ +
180 typedef typename Kernel::ConstFaceFaceIter ConstFaceFaceIter;
│ │ │ +
182
│ │ │ +
183
│ │ │ +
184 // --- constructor/destructor
│ │ │ + │ │ │ +
186 template<typename T>
│ │ │ +
187 explicit PolyMeshT(const T& t) : Kernel(t) {}
│ │ │ +
188 virtual ~PolyMeshT() {}
│ │ │ +
189
│ │ │ +
194 // --- creation ---
│ │ │ +
195
│ │ │ +
│ │ │ + │ │ │ +
202 { return make_smart(Kernel::new_vertex(), this); }
│ │ │ +
│ │ │ +
203
│ │ │ +
│ │ │ + │ │ │ +
211 {
│ │ │ +
212 VertexHandle vh(Kernel::new_vertex());
│ │ │ +
213 this->set_point(vh, _p);
│ │ │ +
214 return make_smart(vh, this);
│ │ │ +
215 }
│ │ │ +
│ │ │ +
216
│ │ │ +
│ │ │ + │ │ │ +
229 {
│ │ │ +
230 VertexHandle vh(Kernel::new_vertex_dirty());
│ │ │ +
231 this->set_point(vh, _p);
│ │ │ +
232 return make_smart(vh, this);
│ │ │ +
233 }
│ │ │ +
│ │ │ +
234
│ │ │ +
│ │ │ + │ │ │ +
239 { return new_vertex(_p); }
│ │ │ +
│ │ │ +
240
│ │ │ +
│ │ │ + │ │ │ +
243 { return make_smart(new_vertex_dirty(_p), this); }
│ │ │ +
│ │ │ +
244
│ │ │ +
245 // --- normal vectors ---
│ │ │ +
246
│ │ │ +
250
│ │ │ +
258 void update_normals();
│ │ │ +
259
│ │ │ +
│ │ │ + │ │ │ +
262 { this->set_normal(_fh, calc_face_normal(_fh)); }
│ │ │ +
│ │ │ +
263
│ │ │ +
269 void update_face_normals();
│ │ │ +
270
│ │ │ +
272 virtual Normal calc_face_normal(FaceHandle _fh) const;
│ │ │ +
273
│ │ │ +
275 Normal calc_face_normal(const Point& _p0, const Point& _p1,
│ │ │ +
276 const Point& _p2) const;
│ │ │ +
277
│ │ │ +
279 Normal calc_normal(FaceHandle _fh) const;
│ │ │ +
280
│ │ │ +
│ │ │ +
282 void calc_face_centroid(FaceHandle _fh, Point& _pt) const {
│ │ │ +
283 _pt = calc_face_centroid(_fh);
│ │ │ +
284 }
│ │ │ +
│ │ │ +
285
│ │ │ + │ │ │ +
288
│ │ │ +
290 Point calc_centroid(FaceHandle _fh) const;
│ │ │ +
291
│ │ │ +
293 Point calc_centroid(EdgeHandle _eh) const;
│ │ │ +
294
│ │ │ + │ │ │ +
297
│ │ │ + │ │ │ +
300
│ │ │ +
302 Point calc_centroid(MeshHandle _mh) const;
│ │ │ +
303
│ │ │ +
│ │ │ +
305 void update_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8)
│ │ │ +
306 { this->set_normal(_heh, calc_halfedge_normal(_heh,_feature_angle)); }
│ │ │ +
│ │ │ +
307
│ │ │ +
317 void update_halfedge_normals(const double _feature_angle = 0.8);
│ │ │ +
318
│ │ │ +
331 virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) const;
│ │ │ +
332
│ │ │ +
334 Normal calc_normal(HalfedgeHandle, const double _feature_angle = 0.8) const;
│ │ │ +
335
│ │ │ +
338 bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const;
│ │ │ +
339
│ │ │ +
│ │ │ + │ │ │ +
342 { this->set_normal(_vh, calc_vertex_normal(_vh)); }
│ │ │ +
│ │ │ +
343
│ │ │ + │ │ │ +
354
│ │ │ + │ │ │ +
368
│ │ │ +
376 void calc_vertex_normal_fast(VertexHandle _vh, Normal& _n) const;
│ │ │ + │ │ │ +
378 void calc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const;
│ │ │ +
379
│ │ │ + │ │ │ +
382
│ │ │ +
384
│ │ │ +
385 // --- Geometry API - still in development ---
│ │ │ +
386
│ │ │ +
│ │ │ +
389 void calc_edge_vector(EdgeHandle _eh, Normal& _edge_vec) const
│ │ │ +
390 {
│ │ │ +
391 _edge_vec = calc_edge_vector(_eh);
│ │ │ +
392 }
│ │ │ +
│ │ │ +
393
│ │ │ +
│ │ │ + │ │ │ +
397 {
│ │ │ +
398 return calc_edge_vector(this->halfedge_handle(_eh,0));
│ │ │ +
399 }
│ │ │ +
│ │ │ +
400
│ │ │ +
│ │ │ +
403 void calc_edge_vector(HalfedgeHandle _heh, Normal& _edge_vec) const
│ │ │ +
404 {
│ │ │ +
405 _edge_vec = calc_edge_vector(_heh);
│ │ │ +
406 }
│ │ │ +
│ │ │ +
407
│ │ │ +
│ │ │ + │ │ │ +
411 {
│ │ │ +
412 return this->point(this->to_vertex_handle(_heh)) -
│ │ │ +
413 this->point(this->from_vertex_handle(_heh));
│ │ │ +
414 }
│ │ │ +
│ │ │ +
415
│ │ │ +
416 // Calculates the length of the edge _eh
│ │ │ +
│ │ │ + │ │ │ +
418 { return calc_edge_length(this->halfedge_handle(_eh,0)); }
│ │ │ +
│ │ │ +
419
│ │ │ +
│ │ │ + │ │ │ +
423 { return (Scalar)sqrt(calc_edge_sqr_length(_heh)); }
│ │ │ +
│ │ │ +
424
│ │ │ +
│ │ │ + │ │ │ +
426 { return calc_edge_sqr_length(this->halfedge_handle(_eh,0)); }
│ │ │ +
│ │ │ +
427
│ │ │ +
│ │ │ + │ │ │ +
429 {
│ │ │ +
430 Normal edge_vec;
│ │ │ +
431 calc_edge_vector(_heh, edge_vec);
│ │ │ +
432 return sqrnorm(edge_vec);
│ │ │ +
433 }
│ │ │ +
│ │ │ +
434
│ │ │ +
│ │ │ + │ │ │ +
438 {
│ │ │ +
439 VertexHandle vh0 = this->from_vertex_handle(_heh);
│ │ │ +
440 VertexHandle vh1 = this->to_vertex_handle(_heh);
│ │ │ +
441 return 0.5 * (this->point(vh0) + this->point(vh1));
│ │ │ +
442 }
│ │ │ +
│ │ │ +
443
│ │ │ +
│ │ │ + │ │ │ +
447 {
│ │ │ +
448 return calc_edge_midpoint(this->halfedge_handle(_eh, 0));
│ │ │ +
449 }
│ │ │ +
│ │ │ +
450
│ │ │ +
452 Normal calc_normal(EdgeHandle _eh) const;
│ │ │ +
453
│ │ │ +
│ │ │ +
458 void calc_sector_vectors(HalfedgeHandle _in_heh, Normal& _vec0, Normal& _vec1) const
│ │ │ +
459 {
│ │ │ +
460 calc_edge_vector(this->next_halfedge_handle(_in_heh), _vec0);//p2 - p1
│ │ │ +
461 calc_edge_vector(this->opposite_halfedge_handle(_in_heh), _vec1);//p0 - p1
│ │ │ +
462 }
│ │ │ +
│ │ │ +
463
│ │ │ +
│ │ │ + │ │ │ +
470 {
│ │ │ +
471 Normal v0, v1;
│ │ │ +
472 calc_sector_vectors(_in_heh, v0, v1);
│ │ │ +
473 Scalar denom = norm(v0)*norm(v1);
│ │ │ +
474 if ( denom == Scalar(0))
│ │ │ +
475 {
│ │ │ +
476 return 0;
│ │ │ +
477 }
│ │ │ +
478 Scalar cos_a = dot(v0 , v1) / denom;
│ │ │ +
479 if (this->is_boundary(_in_heh))
│ │ │ +
480 {//determine if the boundary sector is concave or convex
│ │ │ +
481 FaceHandle fh(this->face_handle(this->opposite_halfedge_handle(_in_heh)));
│ │ │ +
482 Normal f_n(calc_face_normal(fh));//this normal is (for convex fh) OK
│ │ │ +
483 Scalar sign_a = dot(cross(v0, v1), f_n);
│ │ │ +
484 return angle(cos_a, sign_a);
│ │ │ +
485 }
│ │ │ +
486 else
│ │ │ +
487 {
│ │ │ +
488 return acos(sane_aarg(cos_a));
│ │ │ +
489 }
│ │ │ +
490 }
│ │ │ +
│ │ │ +
491
│ │ │ +
492 // calculate the cos and the sin of angle <(_in_heh,next_halfedge(_in_heh))
│ │ │ +
493 /*
│ │ │ +
494 void calc_sector_angle_cos_sin(HalfedgeHandle _in_heh, Scalar& _cos_a, Scalar& _sin_a) const
│ │ │ +
495 {
│ │ │ +
496 Normal in_vec, out_vec;
│ │ │ +
497 calc_edge_vector(_in_heh, in_vec);
│ │ │ +
498 calc_edge_vector(next_halfedge_handle(_in_heh), out_vec);
│ │ │ +
499 Scalar denom = norm(in_vec)*norm(out_vec);
│ │ │ +
500 if (is_zero(denom))
│ │ │ +
501 {
│ │ │ +
502 _cos_a = 1;
│ │ │ +
503 _sin_a = 0;
│ │ │ +
504 }
│ │ │ +
505 else
│ │ │ +
506 {
│ │ │ +
507 _cos_a = dot(in_vec, out_vec)/denom;
│ │ │ +
508 _sin_a = norm(cross(in_vec, out_vec))/denom;
│ │ │ +
509 }
│ │ │ +
510 }
│ │ │ +
511 */
│ │ │ +
│ │ │ +
514 void calc_sector_normal(HalfedgeHandle _in_heh, Normal& _sector_normal) const
│ │ │ +
515 {
│ │ │ +
516 Normal vec0, vec1;
│ │ │ +
517 calc_sector_vectors(_in_heh, vec0, vec1);
│ │ │ +
518 _sector_normal = cross(vec0, vec1);//(p2-p1)^(p0-p1)
│ │ │ +
519 }
│ │ │ +
│ │ │ +
520
│ │ │ +
│ │ │ + │ │ │ +
525 {
│ │ │ +
526 Normal sector_normal;
│ │ │ +
527 calc_sector_normal(_in_heh, sector_normal);
│ │ │ +
528 return norm(sector_normal)/2;
│ │ │ +
529 }
│ │ │ +
│ │ │ +
530
│ │ │ +
│ │ │ + │ │ │ +
534 {
│ │ │ +
535 // Make sure that we have face normals on the mesh
│ │ │ +
536 assert(Kernel::has_face_normals());
│ │ │ +
537
│ │ │ +
538 if (this->is_boundary(this->edge_handle(_heh)))
│ │ │ +
539 {//the dihedral angle at a boundary edge is 0
│ │ │ +
540 return 0;
│ │ │ +
541 }
│ │ │ +
542 const Normal& n0 = this->normal(this->face_handle(_heh));
│ │ │ +
543 const Normal& n1 = this->normal(this->face_handle(this->opposite_halfedge_handle(_heh)));
│ │ │ +
544 Normal he;
│ │ │ +
545 calc_edge_vector(_heh, he);
│ │ │ +
546 Scalar da_cos = dot(n0, n1);
│ │ │ +
547 //should be normalized, but we need only the sign
│ │ │ +
548 Scalar da_sin_sign = dot(cross(n0, n1), he);
│ │ │ +
549 return angle(da_cos, da_sin_sign);
│ │ │ +
550 }
│ │ │ +
│ │ │ +
551
│ │ │ +
│ │ │ + │ │ │ +
555 { return calc_dihedral_angle_fast(this->halfedge_handle(_eh,0)); }
│ │ │ +
│ │ │ +
556
│ │ │ +
557 // calculates the dihedral angle on the halfedge _heh
│ │ │ +
│ │ │ + │ │ │ +
559 {
│ │ │ +
560 if (this->is_boundary(this->edge_handle(_heh)))
│ │ │ +
561 {//the dihedral angle at a boundary edge is 0
│ │ │ +
562 return 0;
│ │ │ +
563 }
│ │ │ +
564 Normal n0, n1, he;
│ │ │ +
565 calc_sector_normal(_heh, n0);
│ │ │ +
566 calc_sector_normal(this->opposite_halfedge_handle(_heh), n1);
│ │ │ +
567 calc_edge_vector(_heh, he);
│ │ │ +
568 Scalar denom = norm(n0)*norm(n1);
│ │ │ +
569 if (denom == Scalar(0))
│ │ │ +
570 {
│ │ │ +
571 return 0;
│ │ │ +
572 }
│ │ │ +
573 Scalar da_cos = dot(n0, n1)/denom;
│ │ │ +
574 //should be normalized, but we need only the sign
│ │ │ +
575 Scalar da_sin_sign = dot(cross(n0, n1), he);
│ │ │ +
576 return angle(da_cos, da_sin_sign);
│ │ │ +
577 }
│ │ │ +
│ │ │ +
578
│ │ │ +
579 // calculates the dihedral angle on the edge _eh
│ │ │ +
│ │ │ + │ │ │ +
581 { return calc_dihedral_angle(this->halfedge_handle(_eh,0)); }
│ │ │ +
│ │ │ +
582
│ │ │ +
585 unsigned int find_feature_edges(Scalar _angle_tresh = OpenMesh::deg_to_rad(44.0));
│ │ │ +
586 // --- misc ---
│ │ │ +
587
│ │ │ +
│ │ │ +
589 inline void split(FaceHandle _fh, const Point& _p)
│ │ │ +
590 { Kernel::split(_fh, add_vertex(_p)); }
│ │ │ +
│ │ │ +
591
│ │ │ +
│ │ │ +
592 inline void split(FaceHandle _fh, VertexHandle _vh)
│ │ │ +
593 { Kernel::split(_fh, _vh); }
│ │ │ +
│ │ │ +
594
│ │ │ +
│ │ │ +
595 inline void split(EdgeHandle _eh, const Point& _p)
│ │ │ +
596 { Kernel::split_edge(_eh, add_vertex(_p)); }
│ │ │ +
│ │ │ +
597
│ │ │ +
│ │ │ +
598 inline void split(EdgeHandle _eh, VertexHandle _vh)
│ │ │ +
599 { Kernel::split_edge(_eh, _vh); }
│ │ │ +
│ │ │ +
600
│ │ │ +
601private:
│ │ │ +
602 struct PointIs3DTag {};
│ │ │ +
603 struct PointIsNot3DTag {};
│ │ │ +
604 Normal calc_face_normal_impl(FaceHandle, PointIs3DTag) const;
│ │ │ +
605 Normal calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const;
│ │ │ +
606 Normal calc_face_normal_impl(const Point&, const Point&, const Point&, PointIs3DTag) const;
│ │ │ +
607 Normal calc_face_normal_impl(const Point&, const Point&, const Point&, PointIsNot3DTag) const;
│ │ │ +
608};
│ │ │ +
│ │ │ +
609
│ │ │ +
635template<typename LHS, typename KERNEL>
│ │ │ +
│ │ │ + │ │ │ +
637 return MeshCast<LHS, PolyMeshT<KERNEL>&>::cast(rhs);
│ │ │ +
638}
│ │ │ +
│ │ │ +
639
│ │ │ +
640template<typename LHS, typename KERNEL>
│ │ │ +
641LHS mesh_cast(PolyMeshT<KERNEL> *rhs) {
│ │ │ +
642 return MeshCast<LHS, PolyMeshT<KERNEL>*>::cast(rhs);
│ │ │ +
643}
│ │ │ +
644
│ │ │ +
645template<typename LHS, typename KERNEL>
│ │ │ +
646const LHS mesh_cast(const PolyMeshT<KERNEL> &rhs) {
│ │ │ +
647 return MeshCast<LHS, const PolyMeshT<KERNEL>&>::cast(rhs);
│ │ │ +
648}
│ │ │ +
649
│ │ │ +
650template<typename LHS, typename KERNEL>
│ │ │ +
651const LHS mesh_cast(const PolyMeshT<KERNEL> *rhs) {
│ │ │ +
652 return MeshCast<LHS, const PolyMeshT<KERNEL>*>::cast(rhs);
│ │ │ +
653}
│ │ │ +
654
│ │ │ +
655//=============================================================================
│ │ │ +
656} // namespace OpenMesh
│ │ │ +
657//=============================================================================
│ │ │ +
658#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C)
│ │ │ +
659# define OPENMESH_POLYMESH_TEMPLATES
│ │ │ +
660# include "PolyMeshT_impl.hh"
│ │ │ +
661#endif
│ │ │ +
662//=============================================================================
│ │ │ +
663#endif // OPENMESH_POLYMESHT_HH defined
│ │ │ +
664//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ +
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ +
T angle(T _cos_angle, T _sin_angle)
returns the angle determined by its cos and the sign of its sin result is positive if the angle is in...
Definition MathDefs.hh:140
│ │ │ +
LHS mesh_cast(PolyMeshT< KERNEL > &rhs)
Cast a mesh with different but identical traits into each other.
Definition PolyMeshT.hh:636
│ │ │ +
T sane_aarg(T _aarg)
Trigonometry/angles - related.
Definition MathDefs.hh:122
│ │ │ +
Cast a mesh with different but identical traits into each other.
Definition FinalMeshItemsT.hh:178
│ │ │
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │
Handle for a edge entity.
Definition Handles.hh:135
│ │ │
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ -
Connectivity Class for Triangle Meshes.
Definition TriConnectivity.hh:54
│ │ │ -
void split_edge(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriConnectivity.hh:190
│ │ │ -
void split_copy(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3) split, calls corresponding PolyMeshT function).
Definition TriConnectivity.hh:237
│ │ │ -
void split_edge_copy(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriConnectivity.hh:222
│ │ │ -
VertexHandle opposite_he_opposite_vh(HalfedgeHandle _heh) const
Returns the opposite vertex to the opposite halfedge of _heh in the face referenced by it returns Inv...
Definition TriConnectivity.hh:136
│ │ │ -
VertexHandle opposite_vh(HalfedgeHandle _heh) const
Returns the opposite vertex to the halfedge _heh in the face referenced by _heh returns InvalidVertex...
Definition TriConnectivity.hh:127
│ │ │ -
void split(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3) split, calls corresponding PolyMeshT function).
Definition TriConnectivity.hh:229
│ │ │ -
void assign_connectivity(const TriConnectivity &_other)
assign_connectivity() methods.
Definition TriConnectivity.hh:66
│ │ │ +
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │ +
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ +
Kernel::Vertex Vertex
Vertex type.
Definition PolyMeshT.hh:124
│ │ │ +
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition PolyMeshT.hh:169
│ │ │ +
void calc_face_centroid(FaceHandle _fh, Point &_pt) const
calculates the average of the vertices defining _fh
Definition PolyMeshT.hh:282
│ │ │ +
Kernel::ConstFaceIter ConstFaceIter
Scalar type.
Definition PolyMeshT.hh:151
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ +
Kernel::ConstVertexVertexIter ConstVertexVertexIter
Circulator.
Definition PolyMeshT.hh:172
│ │ │ +
void calc_edge_vector(HalfedgeHandle _heh, Normal &_edge_vec) const
Calculates the edge vector as the difference of the the points defined by to_vertex_handle() and from...
Definition PolyMeshT.hh:403
│ │ │ +
SmartVertexHandle new_vertex(const Point _p)
Adds a new vertex initialized to a custom position.
Definition PolyMeshT.hh:210
│ │ │ +
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:178
│ │ │ +
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ +
Kernel::VertexFaceIter VertexFaceIter
Circulator.
Definition PolyMeshT.hh:166
│ │ │ +
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition PolyMeshT.hh:177
│ │ │ +
Kernel::Halfedge Halfedge
Halfedge type.
Definition PolyMeshT.hh:126
│ │ │ +
void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const
Different methods for calculation of the normal at _vh:
Definition PolyMeshT_impl.hh:497
│ │ │ +
void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:507
│ │ │ +
PolyMeshT()
Circulator.
Definition PolyMeshT.hh:185
│ │ │ +
Scalar calc_dihedral_angle(EdgeHandle _eh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:580
│ │ │ +
static constexpr bool is_polymesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition PolyMeshT.hh:100
│ │ │ +
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │ +
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ +
Kernel::FaceVertexIter FaceVertexIter
Circulator.
Definition PolyMeshT.hh:167
│ │ │ +
Point calc_edge_midpoint(EdgeHandle _eh) const
Calculates the midpoint of the edge _eh, defined by the positions of the two incident vertices.
Definition PolyMeshT.hh:446
│ │ │ +
SmartVertexHandle new_vertex()
Uses default copy and assignment operator.
Definition PolyMeshT.hh:201
│ │ │ +
Kernel::VertexIHalfedgeIter VertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:164
│ │ │ +
void split(FaceHandle _fh, VertexHandle _vh)
Compute normals for all primitives.
Definition PolyMeshT.hh:592
│ │ │ +
PolyMeshT(const T &t)
Circulator.
Definition PolyMeshT.hh:187
│ │ │ +
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition PolyMeshT.hh:120
│ │ │ +
Scalar calc_sector_area(HalfedgeHandle _in_heh) const
calculates the area of the face sector defined by the angle <(_in_heh,next_halfedge(_in_heh)) NOTE: s...
Definition PolyMeshT.hh:524
│ │ │ +
void update_face_normals()
Update normal vectors for all faces.
Definition PolyMeshT_impl.hh:335
│ │ │ +
void update_halfedge_normals(const double _feature_angle=0.8)
Update normal vectors for all halfedges.
Definition PolyMeshT_impl.hh:350
│ │ │ +
unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0))
tags an edge as a feature if its dihedral angle is larger than _angle_tresh returns the number of the...
Definition PolyMeshT_impl.hh:74
│ │ │ +
virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) const
Calculate halfedge normal for one specific halfedge.
Definition PolyMeshT_impl.hh:365
│ │ │ +
Scalar calc_sector_angle(HalfedgeHandle _in_heh) const
calculates the sector angle.
Definition PolyMeshT.hh:469
│ │ │ +
Kernel::ConstFaceEdgeIter ConstFaceEdgeIter
Circulator.
Definition PolyMeshT.hh:179
│ │ │ +
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition PolyMeshT.hh:122
│ │ │ +
void update_normals()
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:317
│ │ │ +
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition PolyMeshT.hh:176
│ │ │ +
Kernel::VertexOHalfedgeIter VertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:163
│ │ │ +
Point calc_centroid(FaceHandle _fh) const
Computes and returns the average of the vertices defining _fh (same as calc_face_centroid)
Definition PolyMeshT_impl.hh:267
│ │ │ +
Kernel::VertexEdgeIter VertexEdgeIter
Circulator.
Definition PolyMeshT.hh:165
│ │ │ +
Scalar calc_dihedral_angle(HalfedgeHandle _heh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:558
│ │ │ +
Kernel::Face Face
Face type.
Definition PolyMeshT.hh:130
│ │ │ +
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:174
│ │ │ +
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition PolyMeshT_impl.hh:97
│ │ │ +
Scalar calc_edge_length(EdgeHandle _eh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:417
│ │ │ +
Kernel::ConstHalfedgeIter ConstHalfedgeIter
Scalar type.
Definition PolyMeshT.hh:149
│ │ │ +
void update_normal(VertexHandle _vh)
Update normal for vertex _vh.
Definition PolyMeshT.hh:341
│ │ │ +
void calc_sector_vectors(HalfedgeHandle _in_heh, Normal &_vec0, Normal &_vec1) const
defines a consistent representation of a sector geometry: the halfedge _in_heh defines the sector ori...
Definition PolyMeshT.hh:458
│ │ │ +
SmartVertexHandle add_vertex_dirty(const Point _p)
Alias for new_vertex_dirty().
Definition PolyMeshT.hh:242
│ │ │ +
Kernel::FaceFaceIter FaceFaceIter
Circulator.
Definition PolyMeshT.hh:170
│ │ │ +
bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
identifies feature edges w.r.t.
Definition PolyMeshT_impl.hh:452
│ │ │ +
Normal calc_edge_vector(EdgeHandle _eh) const
Calculates the edge vector as the vector defined by the halfedge with id #0 (see below)
Definition PolyMeshT.hh:396
│ │ │ +
virtual ~PolyMeshT()
Circulator.
Definition PolyMeshT.hh:188
│ │ │ +
Kernel::ConstVertexEdgeIter ConstVertexEdgeIter
Circulator.
Definition PolyMeshT.hh:175
│ │ │ +
Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:428
│ │ │ +
SmartVertexHandle add_vertex(const Point _p)
Alias for new_vertex(const Point&).
Definition PolyMeshT.hh:238
│ │ │ +
void calc_edge_vector(EdgeHandle _eh, Normal &_edge_vec) const
Calculates the edge vector as the vector defined by the halfedge with id #0 (see below)
Definition PolyMeshT.hh:389
│ │ │ +
Kernel::Edge Edge
Edge type.
Definition PolyMeshT.hh:128
│ │ │ +
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ +
void update_normal(FaceHandle _fh)
Update normal for face _fh.
Definition PolyMeshT.hh:261
│ │ │ +
Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const
calculates the dihedral angle on the edge _eh
Definition PolyMeshT.hh:554
│ │ │ +
void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:538
│ │ │ +
void split(EdgeHandle _eh, const Point &_p)
Compute normals for all primitives.
Definition PolyMeshT.hh:595
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ +
void update_normal(HalfedgeHandle _heh, const double _feature_angle=0.8)
Update normal for halfedge _heh.
Definition PolyMeshT.hh:305
│ │ │ +
Kernel::ConstEdgeIter ConstEdgeIter
Scalar type.
Definition PolyMeshT.hh:150
│ │ │ +
Kernel::ConstVertexIter ConstVertexIter
Scalar type.
Definition PolyMeshT.hh:148
│ │ │ +
void update_vertex_normals()
Update normal vectors for all vertices.
Definition PolyMeshT_impl.hh:572
│ │ │ +
void calc_sector_normal(HalfedgeHandle _in_heh, Normal &_sector_normal) const
calculates the normal (non-normalized) of the face sector defined by the angle <(_in_heh,...
Definition PolyMeshT.hh:514
│ │ │ +
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:173
│ │ │ +
Normal calc_edge_vector(HalfedgeHandle _heh) const
Calculates the edge vector as the difference of the the points defined by to_vertex_handle() and from...
Definition PolyMeshT.hh:410
│ │ │ +
Scalar calc_edge_sqr_length(EdgeHandle _eh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:425
│ │ │ +
Point calc_edge_midpoint(HalfedgeHandle _heh) const
Calculates the midpoint of the halfedge _heh, defined by the positions of the two incident vertices.
Definition PolyMeshT.hh:437
│ │ │ +
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition PolyMeshT.hh:162
│ │ │ +
void split(EdgeHandle _eh, VertexHandle _vh)
Compute normals for all primitives.
Definition PolyMeshT.hh:598
│ │ │ +
Kernel::HalfedgeIter HalfedgeIter
Scalar type.
Definition PolyMeshT.hh:144
│ │ │ +
Scalar calc_edge_length(HalfedgeHandle _heh) const
Calculates the length of the edge _heh.
Definition PolyMeshT.hh:422
│ │ │ +
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:168
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
PolyMeshT< Kernel > This
Self type. Used to specify iterators/circulators.
Definition PolyMeshT.hh:95
│ │ │ +
Kernel::ConstFaceFaceIter ConstFaceFaceIter
Circulator.
Definition PolyMeshT.hh:180
│ │ │ +
void split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-n split)
Definition PolyMeshT.hh:589
│ │ │ +
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │ +
Kernel::TexCoord1D TexCoord1D
TexCoord1D type.
Definition PolyMeshT.hh:118
│ │ │ +
Normal calc_normal(FaceHandle _fh) const
same as calc_face_normal
Definition PolyMeshT_impl.hh:187
│ │ │ +
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ +
SmartVertexHandle new_vertex_dirty(const Point _p)
Same as new_vertex(const Point&) but never shrinks, only enlarges the vertex property vectors.
Definition PolyMeshT.hh:228
│ │ │ +
Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const
calculates the dihedral angle on the halfedge _heh
Definition PolyMeshT.hh:533
│ │ │ +
Normal calc_vertex_normal(VertexHandle _vh) const
Calculate vertex normal for one specific vertex.
Definition PolyMeshT_impl.hh:483
│ │ │ +
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -TriConnectivity.hh │ │ │ │ +PolyMeshT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,146 +47,869 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44#ifndef OPENMESH_TRICONNECTIVITY_HH │ │ │ │ -45#define OPENMESH_TRICONNECTIVITY_HH │ │ │ │ -46 │ │ │ │ -47#include │ │ │ │ -48 │ │ │ │ -49namespace _O_p_e_n_M_e_s_h { │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// CLASS PolyMeshT │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ 50 │ │ │ │ -_5_3class OPENMESHDLLEXPORT _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y : public _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -54{ │ │ │ │ -55public: │ │ │ │ -56 │ │ │ │ -57 _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ -58 virtual _~_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ -59 │ │ │ │ -60 inline static bool is_triangles() │ │ │ │ -61 { return true; } │ │ │ │ -62 │ │ │ │ -_6_6 inline void _a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y(const _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y& _other) │ │ │ │ -67 { PolyConnectivity::assign_connectivity(_other); } │ │ │ │ +51 │ │ │ │ +52#ifndef OPENMESH_POLYMESHT_HH │ │ │ │ +53#define OPENMESH_POLYMESHT_HH │ │ │ │ +54 │ │ │ │ +55 │ │ │ │ +56//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +57 │ │ │ │ +58 │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include │ │ │ │ +63#include │ │ │ │ +64#include │ │ │ │ +65 │ │ │ │ +66 │ │ │ │ +67//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ 68 │ │ │ │ -69 inline void assign_connectivity(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _other) │ │ │ │ -70 { │ │ │ │ -71 PolyConnectivity::assign_connectivity(_other); │ │ │ │ -72 triangulate(); │ │ │ │ -73 } │ │ │ │ +69 │ │ │ │ +70namespace _O_p_e_n_M_e_s_h { │ │ │ │ +71 │ │ │ │ +72//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +73 │ │ │ │ 74 │ │ │ │ -79 │ │ │ │ -88 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size); │ │ │ │ -89 │ │ │ │ -98 SmartFaceHandle add_face(const std::vector& _vhandles); │ │ │ │ +89template │ │ │ │ +_9_0class _P_o_l_y_M_e_s_h_T : public Kernel │ │ │ │ +91{ │ │ │ │ +92public: │ │ │ │ +93 │ │ │ │ +_9_5 typedef _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_> _T_h_i_s; │ │ │ │ +96 //--- item types --- │ │ │ │ +97 │ │ │ │ 99 │ │ │ │ -108 SmartFaceHandle add_face(const std::vector& _vhandles); │ │ │ │ +_1_0_0 static constexpr bool _i_s___p_o_l_y_m_e_s_h() { return true; } │ │ │ │ +101 static constexpr bool is_trimesh() { return false; } │ │ │ │ +102 using ConnectivityTag = PolyConnectivityTag; │ │ │ │ +103 enum { IsPolyMesh = 1 }; │ │ │ │ +104 enum { IsTriMesh = 0 }; │ │ │ │ +106 │ │ │ │ +108 │ │ │ │ 109 │ │ │ │ -120 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle │ │ │ │ -_vh2); │ │ │ │ -121 │ │ │ │ -123 │ │ │ │ -_1_2_7 inline _V_e_r_t_e_x_H_a_n_d_l_e _o_p_p_o_s_i_t_e___v_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -128 { │ │ │ │ -129 return is_boundary(_heh) ? InvalidVertexHandle : │ │ │ │ -130 to_vertex_handle(next_halfedge_handle(_heh)); │ │ │ │ -131 } │ │ │ │ +_1_1_0 typedef typename Kernel::Scalar _S_c_a_l_a_r; │ │ │ │ +_1_1_2 typedef typename Kernel::Point _P_o_i_n_t; │ │ │ │ +_1_1_4 typedef typename Kernel::Normal _N_o_r_m_a_l; │ │ │ │ +_1_1_6 typedef typename Kernel::Color _C_o_l_o_r; │ │ │ │ +_1_1_8 typedef typename Kernel::TexCoord1D _T_e_x_C_o_o_r_d_1_D; │ │ │ │ +_1_2_0 typedef typename Kernel::TexCoord2D _T_e_x_C_o_o_r_d_2_D; │ │ │ │ +_1_2_2 typedef typename Kernel::TexCoord3D _T_e_x_C_o_o_r_d_3_D; │ │ │ │ +_1_2_4 typedef typename Kernel::Vertex _V_e_r_t_e_x; │ │ │ │ +_1_2_6 typedef typename Kernel::Halfedge _H_a_l_f_e_d_g_e; │ │ │ │ +_1_2_8 typedef typename Kernel::Edge _E_d_g_e; │ │ │ │ +_1_3_0 typedef typename Kernel::Face _F_a_c_e; │ │ │ │ 132 │ │ │ │ -_1_3_6 _V_e_r_t_e_x_H_a_n_d_l_e _o_p_p_o_s_i_t_e___h_e___o_p_p_o_s_i_t_e___v_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -137 { return opposite_vh(opposite_halfedge_handle(_heh)); } │ │ │ │ -138 │ │ │ │ +133 //--- handle types --- │ │ │ │ +134 │ │ │ │ +_1_3_6 typedef typename Kernel::VertexHandle _V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +_1_3_7 typedef typename Kernel::HalfedgeHandle _H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +_1_3_8 typedef typename Kernel::EdgeHandle _E_d_g_e_H_a_n_d_l_e; │ │ │ │ +_1_3_9 typedef typename Kernel::FaceHandle _F_a_c_e_H_a_n_d_l_e; │ │ │ │ +140 │ │ │ │ +141 │ │ │ │ 142 │ │ │ │ -143 │ │ │ │ -148 bool is_collapse_ok(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -149 │ │ │ │ -151 _H_a_l_f_e_d_g_e_H_a_n_d_l_e vertex_split(_V_e_r_t_e_x_H_a_n_d_l_e v0, _V_e_r_t_e_x_H_a_n_d_l_e v1, │ │ │ │ -152 _V_e_r_t_e_x_H_a_n_d_l_e vl, _V_e_r_t_e_x_H_a_n_d_l_e vr); │ │ │ │ +_1_4_3 typedef typename Kernel::VertexIter _V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_4_4 typedef typename Kernel::HalfedgeIter _H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_4_5 typedef typename Kernel::EdgeIter _E_d_g_e_I_t_e_r; │ │ │ │ +_1_4_6 typedef typename Kernel::FaceIter _F_a_c_e_I_t_e_r; │ │ │ │ +147 │ │ │ │ +_1_4_8 typedef typename Kernel::ConstVertexIter _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_4_9 typedef typename Kernel::ConstHalfedgeIter _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_5_0 typedef typename Kernel::ConstEdgeIter _C_o_n_s_t_E_d_g_e_I_t_e_r; │ │ │ │ +_1_5_1 typedef typename Kernel::ConstFaceIter _C_o_n_s_t_F_a_c_e_I_t_e_r; │ │ │ │ 153 │ │ │ │ -155 bool is_flip_ok(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -156 │ │ │ │ -159 void flip(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -160 │ │ │ │ -161 │ │ │ │ -173 void split(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -174 │ │ │ │ -_1_9_0 inline void _s_p_l_i_t___e_d_g_e(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -{ TriConnectivity::split(_eh, _vh); } │ │ │ │ -191 │ │ │ │ -204 void split_copy(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -205 │ │ │ │ -_2_2_2 inline void _s_p_l_i_t___e_d_g_e___c_o_p_y(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -{ TriConnectivity::split_copy(_eh, _vh); } │ │ │ │ -223 │ │ │ │ -_2_2_9 inline void _s_p_l_i_t(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -230 { PolyConnectivity::split(_fh, _vh); } │ │ │ │ -231 │ │ │ │ -_2_3_7 inline void _s_p_l_i_t___c_o_p_y(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -238 { PolyConnectivity::split_copy(_fh, _vh); } │ │ │ │ -239 │ │ │ │ -241 │ │ │ │ -242private: │ │ │ │ -244 _H_a_l_f_e_d_g_e_H_a_n_d_l_e insert_loop(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh); │ │ │ │ -246 _H_a_l_f_e_d_g_e_H_a_n_d_l_e insert_edge(_V_e_r_t_e_x_H_a_n_d_l_e _vh, │ │ │ │ -247 _H_a_l_f_e_d_g_e_H_a_n_d_l_e _h0, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _h1); │ │ │ │ -248}; │ │ │ │ -249 │ │ │ │ -250} │ │ │ │ -251 │ │ │ │ -252#endif//OPENMESH_TRICONNECTIVITY_HH │ │ │ │ +154 //--- circulators --- │ │ │ │ +155 │ │ │ │ +_1_6_2 typedef typename Kernel::VertexVertexIter _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_6_3 typedef typename Kernel::VertexOHalfedgeIter _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_6_4 typedef typename Kernel::VertexIHalfedgeIter _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_6_5 typedef typename Kernel::VertexEdgeIter _V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ +_1_6_6 typedef typename Kernel::VertexFaceIter _V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ +_1_6_7 typedef typename Kernel::FaceVertexIter _F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_6_8 typedef typename Kernel::FaceHalfedgeIter _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_6_9 typedef typename Kernel::FaceEdgeIter _F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ +_1_7_0 typedef typename Kernel::FaceFaceIter _F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ +171 │ │ │ │ +_1_7_2 typedef typename Kernel::ConstVertexVertexIter _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_7_3 typedef typename Kernel::ConstVertexOHalfedgeIter _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_7_4 typedef typename Kernel::ConstVertexIHalfedgeIter _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_7_5 typedef typename Kernel::ConstVertexEdgeIter _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ +_1_7_6 typedef typename Kernel::ConstVertexFaceIter _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ +_1_7_7 typedef typename Kernel::ConstFaceVertexIter _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_7_8 typedef typename Kernel::ConstFaceHalfedgeIter _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_7_9 typedef typename Kernel::ConstFaceEdgeIter _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ +_1_8_0 typedef typename Kernel::ConstFaceFaceIter _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ +182 │ │ │ │ +183 │ │ │ │ +184 // --- constructor/destructor │ │ │ │ +_1_8_5 _P_o_l_y_M_e_s_h_T() {} │ │ │ │ +186 template │ │ │ │ +_1_8_7 explicit _P_o_l_y_M_e_s_h_T(const T& t) : Kernel(t) {} │ │ │ │ +_1_8_8 virtual _~_P_o_l_y_M_e_s_h_T() {} │ │ │ │ +189 │ │ │ │ +194 // --- creation --- │ │ │ │ +195 │ │ │ │ +_2_0_1 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x() │ │ │ │ +202 { return _m_a_k_e___s_m_a_r_t(Kernel::new_vertex(), this); } │ │ │ │ +203 │ │ │ │ +_2_1_0 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x(const _P_o_i_n_t _p) │ │ │ │ +211 { │ │ │ │ +212 _V_e_r_t_e_x_H_a_n_d_l_e vh(Kernel::new_vertex()); │ │ │ │ +213 this->set_point(vh, _p); │ │ │ │ +214 return _m_a_k_e___s_m_a_r_t(vh, this); │ │ │ │ +215 } │ │ │ │ +216 │ │ │ │ +_2_2_8 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x___d_i_r_t_y(const _P_o_i_n_t _p) │ │ │ │ +229 { │ │ │ │ +230 _V_e_r_t_e_x_H_a_n_d_l_e vh(Kernel::new_vertex_dirty()); │ │ │ │ +231 this->set_point(vh, _p); │ │ │ │ +232 return _m_a_k_e___s_m_a_r_t(vh, this); │ │ │ │ +233 } │ │ │ │ +234 │ │ │ │ +_2_3_8 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _a_d_d___v_e_r_t_e_x(const _P_o_i_n_t _p) │ │ │ │ +239 { return _n_e_w___v_e_r_t_e_x(_p); } │ │ │ │ +240 │ │ │ │ +_2_4_2 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _a_d_d___v_e_r_t_e_x___d_i_r_t_y(const _P_o_i_n_t _p) │ │ │ │ +243 { return _m_a_k_e___s_m_a_r_t(_n_e_w___v_e_r_t_e_x___d_i_r_t_y(_p), this); } │ │ │ │ +244 │ │ │ │ +245 // --- normal vectors --- │ │ │ │ +246 │ │ │ │ +250 │ │ │ │ +258 void _u_p_d_a_t_e___n_o_r_m_a_l_s(); │ │ │ │ +259 │ │ │ │ +_2_6_1 void _u_p_d_a_t_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +262 { this->set_normal(_fh, _c_a_l_c___f_a_c_e___n_o_r_m_a_l(_fh)); } │ │ │ │ +263 │ │ │ │ +269 void _u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s(); │ │ │ │ +270 │ │ │ │ +272 virtual _N_o_r_m_a_l _c_a_l_c___f_a_c_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +273 │ │ │ │ +275 _N_o_r_m_a_l _c_a_l_c___f_a_c_e___n_o_r_m_a_l(const _P_o_i_n_t& _p0, const _P_o_i_n_t& _p1, │ │ │ │ +276 const _P_o_i_n_t& _p2) const; │ │ │ │ +277 │ │ │ │ +279 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +280 │ │ │ │ +_2_8_2 void _c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh, _P_o_i_n_t& _pt) const { │ │ │ │ +283 _pt = _c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_fh); │ │ │ │ +284 } │ │ │ │ +285 │ │ │ │ +287 _P_o_i_n_t _c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +288 │ │ │ │ +290 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +291 │ │ │ │ +293 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +294 │ │ │ │ +296 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +297 │ │ │ │ +299 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +300 │ │ │ │ +302 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_M_e_s_h_H_a_n_d_l_e _mh) const; │ │ │ │ +303 │ │ │ │ +_3_0_5 void _u_p_d_a_t_e___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle = 0.8) │ │ │ │ +306 { this->set_normal(_heh, _c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l(_heh,_feature_angle)); } │ │ │ │ +307 │ │ │ │ +317 void _u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s(const double _feature_angle = 0.8); │ │ │ │ +318 │ │ │ │ +331 virtual _N_o_r_m_a_l _c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double │ │ │ │ +_feature_angle = 0.8) const; │ │ │ │ +332 │ │ │ │ +334 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e, const double _feature_angle = 0.8) │ │ │ │ +const; │ │ │ │ +335 │ │ │ │ +338 bool _i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double │ │ │ │ +_feature_angle) const; │ │ │ │ +339 │ │ │ │ +_3_4_1 void _u_p_d_a_t_e___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +342 { this->set_normal(_vh, _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l(_vh)); } │ │ │ │ +343 │ │ │ │ +353 void _u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s(); │ │ │ │ +354 │ │ │ │ +367 _N_o_r_m_a_l _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +368 │ │ │ │ +376 void _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const; │ │ │ │ +377 void _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const; │ │ │ │ +378 void _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const; │ │ │ │ +379 │ │ │ │ +381 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +382 │ │ │ │ +384 │ │ │ │ +385 // --- Geometry API - still in development --- │ │ │ │ +386 │ │ │ │ +_3_8_9 void _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_E_d_g_e_H_a_n_d_l_e _eh, _N_o_r_m_a_l& _edge_vec) const │ │ │ │ +390 { │ │ │ │ +391 _edge_vec = _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_eh); │ │ │ │ +392 } │ │ │ │ +393 │ │ │ │ +_3_9_6 _N_o_r_m_a_l _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +397 { │ │ │ │ +398 return _c_a_l_c___e_d_g_e___v_e_c_t_o_r(this->halfedge_handle(_eh,0)); │ │ │ │ +399 } │ │ │ │ +400 │ │ │ │ +_4_0_3 void _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _N_o_r_m_a_l& _edge_vec) const │ │ │ │ +404 { │ │ │ │ +405 _edge_vec = _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh); │ │ │ │ +406 } │ │ │ │ +407 │ │ │ │ +_4_1_0 _N_o_r_m_a_l _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +411 { │ │ │ │ +412 return this->point(this->to_vertex_handle(_heh)) - │ │ │ │ +413 this->point(this->from_vertex_handle(_heh)); │ │ │ │ +414 } │ │ │ │ +415 │ │ │ │ +416 // Calculates the length of the edge _eh │ │ │ │ +_4_1_7 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___l_e_n_g_t_h(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +418 { return _c_a_l_c___e_d_g_e___l_e_n_g_t_h(this->halfedge_handle(_eh,0)); } │ │ │ │ +419 │ │ │ │ +_4_2_2 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___l_e_n_g_t_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +423 { return (_S_c_a_l_a_r)sqrt(_c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(_heh)); } │ │ │ │ +424 │ │ │ │ +_4_2_5 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +426 { return _c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(this->halfedge_handle(_eh,0)); } │ │ │ │ +427 │ │ │ │ +_4_2_8 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +429 { │ │ │ │ +430 _N_o_r_m_a_l edge_vec; │ │ │ │ +431 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh, edge_vec); │ │ │ │ +432 return sqrnorm(edge_vec); │ │ │ │ +433 } │ │ │ │ +434 │ │ │ │ +_4_3_7 _P_o_i_n_t _c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +438 { │ │ │ │ +439 _V_e_r_t_e_x_H_a_n_d_l_e vh0 = this->from_vertex_handle(_heh); │ │ │ │ +440 _V_e_r_t_e_x_H_a_n_d_l_e vh1 = this->to_vertex_handle(_heh); │ │ │ │ +441 return 0.5 * (this->point(vh0) + this->point(vh1)); │ │ │ │ +442 } │ │ │ │ +443 │ │ │ │ +_4_4_6 _P_o_i_n_t _c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +447 { │ │ │ │ +448 return _c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t(this->halfedge_handle(_eh, 0)); │ │ │ │ +449 } │ │ │ │ +450 │ │ │ │ +452 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +453 │ │ │ │ +_4_5_8 void _c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh, _N_o_r_m_a_l& _vec0, _N_o_r_m_a_l& │ │ │ │ +_vec1) const │ │ │ │ +459 { │ │ │ │ +460 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(this->next_halfedge_handle(_in_heh), _vec0);//p2 - p1 │ │ │ │ +461 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(this->opposite_halfedge_handle(_in_heh), _vec1);//p0 - p1 │ │ │ │ +462 } │ │ │ │ +463 │ │ │ │ +_4_6_9 _S_c_a_l_a_r _c_a_l_c___s_e_c_t_o_r___a_n_g_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh) const │ │ │ │ +470 { │ │ │ │ +471 _N_o_r_m_a_l v0, v1; │ │ │ │ +472 _c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s(_in_heh, v0, v1); │ │ │ │ +473 _S_c_a_l_a_r denom = norm(v0)*norm(v1); │ │ │ │ +474 if ( denom == _S_c_a_l_a_r(0)) │ │ │ │ +475 { │ │ │ │ +476 return 0; │ │ │ │ +477 } │ │ │ │ +478 _S_c_a_l_a_r cos_a = _d_o_t(v0 , v1) / denom; │ │ │ │ +479 if (this->is_boundary(_in_heh)) │ │ │ │ +480 {//determine if the boundary sector is concave or convex │ │ │ │ +481 _F_a_c_e_H_a_n_d_l_e fh(this->face_handle(this->opposite_halfedge_handle(_in_heh))); │ │ │ │ +482 _N_o_r_m_a_l f_n(_c_a_l_c___f_a_c_e___n_o_r_m_a_l(fh));//this normal is (for convex fh) OK │ │ │ │ +483 _S_c_a_l_a_r sign_a = _d_o_t(cross(v0, v1), f_n); │ │ │ │ +484 return _a_n_g_l_e(cos_a, sign_a); │ │ │ │ +485 } │ │ │ │ +486 else │ │ │ │ +487 { │ │ │ │ +488 return acos(_s_a_n_e___a_a_r_g(cos_a)); │ │ │ │ +489 } │ │ │ │ +490 } │ │ │ │ +491 │ │ │ │ +492 // calculate the cos and the sin of angle <(_in_heh,next_halfedge(_in_heh)) │ │ │ │ +493 /* │ │ │ │ +494 void calc_sector_angle_cos_sin(HalfedgeHandle _in_heh, Scalar& _cos_a, │ │ │ │ +Scalar& _sin_a) const │ │ │ │ +495 { │ │ │ │ +496 Normal in_vec, out_vec; │ │ │ │ +497 calc_edge_vector(_in_heh, in_vec); │ │ │ │ +498 calc_edge_vector(next_halfedge_handle(_in_heh), out_vec); │ │ │ │ +499 Scalar denom = norm(in_vec)*norm(out_vec); │ │ │ │ +500 if (is_zero(denom)) │ │ │ │ +501 { │ │ │ │ +502 _cos_a = 1; │ │ │ │ +503 _sin_a = 0; │ │ │ │ +504 } │ │ │ │ +505 else │ │ │ │ +506 { │ │ │ │ +507 _cos_a = dot(in_vec, out_vec)/denom; │ │ │ │ +508 _sin_a = norm(cross(in_vec, out_vec))/denom; │ │ │ │ +509 } │ │ │ │ +510 } │ │ │ │ +511 */ │ │ │ │ +_5_1_4 void _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh, _N_o_r_m_a_l& _sector_normal) │ │ │ │ +const │ │ │ │ +515 { │ │ │ │ +516 _N_o_r_m_a_l vec0, vec1; │ │ │ │ +517 _c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s(_in_heh, vec0, vec1); │ │ │ │ +518 _sector_normal = cross(vec0, vec1);//(p2-p1)^(p0-p1) │ │ │ │ +519 } │ │ │ │ +520 │ │ │ │ +_5_2_4 _S_c_a_l_a_r _c_a_l_c___s_e_c_t_o_r___a_r_e_a(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh) const │ │ │ │ +525 { │ │ │ │ +526 _N_o_r_m_a_l sector_normal; │ │ │ │ +527 _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(_in_heh, sector_normal); │ │ │ │ +528 return norm(sector_normal)/2; │ │ │ │ +529 } │ │ │ │ +530 │ │ │ │ +_5_3_3 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +534 { │ │ │ │ +535 // Make sure that we have face normals on the mesh │ │ │ │ +536 assert(Kernel::has_face_normals()); │ │ │ │ +537 │ │ │ │ +538 if (this->is_boundary(this->edge_handle(_heh))) │ │ │ │ +539 {//the dihedral angle at a boundary edge is 0 │ │ │ │ +540 return 0; │ │ │ │ +541 } │ │ │ │ +542 const _N_o_r_m_a_l& n0 = this->normal(this->face_handle(_heh)); │ │ │ │ +543 const _N_o_r_m_a_l& n1 = this->normal(this->face_handle(this- │ │ │ │ +>opposite_halfedge_handle(_heh))); │ │ │ │ +544 _N_o_r_m_a_l he; │ │ │ │ +545 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh, he); │ │ │ │ +546 _S_c_a_l_a_r da_cos = _d_o_t(n0, n1); │ │ │ │ +547 //should be normalized, but we need only the sign │ │ │ │ +548 _S_c_a_l_a_r da_sin_sign = _d_o_t(cross(n0, n1), he); │ │ │ │ +549 return _a_n_g_l_e(da_cos, da_sin_sign); │ │ │ │ +550 } │ │ │ │ +551 │ │ │ │ +_5_5_4 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +555 { return _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t(this->halfedge_handle(_eh,0)); } │ │ │ │ +556 │ │ │ │ +557 // calculates the dihedral angle on the halfedge _heh │ │ │ │ +_5_5_8 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +559 { │ │ │ │ +560 if (this->is_boundary(this->edge_handle(_heh))) │ │ │ │ +561 {//the dihedral angle at a boundary edge is 0 │ │ │ │ +562 return 0; │ │ │ │ +563 } │ │ │ │ +564 _N_o_r_m_a_l n0, n1, he; │ │ │ │ +565 _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(_heh, n0); │ │ │ │ +566 _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(this->opposite_halfedge_handle(_heh), n1); │ │ │ │ +567 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh, he); │ │ │ │ +568 _S_c_a_l_a_r denom = norm(n0)*norm(n1); │ │ │ │ +569 if (denom == _S_c_a_l_a_r(0)) │ │ │ │ +570 { │ │ │ │ +571 return 0; │ │ │ │ +572 } │ │ │ │ +573 _S_c_a_l_a_r da_cos = _d_o_t(n0, n1)/denom; │ │ │ │ +574 //should be normalized, but we need only the sign │ │ │ │ +575 _S_c_a_l_a_r da_sin_sign = _d_o_t(cross(n0, n1), he); │ │ │ │ +576 return _a_n_g_l_e(da_cos, da_sin_sign); │ │ │ │ +577 } │ │ │ │ +578 │ │ │ │ +579 // calculates the dihedral angle on the edge _eh │ │ │ │ +_5_8_0 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +581 { return _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e(this->halfedge_handle(_eh,0)); } │ │ │ │ +582 │ │ │ │ +585 unsigned int _f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s(_S_c_a_l_a_r _angle_tresh = OpenMesh::deg_to_rad │ │ │ │ +(44.0)); │ │ │ │ +586 // --- misc --- │ │ │ │ +587 │ │ │ │ +_5_8_9 inline void _s_p_l_i_t(_F_a_c_e_H_a_n_d_l_e _fh, const _P_o_i_n_t& _p) │ │ │ │ +590 { Kernel::split(_fh, _a_d_d___v_e_r_t_e_x(_p)); } │ │ │ │ +591 │ │ │ │ +_5_9_2 inline void _s_p_l_i_t(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +593 { Kernel::split(_fh, _vh); } │ │ │ │ +594 │ │ │ │ +_5_9_5 inline void _s_p_l_i_t(_E_d_g_e_H_a_n_d_l_e _eh, const _P_o_i_n_t& _p) │ │ │ │ +596 { Kernel::split_edge(_eh, _a_d_d___v_e_r_t_e_x(_p)); } │ │ │ │ +597 │ │ │ │ +_5_9_8 inline void _s_p_l_i_t(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +599 { Kernel::split_edge(_eh, _vh); } │ │ │ │ +600 │ │ │ │ +601private: │ │ │ │ +602 struct PointIs3DTag {}; │ │ │ │ +603 struct PointIsNot3DTag {}; │ │ │ │ +604 _N_o_r_m_a_l calc_face_normal_impl(_F_a_c_e_H_a_n_d_l_e, PointIs3DTag) const; │ │ │ │ +605 _N_o_r_m_a_l calc_face_normal_impl(_F_a_c_e_H_a_n_d_l_e, PointIsNot3DTag) const; │ │ │ │ +606 _N_o_r_m_a_l calc_face_normal_impl(const _P_o_i_n_t&, const _P_o_i_n_t&, const _P_o_i_n_t&, │ │ │ │ +PointIs3DTag) const; │ │ │ │ +607 _N_o_r_m_a_l calc_face_normal_impl(const _P_o_i_n_t&, const _P_o_i_n_t&, const _P_o_i_n_t&, │ │ │ │ +PointIsNot3DTag) const; │ │ │ │ +608}; │ │ │ │ +609 │ │ │ │ +635template │ │ │ │ +_6_3_6LHS _m_e_s_h___c_a_s_t(_P_o_l_y_M_e_s_h_T_<_K_E_R_N_E_L_> &rhs) { │ │ │ │ +637 return _M_e_s_h_C_a_s_t_<_L_H_S_,_ _P_o_l_y_M_e_s_h_T_<_K_E_R_N_E_L_>&>::cast(rhs); │ │ │ │ +638} │ │ │ │ +639 │ │ │ │ +640template │ │ │ │ +641LHS _m_e_s_h___c_a_s_t(PolyMeshT *rhs) { │ │ │ │ +642 return MeshCast*>::cast(rhs); │ │ │ │ +643} │ │ │ │ +644 │ │ │ │ +645template │ │ │ │ +646const LHS _m_e_s_h___c_a_s_t(const PolyMeshT &rhs) { │ │ │ │ +647 return MeshCast&>::cast(rhs); │ │ │ │ +648} │ │ │ │ +649 │ │ │ │ +650template │ │ │ │ +651const LHS _m_e_s_h___c_a_s_t(const PolyMeshT *rhs) { │ │ │ │ +652 return MeshCast*>::cast(rhs); │ │ │ │ +653} │ │ │ │ +654 │ │ │ │ +655// │ │ │ │ +============================================================================= │ │ │ │ +656} // namespace OpenMesh │ │ │ │ +657// │ │ │ │ +============================================================================= │ │ │ │ +658#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C) │ │ │ │ +659# define OPENMESH_POLYMESH_TEMPLATES │ │ │ │ +660# include "PolyMeshT_impl.hh" │ │ │ │ +661#endif │ │ │ │ +662// │ │ │ │ +============================================================================= │ │ │ │ +663#endif // OPENMESH_POLYMESHT_HH defined │ │ │ │ +664// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ +SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ +Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ +osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ +Adapter for osg vector member computing a scalar product. │ │ │ │ +DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_a_n_g_l_e │ │ │ │ +T angle(T _cos_angle, T _sin_angle) │ │ │ │ +returns the angle determined by its cos and the sign of its sin result is │ │ │ │ +positive if the angle is in... │ │ │ │ +DDeeffiinniittiioonn MathDefs.hh:140 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_m_e_s_h___c_a_s_t │ │ │ │ +LHS mesh_cast(PolyMeshT< KERNEL > &rhs) │ │ │ │ +Cast a mesh with different but identical traits into each other. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:636 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_s_a_n_e___a_a_r_g │ │ │ │ +T sane_aarg(T _aarg) │ │ │ │ +Trigonometry/angles - related. │ │ │ │ +DDeeffiinniittiioonn MathDefs.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_e_s_h_C_a_s_t │ │ │ │ +Cast a mesh with different but identical traits into each other. │ │ │ │ +DDeeffiinniittiioonn FinalMeshItemsT.hh:178 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Handle for a vertex entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ Handle for a halfedge entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ Handle for a edge entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ Handle for a face entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -Connectivity Class for polygonal meshes. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -Connectivity Class for Triangle Meshes. │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:54 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t___e_d_g_e │ │ │ │ -void split_edge(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -Edge split (= 2-to-4 split) │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:190 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ -void split_copy(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -Face split (= 1-to-3) split, calls corresponding PolyMeshT function). │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:237 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t___e_d_g_e___c_o_p_y │ │ │ │ -void split_edge_copy(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -Edge split (= 2-to-4 split) │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:222 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___h_e___o_p_p_o_s_i_t_e___v_h │ │ │ │ -VertexHandle opposite_he_opposite_vh(HalfedgeHandle _heh) const │ │ │ │ -Returns the opposite vertex to the opposite halfedge of _heh in the face │ │ │ │ -referenced by it returns Inv... │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___v_h │ │ │ │ -VertexHandle opposite_vh(HalfedgeHandle _heh) const │ │ │ │ -Returns the opposite vertex to the halfedge _heh in the face referenced by _heh │ │ │ │ -returns InvalidVertex... │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:127 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s_p_l_i_t │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ +Handle type for meshes to simplify some template programming. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ +Base type for a polygonal mesh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x │ │ │ │ +Kernel::Vertex Vertex │ │ │ │ +Vertex type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::FaceEdgeIter FaceEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d │ │ │ │ +void calc_face_centroid(FaceHandle _fh, Point &_pt) const │ │ │ │ +calculates the average of the vertices defining _fh │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:282 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceIter ConstFaceIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:151 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ +Kernel::Scalar Scalar │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstVertexVertexIter ConstVertexVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:172 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ +void calc_edge_vector(HalfedgeHandle _heh, Normal &_edge_vec) const │ │ │ │ +Calculates the edge vector as the difference of the the points defined by │ │ │ │ +to_vertex_handle() and from... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:403 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle new_vertex(const Point _p) │ │ │ │ +Adds a new vertex initialized to a custom position. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:210 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::EdgeHandle EdgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::VertexFaceIter VertexFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:166 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstFaceVertexIter ConstFaceVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:177 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e │ │ │ │ +Kernel::Halfedge Halfedge │ │ │ │ +Halfedge type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:126 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t │ │ │ │ +void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const │ │ │ │ +Different methods for calculation of the normal at _vh: │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:497 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t │ │ │ │ +void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:507 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ +PolyMeshT() │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:185 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e │ │ │ │ +Scalar calc_dihedral_angle(EdgeHandle _eh) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:580 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_i_s___p_o_l_y_m_e_s_h │ │ │ │ +static constexpr bool is_polymesh() │ │ │ │ +Determine whether this is a PolyMeshT or TriMeshT (This function does not check │ │ │ │ +the per face vertex c... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:100 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::FaceIter FaceIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ +Kernel::Normal Normal │ │ │ │ +Normal type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::FaceVertexIter FaceVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:167 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t │ │ │ │ +Point calc_edge_midpoint(EdgeHandle _eh) const │ │ │ │ +Calculates the midpoint of the edge _eh, defined by the positions of the two │ │ │ │ +incident vertices. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:446 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle new_vertex() │ │ │ │ +Uses default copy and assignment operator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:201 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::VertexIHalfedgeIter VertexIHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:164 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ void split(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -Face split (= 1-to-3) split, calls corresponding PolyMeshT function). │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:229 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -void assign_connectivity(const TriConnectivity &_other) │ │ │ │ -assign_connectivity() methods. │ │ │ │ -DDeeffiinniittiioonn TriConnectivity.hh:66 │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:592 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ +PolyMeshT(const T &t) │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:187 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ +Kernel::TexCoord2D TexCoord2D │ │ │ │ +TexCoord2D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___a_r_e_a │ │ │ │ +Scalar calc_sector_area(HalfedgeHandle _in_heh) const │ │ │ │ +calculates the area of the face sector defined by the angle < │ │ │ │ +(_in_heh,next_halfedge(_in_heh)) NOTE: s... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:524 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s │ │ │ │ +void update_face_normals() │ │ │ │ +Update normal vectors for all faces. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:335 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s │ │ │ │ +void update_halfedge_normals(const double _feature_angle=0.8) │ │ │ │ +Update normal vectors for all halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s │ │ │ │ +unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0)) │ │ │ │ +tags an edge as a feature if its dihedral angle is larger than _angle_tresh │ │ │ │ +returns the number of the... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l │ │ │ │ +virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double │ │ │ │ +_feature_angle=0.8) const │ │ │ │ +Calculate halfedge normal for one specific halfedge. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:365 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___a_n_g_l_e │ │ │ │ +Scalar calc_sector_angle(HalfedgeHandle _in_heh) const │ │ │ │ +calculates the sector angle. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:469 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceEdgeIter ConstFaceEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:179 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ +Kernel::TexCoord3D TexCoord3D │ │ │ │ +TexCoord3D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l_s │ │ │ │ +void update_normals() │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:317 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexFaceIter ConstVertexFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::VertexOHalfedgeIter VertexOHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:163 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___c_e_n_t_r_o_i_d │ │ │ │ +Point calc_centroid(FaceHandle _fh) const │ │ │ │ +Computes and returns the average of the vertices defining _fh (same as │ │ │ │ +calc_face_centroid) │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:267 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::VertexEdgeIter VertexEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:165 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e │ │ │ │ +Scalar calc_dihedral_angle(HalfedgeHandle _heh) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:558 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e │ │ │ │ +Kernel::Face Face │ │ │ │ +Face type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:130 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ +virtual Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ +Calculate normal vector for face _fh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___l_e_n_g_t_h │ │ │ │ +Scalar calc_edge_length(EdgeHandle _eh) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:417 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstHalfedgeIter ConstHalfedgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:149 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l │ │ │ │ +void update_normal(VertexHandle _vh) │ │ │ │ +Update normal for vertex _vh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:341 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s │ │ │ │ +void calc_sector_vectors(HalfedgeHandle _in_heh, Normal &_vec0, Normal &_vec1) │ │ │ │ +const │ │ │ │ +defines a consistent representation of a sector geometry: the halfedge _in_heh │ │ │ │ +defines the sector ori... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:458 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x___d_i_r_t_y │ │ │ │ +SmartVertexHandle add_vertex_dirty(const Point _p) │ │ │ │ +Alias for new_vertex_dirty(). │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:242 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::FaceFaceIter FaceFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:170 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e │ │ │ │ +bool is_estimated_feature_edge(HalfedgeHandle _heh, const double │ │ │ │ +_feature_angle) const │ │ │ │ +identifies feature edges w.r.t. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:452 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ +Normal calc_edge_vector(EdgeHandle _eh) const │ │ │ │ +Calculates the edge vector as the vector defined by the halfedge with id #0 │ │ │ │ +(see below) │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:396 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_~_P_o_l_y_M_e_s_h_T │ │ │ │ +virtual ~PolyMeshT() │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:188 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexEdgeIter ConstVertexEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:175 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h │ │ │ │ +Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:428 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle add_vertex(const Point _p) │ │ │ │ +Alias for new_vertex(const Point&). │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:238 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ +void calc_edge_vector(EdgeHandle _eh, Normal &_edge_vec) const │ │ │ │ +Calculates the edge vector as the vector defined by the halfedge with id #0 │ │ │ │ +(see below) │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:389 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e │ │ │ │ +Kernel::Edge Edge │ │ │ │ +Edge type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Kernel::FaceHandle FaceHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l │ │ │ │ +void update_normal(FaceHandle _fh) │ │ │ │ +Update normal for face _fh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:261 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t │ │ │ │ +Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const │ │ │ │ +calculates the dihedral angle on the edge _eh │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:554 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p │ │ │ │ +void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:538 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(EdgeHandle _eh, const Point &_p) │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:595 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::EdgeIter EdgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l │ │ │ │ +void update_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) │ │ │ │ +Update normal for halfedge _heh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:305 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstEdgeIter ConstEdgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:150 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::ConstVertexIter ConstVertexIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:148 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s │ │ │ │ +void update_vertex_normals() │ │ │ │ +Update normal vectors for all vertices. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:572 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l │ │ │ │ +void calc_sector_normal(HalfedgeHandle _in_heh, Normal &_sector_normal) const │ │ │ │ +calculates the normal (non-normalized) of the face sector defined by the angle │ │ │ │ +<(_in_heh,... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:514 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:173 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ +Normal calc_edge_vector(HalfedgeHandle _heh) const │ │ │ │ +Calculates the edge vector as the difference of the the points defined by │ │ │ │ +to_vertex_handle() and from... │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:410 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h │ │ │ │ +Scalar calc_edge_sqr_length(EdgeHandle _eh) const │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:425 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t │ │ │ │ +Point calc_edge_midpoint(HalfedgeHandle _heh) const │ │ │ │ +Calculates the midpoint of the halfedge _heh, defined by the positions of the │ │ │ │ +two incident vertices. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:437 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexVertexIter VertexVertexIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:162 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ +Compute normals for all primitives. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:598 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::HalfedgeIter HalfedgeIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:144 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___l_e_n_g_t_h │ │ │ │ +Scalar calc_edge_length(HalfedgeHandle _heh) const │ │ │ │ +Calculates the length of the edge _heh. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:422 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::FaceHalfedgeIter FaceHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:168 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_h_i_s │ │ │ │ +PolyMeshT< Kernel > This │ │ │ │ +Self type. Used to specify iterators/circulators. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:95 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +Kernel::ConstFaceFaceIter ConstFaceFaceIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:180 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ +void split(FaceHandle _fh, const Point &_p) │ │ │ │ +Face split (= 1-to-n split) │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:589 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ +Kernel::Color Color │ │ │ │ +Color type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_1_D │ │ │ │ +Kernel::TexCoord1D TexCoord1D │ │ │ │ +TexCoord1D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:118 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___n_o_r_m_a_l │ │ │ │ +Normal calc_normal(FaceHandle _fh) const │ │ │ │ +same as calc_face_normal │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:187 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Kernel::VertexIter VertexIter │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x___d_i_r_t_y │ │ │ │ +SmartVertexHandle new_vertex_dirty(const Point _p) │ │ │ │ +Same as new_vertex(const Point&) but never shrinks, only enlarges the vertex │ │ │ │ +property vectors. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:228 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t │ │ │ │ +Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const │ │ │ │ +calculates the dihedral angle on the halfedge _heh │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:533 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l │ │ │ │ +Normal calc_vertex_normal(VertexHandle _vh) const │ │ │ │ +Calculate vertex normal for one specific vertex. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT_impl.hh:483 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ +allows easier access t... │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00659_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/SmartRange.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/SmartHandles.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SmartRange.hh
│ │ │ +
SmartHandles.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,415 +136,514 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43#pragma once
│ │ │ -
44
│ │ │ -
45#include <utility>
│ │ │ -
46#include <array>
│ │ │ -
47#include <vector>
│ │ │ -
48#include <set>
│ │ │ +
42#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ +
43#error Do not include this directly, include instead PolyConnectivity.hh
│ │ │ +
44#endif//OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ +
45
│ │ │ +
46#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
47
│ │ │ +
48//== NAMESPACES ===============================================================
│ │ │
49
│ │ │ -
50//== NAMESPACES ===============================================================
│ │ │ +
50namespace OpenMesh {
│ │ │
51
│ │ │ -
52namespace OpenMesh {
│ │ │ +
52//== FORWARD DECLARATION ======================================================
│ │ │
53
│ │ │ -
54//== FORWARD DECLARATION ======================================================
│ │ │ -
55
│ │ │ -
56//== CLASS DEFINITION =========================================================
│ │ │ -
57
│ │ │ -
58namespace {
│ │ │ +
54struct SmartVertexHandle;
│ │ │ +
55struct SmartHalfedgeHandle;
│ │ │ +
56struct SmartEdgeHandle;
│ │ │ +
57struct SmartFaceHandle;
│ │ │ +
58
│ │ │
59
│ │ │ -
60struct Identity
│ │ │ -
61{
│ │ │ -
62 template <typename T>
│ │ │ -
63 T operator()(const T& _t) const { return _t; }
│ │ │ -
64};
│ │ │ -
65
│ │ │ -
66}
│ │ │ +
60//== CLASS DEFINITION =========================================================
│ │ │ +
61
│ │ │ +
│ │ │ +
63class OPENMESHDLLEXPORT SmartBaseHandle
│ │ │ +
64{
│ │ │ +
65public:
│ │ │ +
66 explicit SmartBaseHandle(const PolyConnectivity* _mesh = nullptr) : mesh_(_mesh) {}
│ │ │
67
│ │ │ -
68template <typename RangeT, typename HandleT, typename Functor>
│ │ │ -
69struct FilteredSmartRangeT;
│ │ │ +
69 const PolyConnectivity* mesh() const { return mesh_; }
│ │ │
70
│ │ │ -
72template <typename RangeT, typename HandleT>
│ │ │ -
│ │ │ - │ │ │ -
74{
│ │ │ -
75 using Handle = HandleT;
│ │ │ - │ │ │ -
77 using Range = RangeT;
│ │ │ -
78
│ │ │ -
79 // TODO: Someone with better c++ knowledge may improve the code below.
│ │ │ -
80
│ │ │ -
87 template <typename Functor>
│ │ │ +
71 // TODO: should operators ==, !=, < look at mesh_?
│ │ │ +
72
│ │ │ +
73private:
│ │ │ +
74 const PolyConnectivity* mesh_;
│ │ │ +
75
│ │ │ +
76};
│ │ │ +
│ │ │ +
77
│ │ │ +
79template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
81{
│ │ │ +
82public:
│ │ │ +
│ │ │ +
84 bool feature() const;
│ │ │ +
│ │ │ +
86 bool selected() const;
│ │ │
│ │ │ -
88 auto sum(Functor&& f) -> typename std::decay<decltype (f(std::declval<HandleT>()))>::type
│ │ │ -
89 {
│ │ │ -
90 auto range = static_cast<const RangeT*>(this);
│ │ │ -
91 auto begin = range->begin();
│ │ │ -
92 auto end = range->end();
│ │ │ -
93 assert(begin != end);
│ │ │ -
94 typename std::decay<decltype (f(*begin))>::type result = f(*begin);
│ │ │ -
95 auto it = begin;
│ │ │ -
96 ++it;
│ │ │ -
97 for (; it != end; ++it)
│ │ │ -
98 result += f(*it);
│ │ │ -
99 return result;
│ │ │ -
100 }
│ │ │ -
│ │ │ -
101
│ │ │ -
108 template <typename Functor>
│ │ │ -
│ │ │ -
109 auto avg(Functor&& f) -> typename std::decay<decltype (f(std::declval<HandleT>()))>::type
│ │ │ -
110 {
│ │ │ -
111 auto range = static_cast<const RangeT*>(this);
│ │ │ -
112 auto begin = range->begin();
│ │ │ -
113 auto end = range->end();
│ │ │ -
114 assert(begin != end);
│ │ │ -
115 typename std::decay<decltype (f(*begin))>::type result = f(*begin);
│ │ │ -
116 auto it = begin;
│ │ │ -
117 ++it;
│ │ │ -
118 int n_elements = 1;
│ │ │ -
119 for (; it != end; ++it)
│ │ │ -
120 {
│ │ │ -
121 result += f(*it);
│ │ │ -
122 ++n_elements;
│ │ │ -
123 }
│ │ │ -
124 return (1.0 / n_elements) * result;
│ │ │ -
125 }
│ │ │ -
│ │ │ -
126
│ │ │ -
134 template <typename Functor, typename WeightFunctor>
│ │ │ -
│ │ │ -
135 auto avg(Functor&& f, WeightFunctor&& w) -> typename std::decay<decltype ((1.0/(w(std::declval<HandleT>())+w(std::declval<HandleT>())))*f(std::declval<HandleT>()))>::type
│ │ │ -
136 {
│ │ │ -
137 auto range = static_cast<const RangeT*>(this);
│ │ │ -
138 auto begin = range->begin();
│ │ │ -
139 auto end = range->end();
│ │ │ -
140 assert(begin != end);
│ │ │ -
141 typename std::decay<decltype (w(*begin))>::type weight = w(*begin);
│ │ │ -
142 typename std::decay<decltype (w(*begin)*f(*begin))>::type result = weight * f(*begin);
│ │ │ -
143 typename std::decay<decltype (w(*begin)+w(*begin))>::type weight_sum = weight;
│ │ │ -
144 auto it = begin;
│ │ │ -
145 ++it;
│ │ │ -
146 for (; it != end; ++it)
│ │ │ -
147 {
│ │ │ -
148 weight = w(*it);
│ │ │ -
149 result += weight*f(*it);
│ │ │ -
150 weight_sum += weight;
│ │ │ -
151 }
│ │ │ -
152 return (1.0 / weight_sum) * result;
│ │ │ -
153 }
│ │ │ -
│ │ │ -
154
│ │ │ -
162 template <typename Functor>
│ │ │ -
│ │ │ -
163 auto any_of(Functor&& f) -> bool
│ │ │ -
164 {
│ │ │ -
165 auto range = static_cast<const RangeT*>(this);
│ │ │ -
166 for (auto e : *range)
│ │ │ -
167 if (f(e))
│ │ │ -
168 return true;
│ │ │ -
169 return false;
│ │ │ -
170 }
│ │ │ -
│ │ │ -
171
│ │ │ -
179 template <typename Functor>
│ │ │ -
│ │ │ -
180 auto all_of(Functor&& f) -> bool
│ │ │ -
181 {
│ │ │ -
182 auto range = static_cast<const RangeT*>(this);
│ │ │ -
183 for (auto e : *range)
│ │ │ -
184 if (!f(e))
│ │ │ -
185 return false;
│ │ │ -
186 return true;
│ │ │ -
187 }
│ │ │ -
│ │ │ -
188
│ │ │ -
198 template <int n, typename Functor = Identity>
│ │ │ -
│ │ │ -
199 auto to_array(Functor&& f = {}) -> std::array<typename std::decay<decltype (f(std::declval<HandleT>()))>::type, n>
│ │ │ -
200 {
│ │ │ -
201 auto range = static_cast<const RangeT*>(this);
│ │ │ -
202 std::array<typename std::decay<decltype (f(std::declval<HandleT>()))>::type, n> res;
│ │ │ -
203 auto it = range->begin();
│ │ │ -
204 auto end = range->end();
│ │ │ -
205 int i = 0;
│ │ │ -
206 while (i < n && it != end)
│ │ │ -
207 res[i++] = f(*(it++));
│ │ │ -
208 return res;
│ │ │ -
209 }
│ │ │ -
│ │ │ -
210
│ │ │ -
218 template <typename Functor = Identity>
│ │ │ -
│ │ │ -
219 auto to_vector(Functor&& f = {}) -> std::vector<typename std::decay<decltype (f(std::declval<HandleT>()))>::type>
│ │ │ -
220 {
│ │ │ -
221 auto range = static_cast<const RangeT*>(this);
│ │ │ -
222 std::vector<typename std::decay<decltype (f(std::declval<HandleT>()))>::type> res;
│ │ │ -
223 for (const auto& e : *range)
│ │ │ -
224 res.push_back(f(e));
│ │ │ -
225 return res;
│ │ │ -
226 }
│ │ │ -
│ │ │ -
227
│ │ │ -
235 template <typename Functor = Identity>
│ │ │ -
│ │ │ -
236 auto to_set(Functor&& f = {}) -> std::set<typename std::decay<decltype (f(std::declval<HandleT>()))>::type>
│ │ │ -
237 {
│ │ │ -
238 auto range = static_cast<const RangeT*>(this);
│ │ │ -
239 std::set<typename std::decay<decltype (f(std::declval<HandleT>()))>::type> res;
│ │ │ -
240 for (const auto& e : *range)
│ │ │ -
241 res.insert(f(e));
│ │ │ -
242 return res;
│ │ │ -
243 }
│ │ │ -
│ │ │ -
244
│ │ │ -
253 template <typename Functor>
│ │ │ -
│ │ │ -
254 auto first(Functor&& f = {}) -> HandleT
│ │ │ -
255 {
│ │ │ -
256 auto range = static_cast<const RangeT*>(this);
│ │ │ -
257 for (const auto& e : *range)
│ │ │ -
258 if (f(e))
│ │ │ -
259 return e;
│ │ │ -
260 return HandleT();
│ │ │ -
261 }
│ │ │ +
88 bool tagged() const;
│ │ │ +
│ │ │ +
90 bool tagged2() const;
│ │ │ +
│ │ │ +
92 bool locked() const;
│ │ │ +
│ │ │ +
94 bool hidden() const;
│ │ │ +
│ │ │ +
96 bool deleted() const;
│ │ │ +
97};
│ │ │ +
98
│ │ │ +
100template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
102{
│ │ │ +
103public:
│ │ │ +
│ │ │ +
105 bool is_boundary() const;
│ │ │ +
106};
│ │ │ +
107
│ │ │ +
│ │ │ +
109struct OPENMESHDLLEXPORT SmartVertexHandle : public SmartBaseHandle, VertexHandle, SmartHandleStatusPredicates<SmartVertexHandle>, SmartHandleBoundaryPredicate<SmartVertexHandle>
│ │ │ +
110{
│ │ │ +
111 explicit SmartVertexHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), VertexHandle(_idx) {}
│ │ │ +
112
│ │ │ +
114 SmartHalfedgeHandle out() const;
│ │ │ +
116 SmartHalfedgeHandle halfedge() const; // alias for out
│ │ │ +
118 SmartHalfedgeHandle in() const;
│ │ │ +
119
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
139 PolyConnectivity::ConstVertexIHalfedgeRange incoming_halfedges() const;
│ │ │ +
141 PolyConnectivity::ConstVertexIHalfedgeCWRange incoming_halfedges_cw() const;
│ │ │ +
143 PolyConnectivity::ConstVertexIHalfedgeCCWRange incoming_halfedges_ccw() const;
│ │ │ +
145 PolyConnectivity::ConstVertexIHalfedgeRange incoming_halfedges(HalfedgeHandle _heh) const;
│ │ │ +
147 PolyConnectivity::ConstVertexIHalfedgeCWRange incoming_halfedges_cw(HalfedgeHandle _heh) const;
│ │ │ +
149 PolyConnectivity::ConstVertexIHalfedgeCCWRange incoming_halfedges_ccw(HalfedgeHandle _heh) const;
│ │ │ +
151 PolyConnectivity::ConstVertexOHalfedgeRange outgoing_halfedges() const;
│ │ │ +
153 PolyConnectivity::ConstVertexOHalfedgeCWRange outgoing_halfedges_cw() const;
│ │ │ +
155 PolyConnectivity::ConstVertexOHalfedgeCCWRange outgoing_halfedges_ccw() const;
│ │ │ +
157 PolyConnectivity::ConstVertexOHalfedgeRange outgoing_halfedges(HalfedgeHandle _heh) const;
│ │ │ +
159 PolyConnectivity::ConstVertexOHalfedgeCWRange outgoing_halfedges_cw(HalfedgeHandle _heh) const;
│ │ │ +
161 PolyConnectivity::ConstVertexOHalfedgeCCWRange outgoing_halfedges_ccw(HalfedgeHandle _heh) const;
│ │ │ +
162
│ │ │ +
164 uint valence() const;
│ │ │ +
166 bool is_manifold() const;
│ │ │ +
167};
│ │ │ +
│ │ │ +
168
│ │ │ +
│ │ │ +
169struct OPENMESHDLLEXPORT SmartHalfedgeHandle : public SmartBaseHandle, HalfedgeHandle, SmartHandleStatusPredicates<SmartHalfedgeHandle>, SmartHandleBoundaryPredicate<SmartHalfedgeHandle>
│ │ │ +
170{
│ │ │ +
171 explicit SmartHalfedgeHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), HalfedgeHandle(_idx) {}
│ │ │ +
172
│ │ │ +
174 SmartHalfedgeHandle next() const;
│ │ │ +
176 SmartHalfedgeHandle prev() const;
│ │ │ +
178 SmartHalfedgeHandle opp() const;
│ │ │ +
180 SmartVertexHandle to() const;
│ │ │ +
182 SmartVertexHandle from() const;
│ │ │ +
184 SmartEdgeHandle edge() const;
│ │ │ +
186 SmartFaceHandle face() const;
│ │ │ +
187
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
194};
│ │ │ +
│ │ │ +
195
│ │ │ +
│ │ │ +
196struct OPENMESHDLLEXPORT SmartEdgeHandle : public SmartBaseHandle, EdgeHandle, SmartHandleStatusPredicates<SmartEdgeHandle>, SmartHandleBoundaryPredicate<SmartEdgeHandle>
│ │ │ +
197{
│ │ │ +
198 explicit SmartEdgeHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), EdgeHandle(_idx) {}
│ │ │ +
199
│ │ │ +
201 SmartHalfedgeHandle halfedge(unsigned int _i) const;
│ │ │ +
203 SmartHalfedgeHandle h(unsigned int _i) const;
│ │ │ +
205 SmartHalfedgeHandle h0() const;
│ │ │ +
207 SmartHalfedgeHandle h1() const;
│ │ │ +
209 SmartVertexHandle vertex(unsigned int _i) const;
│ │ │ +
211 SmartVertexHandle v(unsigned int _i) const;
│ │ │ +
213 SmartVertexHandle v0() const;
│ │ │ +
215 SmartVertexHandle v1() const;
│ │ │ +
216
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
225};
│ │ │ +
│ │ │ +
226
│ │ │ +
│ │ │ +
227struct OPENMESHDLLEXPORT SmartFaceHandle : public SmartBaseHandle, FaceHandle, SmartHandleStatusPredicates<SmartFaceHandle>, SmartHandleBoundaryPredicate<SmartFaceHandle>
│ │ │ +
228{
│ │ │ +
229 explicit SmartFaceHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), FaceHandle(_idx) {}
│ │ │ +
230
│ │ │ +
232 SmartHalfedgeHandle halfedge() const;
│ │ │ +
233
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
258
│ │ │ +
260 uint valence() const;
│ │ │ +
261};
│ │ │
│ │ │
262
│ │ │ -
269 template <typename Functor>
│ │ │ -
│ │ │ -
270 auto min(Functor&& f) -> typename std::decay<decltype (f(std::declval<HandleT>()))>::type
│ │ │ -
271 {
│ │ │ -
272 using std::min;
│ │ │ -
273
│ │ │ -
274 auto range = static_cast<const RangeT*>(this);
│ │ │ -
275 auto it = range->begin();
│ │ │ -
276 auto end = range->end();
│ │ │ -
277 assert(it != end);
│ │ │ -
278
│ │ │ -
279 typename std::decay<decltype (f(std::declval<HandleT>()))>::type res = f(*it);
│ │ │ -
280 ++it;
│ │ │ +
263
│ │ │ +
265inline SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity* _mesh) { return SmartVertexHandle (_vh.idx(), _mesh); }
│ │ │ +
267inline SmartHalfedgeHandle make_smart(HalfedgeHandle _hh, const PolyConnectivity* _mesh) { return SmartHalfedgeHandle(_hh.idx(), _mesh); }
│ │ │ +
269inline SmartEdgeHandle make_smart(EdgeHandle _eh, const PolyConnectivity* _mesh) { return SmartEdgeHandle (_eh.idx(), _mesh); }
│ │ │ +
271inline SmartFaceHandle make_smart(FaceHandle _fh, const PolyConnectivity* _mesh) { return SmartFaceHandle (_fh.idx(), _mesh); }
│ │ │ +
272
│ │ │ +
274inline SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity& _mesh) { return SmartVertexHandle (_vh.idx(), &_mesh); }
│ │ │ +
276inline SmartHalfedgeHandle make_smart(HalfedgeHandle _hh, const PolyConnectivity& _mesh) { return SmartHalfedgeHandle(_hh.idx(), &_mesh); }
│ │ │ +
278inline SmartEdgeHandle make_smart(EdgeHandle _eh, const PolyConnectivity& _mesh) { return SmartEdgeHandle (_eh.idx(), &_mesh); }
│ │ │ +
280inline SmartFaceHandle make_smart(FaceHandle _fh, const PolyConnectivity& _mesh) { return SmartFaceHandle (_fh.idx(), &_mesh); }
│ │ │
281
│ │ │ -
282 for (; it != end; ++it)
│ │ │ -
283 res = min(res, f(*it));
│ │ │ -
284
│ │ │ -
285 return res;
│ │ │ -
286 }
│ │ │ -
│ │ │ -
287
│ │ │ -
294 template <typename Functor>
│ │ │ -
│ │ │ -
295 auto argmin(Functor&& f) -> HandleT
│ │ │ -
296 {
│ │ │ -
297 auto range = static_cast<const RangeT*>(this);
│ │ │ -
298 auto it = range->begin();
│ │ │ -
299 auto min_it = it;
│ │ │ -
300 auto end = range->end();
│ │ │ -
301 assert(it != end);
│ │ │ -
302
│ │ │ -
303 typename std::decay<decltype (f(std::declval<HandleT>()))>::type curr_min = f(*it);
│ │ │ -
304 ++it;
│ │ │ -
305
│ │ │ -
306 for (; it != end; ++it)
│ │ │ -
307 {
│ │ │ -
308 auto val = f(*it);
│ │ │ -
309 if (val < curr_min)
│ │ │ -
310 {
│ │ │ -
311 curr_min = val;
│ │ │ -
312 min_it = it;
│ │ │ -
313 }
│ │ │ -
314 }
│ │ │ -
315
│ │ │ -
316 return *min_it;
│ │ │ -
317 }
│ │ │ +
282
│ │ │ +
283// helper to convert Handle Types to Smarthandle Types
│ │ │ +
284template <typename HandleT>
│ │ │ + │ │ │ +
286
│ │ │ +
287template <> struct SmartHandle<VertexHandle> { using type = SmartVertexHandle; };
│ │ │ +
288template <> struct SmartHandle<HalfedgeHandle> { using type = SmartHalfedgeHandle; };
│ │ │ +
289template <> struct SmartHandle<EdgeHandle> { using type = SmartEdgeHandle; };
│ │ │ +
290template <> struct SmartHandle<FaceHandle> { using type = SmartFaceHandle; };
│ │ │ +
291
│ │ │ +
292
│ │ │ +
293template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
295{
│ │ │ +
296 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
297 assert(handle.mesh() != nullptr);
│ │ │ +
298 return handle.mesh()->status(handle).feature();
│ │ │ +
299}
│ │ │ +
│ │ │ +
300
│ │ │ +
301template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
303{
│ │ │ +
304 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
305 assert(handle.mesh() != nullptr);
│ │ │ +
306 return handle.mesh()->status(handle).selected();
│ │ │ +
307}
│ │ │ +
│ │ │ +
308
│ │ │ +
309template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
311{
│ │ │ +
312 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
313 assert(handle.mesh() != nullptr);
│ │ │ +
314 return handle.mesh()->status(handle).tagged();
│ │ │ +
315}
│ │ │ +
│ │ │ +
316
│ │ │ +
317template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
319{
│ │ │ +
320 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
321 assert(handle.mesh() != nullptr);
│ │ │ +
322 return handle.mesh()->status(handle).tagged2();
│ │ │ +
323}
│ │ │
│ │ │ -
318
│ │ │ -
325 template <typename Functor>
│ │ │ +
324
│ │ │ +
325template <typename HandleType>
│ │ │
│ │ │ -
326 auto max(Functor&& f) -> typename std::decay<decltype (f(std::declval<HandleT>()))>::type
│ │ │ -
327 {
│ │ │ -
328 using std::max;
│ │ │ -
329
│ │ │ -
330 auto range = static_cast<const RangeT*>(this);
│ │ │ -
331 auto it = range->begin();
│ │ │ -
332 auto end = range->end();
│ │ │ -
333 assert(it != end);
│ │ │ -
334
│ │ │ -
335 typename std::decay<decltype (f(std::declval<HandleT>()))>::type res = f(*it);
│ │ │ -
336 ++it;
│ │ │ -
337
│ │ │ -
338 for (; it != end; ++it)
│ │ │ -
339 res = max(res, f(*it));
│ │ │ + │ │ │ +
327{
│ │ │ +
328 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
329 assert(handle.mesh() != nullptr);
│ │ │ +
330 return handle.mesh()->status(handle).locked();
│ │ │ +
331}
│ │ │ +
│ │ │ +
332
│ │ │ +
333template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
335{
│ │ │ +
336 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
337 assert(handle.mesh() != nullptr);
│ │ │ +
338 return handle.mesh()->status(handle).hidden();
│ │ │ +
339}
│ │ │ +
│ │ │
340
│ │ │ -
341 return res;
│ │ │ -
342 }
│ │ │ +
341template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
343{
│ │ │ +
344 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
345 assert(handle.mesh() != nullptr);
│ │ │ +
346 return handle.mesh()->status(handle).deleted();
│ │ │ +
347}
│ │ │ +
│ │ │ +
348
│ │ │ +
349template <typename HandleType>
│ │ │ +
│ │ │ + │ │ │ +
351{
│ │ │ +
352 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ +
353 assert(handle.mesh() != nullptr);
│ │ │ +
354 return handle.mesh()->is_boundary(handle);
│ │ │ +
355}
│ │ │ +
│ │ │ +
│ │ │ +
356
│ │ │ +
│ │ │ + │ │ │ +
358{
│ │ │ +
359 assert(mesh() != nullptr);
│ │ │ +
360 return make_smart(mesh()->halfedge_handle(*this), mesh());
│ │ │ +
361}
│ │ │
│ │ │ -
343
│ │ │ -
344
│ │ │ -
351 template <typename Functor>
│ │ │ -
│ │ │ -
352 auto argmax(Functor&& f) -> HandleT
│ │ │ -
353 {
│ │ │ -
354 auto range = static_cast<const RangeT*>(this);
│ │ │ -
355 auto it = range->begin();
│ │ │ -
356 auto max_it = it;
│ │ │ -
357 auto end = range->end();
│ │ │ -
358 assert(it != end);
│ │ │ -
359
│ │ │ -
360 typename std::decay<decltype (f(std::declval<HandleT>()))>::type curr_max = f(*it);
│ │ │ -
361 ++it;
│ │ │
362
│ │ │ -
363 for (; it != end; ++it)
│ │ │ -
364 {
│ │ │ -
365 auto val = f(*it);
│ │ │ -
366 if (val > curr_max)
│ │ │ -
367 {
│ │ │ -
368 curr_max = val;
│ │ │ -
369 max_it = it;
│ │ │ -
370 }
│ │ │ -
371 }
│ │ │ -
372
│ │ │ -
373 return *max_it;
│ │ │ -
374 }
│ │ │ +
│ │ │ + │ │ │ +
364{
│ │ │ +
365 return out();
│ │ │ +
366}
│ │ │ +
│ │ │ +
367
│ │ │ +
│ │ │ + │ │ │ +
369{
│ │ │ +
370 return out().opp();
│ │ │ +
371}
│ │ │
│ │ │ -
375
│ │ │ -
383 template <typename Functor>
│ │ │ -
│ │ │ -
384 auto minmax(Functor&& f) -> std::pair<typename std::decay<decltype (f(std::declval<HandleT>()))>::type,
│ │ │ -
385 typename std::decay<decltype (f(std::declval<HandleT>()))>::type>
│ │ │ -
386 {
│ │ │ -
387 return std::make_pair(this->min(f), this->max(f));
│ │ │ -
388 }
│ │ │ +
372
│ │ │ +
│ │ │ +
373inline uint SmartVertexHandle::valence() const
│ │ │ +
374{
│ │ │ +
375 assert(mesh() != nullptr);
│ │ │ +
376 return mesh()->valence(*this);
│ │ │ +
377}
│ │ │ +
│ │ │ +
378
│ │ │ +
│ │ │ + │ │ │ +
380{
│ │ │ +
381 assert(mesh() != nullptr);
│ │ │ +
382 return mesh()->is_manifold(*this);
│ │ │ +
383}
│ │ │ +
│ │ │ +
384
│ │ │ +
│ │ │ + │ │ │ +
386{
│ │ │ +
387 assert(mesh() != nullptr);
│ │ │ +
388 return make_smart(mesh()->next_halfedge_handle(*this), mesh());
│ │ │ +
389}
│ │ │
│ │ │ -
389
│ │ │
390
│ │ │ -
397 template <typename Functor>
│ │ │ -
│ │ │ -
398 auto count_if(Functor&& f) -> int
│ │ │ -
399 {
│ │ │ -
400 int count = 0;
│ │ │ -
401 auto range = static_cast<const RangeT*>(this);
│ │ │ -
402 for (const auto& e : *range)
│ │ │ -
403 if (f(e))
│ │ │ -
404 ++count;
│ │ │ -
405 return count;
│ │ │ -
406 }
│ │ │ +
│ │ │ + │ │ │ +
392{
│ │ │ +
393 assert(mesh() != nullptr);
│ │ │ +
394 return make_smart(mesh()->prev_halfedge_handle(*this), mesh());
│ │ │ +
395}
│ │ │ +
│ │ │ +
396
│ │ │ +
│ │ │ + │ │ │ +
398{
│ │ │ +
399 assert(mesh() != nullptr);
│ │ │ +
400 return make_smart(mesh()->opposite_halfedge_handle(*this), mesh());
│ │ │ +
401}
│ │ │ +
│ │ │ +
402
│ │ │ +
│ │ │ + │ │ │ +
404{
│ │ │ +
405 assert(mesh() != nullptr);
│ │ │ +
406 return make_smart(mesh()->to_vertex_handle(*this), mesh());
│ │ │ +
407}
│ │ │
│ │ │ -
407
│ │ │
408
│ │ │ -
415 template <typename Functor>
│ │ │ -
│ │ │ -
416 auto for_each(Functor&& f) -> void
│ │ │ -
417 {
│ │ │ -
418 auto range = static_cast<const RangeT*>(this);
│ │ │ -
419 for (const auto& e : *range)
│ │ │ -
420 f(e);
│ │ │ -
421 }
│ │ │ -
│ │ │ -
422
│ │ │ -
423
│ │ │ -
430 template <typename Functor>
│ │ │ -
│ │ │ - │ │ │ -
432 {
│ │ │ -
433 auto range = static_cast<const RangeT*>(this);
│ │ │ -
434 return FilteredSmartRangeT<SmartRange, Handle, Functor>(std::forward<Functor>(f), (*range).begin(), (*range).end());
│ │ │ -
435 }
│ │ │ -
│ │ │ -
436};
│ │ │ +
│ │ │ + │ │ │ +
410{
│ │ │ +
411 assert(mesh() != nullptr);
│ │ │ +
412 return make_smart(mesh()->from_vertex_handle(*this), mesh());
│ │ │ +
413}
│ │ │ +
│ │ │ +
414
│ │ │ +
│ │ │ + │ │ │ +
416{
│ │ │ +
417 assert(mesh() != nullptr);
│ │ │ +
418 return make_smart(mesh()->edge_handle(*this), mesh());
│ │ │ +
419}
│ │ │ +
│ │ │ +
420
│ │ │ +
│ │ │ + │ │ │ +
422{
│ │ │ +
423 assert(mesh() != nullptr);
│ │ │ +
424 return make_smart(mesh()->face_handle(*this), mesh());
│ │ │ +
425}
│ │ │ +
│ │ │ +
426
│ │ │ +
│ │ │ +
427inline SmartHalfedgeHandle SmartEdgeHandle::halfedge(unsigned int _i = 0) const
│ │ │ +
428{
│ │ │ +
429 assert(mesh() != nullptr);
│ │ │ +
430 return make_smart(mesh()->halfedge_handle(*this, _i), mesh());
│ │ │ +
431}
│ │ │ +
│ │ │ +
432
│ │ │ +
│ │ │ +
433inline SmartHalfedgeHandle SmartEdgeHandle::h(unsigned int _i = 0) const
│ │ │ +
434{
│ │ │ +
435 return halfedge(_i);
│ │ │ +
436}
│ │ │
│ │ │
437
│ │ │ -
438
│ │ │ -
440template <typename RangeT, typename HandleT, typename Functor>
│ │ │ -
│ │ │ -
441struct FilteredSmartRangeT : public SmartRangeT<FilteredSmartRangeT<RangeT, HandleT, Functor>, HandleT>
│ │ │ -
442{
│ │ │ - │ │ │ -
444 using BaseIterator = decltype((std::declval<typename RangeT::Range>().begin()));
│ │ │ -
445
│ │ │ -
│ │ │ -
446 struct FilteredIterator : public BaseIterator
│ │ │ -
447 {
│ │ │ -
448
│ │ │ -
449 FilteredIterator(Functor f, BaseIterator it, BaseIterator end): BaseIterator(it), f_(f), end_(end)
│ │ │ -
450 {
│ │ │ -
451 if (!BaseIterator::operator==(end_) && !f_(*(*this))) // if start is not valid go to first valid one
│ │ │ -
452 operator++();
│ │ │ -
453 }
│ │ │ -
454
│ │ │ -
455 FilteredIterator(const FilteredIterator& other) = default;
│ │ │ -
456
│ │ │ -
457 FilteredIterator& operator=(const FilteredIterator& other)
│ │ │ -
458 {
│ │ │ -
459 BaseIterator::operator=(other);
│ │ │ -
460 end_ = other.end_;
│ │ │ -
461 return *this;
│ │ │ -
462 }
│ │ │ -
463
│ │ │ -
464 FilteredIterator& operator++()
│ │ │ -
465 {
│ │ │ -
466 if (BaseIterator::operator==(end_)) // don't go past end
│ │ │ -
467 return *this;
│ │ │ -
468
│ │ │ -
469 // go to next valid one
│ │ │ -
470 do
│ │ │ -
471 BaseIterator::operator++();
│ │ │ -
472 while (BaseIterator::operator!=(end_) && !f_(*(*this)));
│ │ │ -
473 return *this;
│ │ │ -
474 }
│ │ │ -
475
│ │ │ -
476 Functor f_; // Should iterators always get a reference to filter stored in range?
│ │ │ -
477 // Should iterators stay valid after range goes out of scope?
│ │ │ -
478 BaseIterator end_;
│ │ │ -
479 };
│ │ │ -
│ │ │ -
480
│ │ │ -
481 FilteredSmartRangeT(Functor&& f, BaseIterator begin, BaseIterator end) : f_(std::forward<Functor>(f)), begin_(std::move(begin)), end_(std::move(end)){}
│ │ │ -
482 FilteredIterator begin() const { return FilteredIterator(f_, begin_, end_); }
│ │ │ -
483 FilteredIterator end() const { return FilteredIterator(f_, end_, end_); }
│ │ │ -
484
│ │ │ -
485 Functor f_;
│ │ │ -
486 BaseIterator begin_;
│ │ │ -
487 BaseIterator end_;
│ │ │ -
488};
│ │ │ -
│ │ │ -
489
│ │ │ -
490
│ │ │ -
491
│ │ │ -
492//=============================================================================
│ │ │ -
493} // namespace OpenMesh
│ │ │ -
494//=============================================================================
│ │ │ -
495
│ │ │ -
496//=============================================================================
│ │ │ +
│ │ │ + │ │ │ +
439{
│ │ │ +
440 return h(0);
│ │ │ +
441}
│ │ │ +
│ │ │ +
442
│ │ │ +
│ │ │ + │ │ │ +
444{
│ │ │ +
445 return h(1);
│ │ │ +
446}
│ │ │ +
│ │ │ +
447
│ │ │ +
│ │ │ +
448inline SmartVertexHandle SmartEdgeHandle::vertex(unsigned int _i) const
│ │ │ +
449{
│ │ │ +
450 return halfedge(_i).from();
│ │ │ +
451}
│ │ │ +
│ │ │ +
452
│ │ │ +
│ │ │ +
453inline SmartVertexHandle SmartEdgeHandle::v(unsigned int _i) const
│ │ │ +
454{
│ │ │ +
455 return vertex(_i);
│ │ │ +
456}
│ │ │ +
│ │ │ +
457
│ │ │ +
│ │ │ + │ │ │ +
459{
│ │ │ +
460 return v(0);
│ │ │ +
461}
│ │ │ +
│ │ │ +
462
│ │ │ +
│ │ │ + │ │ │ +
464{
│ │ │ +
465 return v(1);
│ │ │ +
466}
│ │ │ +
│ │ │ +
467
│ │ │ +
│ │ │ + │ │ │ +
469{
│ │ │ +
470 assert(mesh() != nullptr);
│ │ │ +
471 return make_smart(mesh()->halfedge_handle(*this), mesh());
│ │ │ +
472}
│ │ │ +
│ │ │ +
473
│ │ │ +
│ │ │ +
474inline uint SmartFaceHandle::valence() const
│ │ │ +
475{
│ │ │ +
476 assert(mesh() != nullptr);
│ │ │ +
477 return mesh()->valence(*this);
│ │ │ +
478}
│ │ │ +
│ │ │ +
479
│ │ │ +
480//=============================================================================
│ │ │ +
481} // namespace OpenMesh
│ │ │ +
482//=============================================================================
│ │ │ +
483
│ │ │ +
484//=============================================================================
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │ +
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Class which applies a filter when iterating over elements.
Definition SmartRange.hh:442
│ │ │ -
Base class for all smart range types.
Definition SmartRange.hh:74
│ │ │ -
auto for_each(Functor &&f) -> void
Apply a functor to each element.
Definition SmartRange.hh:416
│ │ │ -
auto to_set(Functor &&f={}) -> std::set< typename std::decay< decltype(f(std::declval< HandleT >()))>::type >
Convert range to set.
Definition SmartRange.hh:236
│ │ │ -
auto sum(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Computes the sum of elements.
Definition SmartRange.hh:88
│ │ │ -
auto to_array(Functor &&f={}) -> std::array< typename std::decay< decltype(f(std::declval< HandleT >()))>::type, n >
Convert range to array.
Definition SmartRange.hh:199
│ │ │ -
auto argmax(Functor &&f) -> HandleT
Compute maximal element.
Definition SmartRange.hh:352
│ │ │ -
auto avg(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Computes the average of elements.
Definition SmartRange.hh:109
│ │ │ -
auto min(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Compute minimum.
Definition SmartRange.hh:270
│ │ │ -
auto minmax(Functor &&f) -> std::pair< typename std::decay< decltype(f(std::declval< HandleT >()))>::type, typename std::decay< decltype(f(std::declval< HandleT >()))>::type >
Computes minimum and maximum.
Definition SmartRange.hh:384
│ │ │ -
auto any_of(Functor &&f) -> bool
Check if any element fulfils condition.
Definition SmartRange.hh:163
│ │ │ -
auto first(Functor &&f={}) -> HandleT
Get the first element that fulfills a condition.
Definition SmartRange.hh:254
│ │ │ -
auto all_of(Functor &&f) -> bool
Check if all elements fulfil condition.
Definition SmartRange.hh:180
│ │ │ -
auto filtered(Functor &&f) -> FilteredSmartRangeT< SmartRange, Handle, Functor >
Only iterate over a subset of elements.
Definition SmartRange.hh:431
│ │ │ -
auto to_vector(Functor &&f={}) -> std::vector< typename std::decay< decltype(f(std::declval< HandleT >()))>::type >
Convert range to vector.
Definition SmartRange.hh:219
│ │ │ -
auto avg(Functor &&f, WeightFunctor &&w) -> typename std::decay< decltype((1.0/(w(std::declval< HandleT >())+w(std::declval< HandleT >()))) *f(std::declval< HandleT >()))>::type
Computes the weighted average of elements.
Definition SmartRange.hh:135
│ │ │ -
auto argmin(Functor &&f) -> HandleT
Compute minimal element.
Definition SmartRange.hh:295
│ │ │ -
auto max(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT >()))>::type
Compute maximum.
Definition SmartRange.hh:326
│ │ │ -
auto count_if(Functor &&f) -> int
Compute number of elements that satisfy a given predicate.
Definition SmartRange.hh:398
│ │ │ - │ │ │ +
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ +
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ +
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ +
uint valence(VertexHandle _vh) const
Vertex valence.
Definition PolyConnectivity.cc:1072
│ │ │ +
bool is_manifold(VertexHandle _vh) const
Is (the mesh at) vertex _vh two-manifold ?
Definition PolyConnectivity.cc:84
│ │ │ +
Base class for all smart handle types.
Definition SmartHandles.hh:64
│ │ │ +
const PolyConnectivity * mesh() const
Get the underlying mesh of this handle.
Definition SmartHandles.hh:69
│ │ │ +
Base class for all smart handle types that contains status related methods.
Definition SmartHandles.hh:81
│ │ │ +
bool selected() const
Returns true iff the handle is marked as selected.
Definition SmartHandles.hh:302
│ │ │ +
bool feature() const
Returns true iff the handle is marked as feature.
Definition SmartHandles.hh:294
│ │ │ +
bool locked() const
Returns true iff the handle is marked as locked.
Definition SmartHandles.hh:326
│ │ │ +
bool deleted() const
Returns true iff the handle is marked as deleted.
Definition SmartHandles.hh:342
│ │ │ +
bool tagged() const
Returns true iff the handle is marked as tagged.
Definition SmartHandles.hh:310
│ │ │ +
bool tagged2() const
Returns true iff the handle is marked as tagged2.
Definition SmartHandles.hh:318
│ │ │ +
bool hidden() const
Returns true iff the handle is marked as hidden.
Definition SmartHandles.hh:334
│ │ │ +
Base class for all smart handle types that contains status related methods.
Definition SmartHandles.hh:102
│ │ │ +
bool is_boundary() const
Returns true iff the handle is boundary.
Definition SmartHandles.hh:350
│ │ │ +
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ +
SmartHalfedgeHandle halfedge() const
Returns an outgoing halfedge.
Definition SmartHandles.hh:363
│ │ │ +
SmartHalfedgeHandle out() const
Returns an outgoing halfedge.
Definition SmartHandles.hh:357
│ │ │ +
bool is_manifold() const
Returns true iff (the mesh at) the vertex is two-manifold ?
Definition SmartHandles.hh:379
│ │ │ +
SmartHalfedgeHandle in() const
Returns an incoming halfedge.
Definition SmartHandles.hh:368
│ │ │ +
uint valence() const
Returns valence of the vertex.
Definition SmartHandles.hh:373
│ │ │ +
Definition SmartHandles.hh:170
│ │ │ +
SmartFaceHandle face() const
Returns incident face of halfedge.
Definition SmartHandles.hh:421
│ │ │ +
SmartVertexHandle from() const
Returns vertex at start of halfedge.
Definition SmartHandles.hh:409
│ │ │ +
SmartHalfedgeHandle next() const
Returns next halfedge handle.
Definition SmartHandles.hh:385
│ │ │ +
SmartHalfedgeHandle prev() const
Returns previous halfedge handle.
Definition SmartHandles.hh:391
│ │ │ +
SmartEdgeHandle edge() const
Returns incident edge of halfedge.
Definition SmartHandles.hh:415
│ │ │ +
SmartHalfedgeHandle opp() const
Returns opposite halfedge handle.
Definition SmartHandles.hh:397
│ │ │ +
SmartVertexHandle to() const
Returns vertex pointed to by halfedge.
Definition SmartHandles.hh:403
│ │ │ +
Definition SmartHandles.hh:197
│ │ │ +
SmartVertexHandle v(unsigned int _i) const
Shorthand for vertex()
Definition SmartHandles.hh:453
│ │ │ +
SmartVertexHandle v1() const
Shorthand for vertex(1)
Definition SmartHandles.hh:463
│ │ │ +
SmartHalfedgeHandle h(unsigned int _i) const
Shorthand for halfedge()
Definition SmartHandles.hh:433
│ │ │ +
SmartHalfedgeHandle h1() const
Shorthand for halfedge(1)
Definition SmartHandles.hh:443
│ │ │ +
SmartVertexHandle vertex(unsigned int _i) const
Returns one of the two incident vertices of the edge.
Definition SmartHandles.hh:448
│ │ │ +
SmartVertexHandle v0() const
Shorthand for vertex(0)
Definition SmartHandles.hh:458
│ │ │ +
SmartHalfedgeHandle halfedge(unsigned int _i) const
Returns one of the two halfedges of the edge.
Definition SmartHandles.hh:427
│ │ │ +
SmartHalfedgeHandle h0() const
Shorthand for halfedge(0)
Definition SmartHandles.hh:438
│ │ │ +
Definition SmartHandles.hh:228
│ │ │ +
uint valence() const
Returns the valence of the face.
Definition SmartHandles.hh:474
│ │ │ +
SmartHalfedgeHandle halfedge() const
Returns one of the halfedges of the face.
Definition SmartHandles.hh:468
│ │ │ +
Definition SmartHandles.hh:285
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SmartRange.hh │ │ │ │ +SmartHandles.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,477 +45,596 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43#pragma once │ │ │ │ -44 │ │ │ │ -45#include │ │ │ │ -46#include │ │ │ │ -47#include │ │ │ │ -48#include │ │ │ │ -49 │ │ │ │ -50//== NAMESPACES │ │ │ │ +42#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ +43#error Do not include this directly, include instead PolyConnectivity.hh │ │ │ │ +44#endif//OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ +45 │ │ │ │ +46#include │ │ │ │ +47 │ │ │ │ +48//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ +49 │ │ │ │ +50namespace _O_p_e_n_M_e_s_h { │ │ │ │ 51 │ │ │ │ -52namespace _O_p_e_n_M_e_s_h { │ │ │ │ -53 │ │ │ │ -54//== FORWARD DECLARATION │ │ │ │ +52//== FORWARD DECLARATION │ │ │ │ ====================================================== │ │ │ │ -55 │ │ │ │ -56//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -57 │ │ │ │ -58namespace { │ │ │ │ +53 │ │ │ │ +54struct SmartVertexHandle; │ │ │ │ +55struct SmartHalfedgeHandle; │ │ │ │ +56struct SmartEdgeHandle; │ │ │ │ +57struct SmartFaceHandle; │ │ │ │ +58 │ │ │ │ 59 │ │ │ │ -60struct Identity │ │ │ │ -61{ │ │ │ │ -62 template │ │ │ │ -63 T operator()(const T& _t) const { return _t; } │ │ │ │ -64}; │ │ │ │ -65 │ │ │ │ -66} │ │ │ │ +60//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +61 │ │ │ │ +_6_3class OPENMESHDLLEXPORT _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e │ │ │ │ +64{ │ │ │ │ +65public: │ │ │ │ +66 explicit _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = nullptr) : mesh_ │ │ │ │ +(_mesh) {} │ │ │ │ 67 │ │ │ │ -68template │ │ │ │ -69struct FilteredSmartRangeT; │ │ │ │ +_6_9 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _m_e_s_h() const { return mesh_; } │ │ │ │ 70 │ │ │ │ -72template │ │ │ │ -_7_3struct _S_m_a_r_t_R_a_n_g_e_T │ │ │ │ -74{ │ │ │ │ -75 using Handle = HandleT; │ │ │ │ -76 using _S_m_a_r_t_R_a_n_g_e = _S_m_a_r_t_R_a_n_g_e_T_<_R_a_n_g_e_T_,_ _H_a_n_d_l_e_T_>; │ │ │ │ -77 using Range = RangeT; │ │ │ │ -78 │ │ │ │ -79 // TODO: Someone with better c++ knowledge may improve the code below. │ │ │ │ -80 │ │ │ │ -87 template │ │ │ │ -_8_8 auto _s_u_m(Functor&& f) -> typename std::decay()))>::type │ │ │ │ -89 { │ │ │ │ -90 auto range = static_cast(this); │ │ │ │ -91 auto begin = range->begin(); │ │ │ │ -92 auto end = range->end(); │ │ │ │ -93 assert(begin != end); │ │ │ │ -94 typename std::decay::type result = f(*begin); │ │ │ │ -95 auto it = begin; │ │ │ │ -96 ++it; │ │ │ │ -97 for (; it != end; ++it) │ │ │ │ -98 result += f(*it); │ │ │ │ -99 return result; │ │ │ │ -100 } │ │ │ │ -101 │ │ │ │ -108 template │ │ │ │ -_1_0_9 auto _a_v_g(Functor&& f) -> typename std::decay()))>::type │ │ │ │ -110 { │ │ │ │ -111 auto range = static_cast(this); │ │ │ │ -112 auto begin = range->begin(); │ │ │ │ -113 auto end = range->end(); │ │ │ │ -114 assert(begin != end); │ │ │ │ -115 typename std::decay::type result = f(*begin); │ │ │ │ -116 auto it = begin; │ │ │ │ -117 ++it; │ │ │ │ -118 int n_elements = 1; │ │ │ │ -119 for (; it != end; ++it) │ │ │ │ -120 { │ │ │ │ -121 result += f(*it); │ │ │ │ -122 ++n_elements; │ │ │ │ -123 } │ │ │ │ -124 return (1.0 / n_elements) * result; │ │ │ │ -125 } │ │ │ │ -126 │ │ │ │ -134 template │ │ │ │ -_1_3_5 auto _a_v_g(Functor&& f, WeightFunctor&& w) -> typename std::decay())+w(std::declval())))*f(std:: │ │ │ │ -declval()))>::type │ │ │ │ -136 { │ │ │ │ -137 auto range = static_cast(this); │ │ │ │ -138 auto begin = range->begin(); │ │ │ │ -139 auto end = range->end(); │ │ │ │ -140 assert(begin != end); │ │ │ │ -141 typename std::decay::type weight = w(*begin); │ │ │ │ -142 typename std::decay::type result = weight * │ │ │ │ -f(*begin); │ │ │ │ -143 typename std::decay::type weight_sum = │ │ │ │ -weight; │ │ │ │ -144 auto it = begin; │ │ │ │ -145 ++it; │ │ │ │ -146 for (; it != end; ++it) │ │ │ │ -147 { │ │ │ │ -148 weight = w(*it); │ │ │ │ -149 result += weight*f(*it); │ │ │ │ -150 weight_sum += weight; │ │ │ │ -151 } │ │ │ │ -152 return (1.0 / weight_sum) * result; │ │ │ │ -153 } │ │ │ │ -154 │ │ │ │ -162 template │ │ │ │ -_1_6_3 auto _a_n_y___o_f(Functor&& f) -> bool │ │ │ │ -164 { │ │ │ │ -165 auto range = static_cast(this); │ │ │ │ -166 for (auto e : *range) │ │ │ │ -167 if (f(e)) │ │ │ │ -168 return true; │ │ │ │ -169 return false; │ │ │ │ -170 } │ │ │ │ -171 │ │ │ │ -179 template │ │ │ │ -_1_8_0 auto _a_l_l___o_f(Functor&& f) -> bool │ │ │ │ -181 { │ │ │ │ -182 auto range = static_cast(this); │ │ │ │ -183 for (auto e : *range) │ │ │ │ -184 if (!f(e)) │ │ │ │ -185 return false; │ │ │ │ -186 return true; │ │ │ │ -187 } │ │ │ │ -188 │ │ │ │ -198 template │ │ │ │ -_1_9_9 auto _t_o___a_r_r_a_y(Functor&& f = {}) -> std::array()))>::type, n> │ │ │ │ -200 { │ │ │ │ -201 auto range = static_cast(this); │ │ │ │ -202 std::array()))>:: │ │ │ │ -type, n> res; │ │ │ │ -203 auto it = range->begin(); │ │ │ │ -204 auto end = range->end(); │ │ │ │ -205 int i = 0; │ │ │ │ -206 while (i < n && it != end) │ │ │ │ -207 res[i++] = f(*(it++)); │ │ │ │ -208 return res; │ │ │ │ -209 } │ │ │ │ -210 │ │ │ │ -218 template │ │ │ │ -_2_1_9 auto _t_o___v_e_c_t_o_r(Functor&& f = {}) -> std::vector()))>::type> │ │ │ │ -220 { │ │ │ │ -221 auto range = static_cast(this); │ │ │ │ -222 std::vector()))>:: │ │ │ │ -type> res; │ │ │ │ -223 for (const auto& e : *range) │ │ │ │ -224 res.push_back(f(e)); │ │ │ │ -225 return res; │ │ │ │ -226 } │ │ │ │ -227 │ │ │ │ -235 template │ │ │ │ -_2_3_6 auto _t_o___s_e_t(Functor&& f = {}) -> std::set()))>::type> │ │ │ │ -237 { │ │ │ │ -238 auto range = static_cast(this); │ │ │ │ -239 std::set()))>::type> │ │ │ │ -res; │ │ │ │ -240 for (const auto& e : *range) │ │ │ │ -241 res.insert(f(e)); │ │ │ │ -242 return res; │ │ │ │ -243 } │ │ │ │ -244 │ │ │ │ -253 template │ │ │ │ -_2_5_4 auto _f_i_r_s_t(Functor&& f = {}) -> HandleT │ │ │ │ -255 { │ │ │ │ -256 auto range = static_cast(this); │ │ │ │ -257 for (const auto& e : *range) │ │ │ │ -258 if (f(e)) │ │ │ │ -259 return e; │ │ │ │ -260 return HandleT(); │ │ │ │ -261 } │ │ │ │ +71 // TODO: should operators ==, !=, < look at mesh_? │ │ │ │ +72 │ │ │ │ +73private: │ │ │ │ +74 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* mesh_; │ │ │ │ +75 │ │ │ │ +76}; │ │ │ │ +77 │ │ │ │ +79template │ │ │ │ +_8_0class _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s │ │ │ │ +81{ │ │ │ │ +82public: │ │ │ │ +_8_4 bool _f_e_a_t_u_r_e() const; │ │ │ │ +_8_6 bool _s_e_l_e_c_t_e_d() const; │ │ │ │ +_8_8 bool _t_a_g_g_e_d() const; │ │ │ │ +_9_0 bool _t_a_g_g_e_d_2() const; │ │ │ │ +_9_2 bool _l_o_c_k_e_d() const; │ │ │ │ +_9_4 bool _h_i_d_d_e_n() const; │ │ │ │ +_9_6 bool _d_e_l_e_t_e_d() const; │ │ │ │ +97}; │ │ │ │ +98 │ │ │ │ +100template │ │ │ │ +_1_0_1class _S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +102{ │ │ │ │ +103public: │ │ │ │ +_1_0_5 bool _i_s___b_o_u_n_d_a_r_y() const; │ │ │ │ +106}; │ │ │ │ +107 │ │ │ │ +_1_0_9struct OPENMESHDLLEXPORT _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ +_V_e_r_t_e_x_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ +_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +110{ │ │ │ │ +111 explicit _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ +nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _V_e_r_t_e_x_H_a_n_d_l_e(_idx) {} │ │ │ │ +112 │ │ │ │ +114 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e out() const; │ │ │ │ +116 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge() const; // alias for out │ │ │ │ +118 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e in() const; │ │ │ │ +119 │ │ │ │ +121 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e faces() const; │ │ │ │ +123 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e faces_cw() const; │ │ │ │ +125 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e faces_ccw() const; │ │ │ │ +127 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e edges() const; │ │ │ │ +129 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e edges_cw() const; │ │ │ │ +131 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e edges_ccw() const; │ │ │ │ +133 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e vertices() const; │ │ │ │ +135 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e vertices_cw() const; │ │ │ │ +137 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e vertices_ccw() const; │ │ │ │ +139 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e incoming_halfedges() const; │ │ │ │ +141 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e incoming_halfedges_cw() │ │ │ │ +const; │ │ │ │ +143 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e incoming_halfedges_ccw() │ │ │ │ +const; │ │ │ │ +145 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e incoming_halfedges │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +147 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e incoming_halfedges_cw │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +149 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e incoming_halfedges_ccw │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +151 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e outgoing_halfedges() const; │ │ │ │ +153 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e outgoing_halfedges_cw() │ │ │ │ +const; │ │ │ │ +155 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e outgoing_halfedges_ccw() │ │ │ │ +const; │ │ │ │ +157 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e outgoing_halfedges │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +159 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e outgoing_halfedges_cw │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +161 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e outgoing_halfedges_ccw │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +162 │ │ │ │ +164 uint valence() const; │ │ │ │ +166 bool is_manifold() const; │ │ │ │ +167}; │ │ │ │ +168 │ │ │ │ +_1_6_9struct OPENMESHDLLEXPORT _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ +_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +170{ │ │ │ │ +171 explicit _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ +nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _H_a_l_f_e_d_g_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +172 │ │ │ │ +174 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e next() const; │ │ │ │ +176 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e prev() const; │ │ │ │ +178 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e opp() const; │ │ │ │ +180 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e to() const; │ │ │ │ +182 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e from() const; │ │ │ │ +184 _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e edge() const; │ │ │ │ +186 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e face() const; │ │ │ │ +187 │ │ │ │ +189 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e loop() const; │ │ │ │ +191 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e loop_cw() const; │ │ │ │ +193 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e loop_ccw() const; │ │ │ │ +194}; │ │ │ │ +195 │ │ │ │ +_1_9_6struct OPENMESHDLLEXPORT _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ +_E_d_g_e_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ +_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +197{ │ │ │ │ +198 explicit _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ +nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _E_d_g_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +199 │ │ │ │ +201 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge(unsigned int _i) const; │ │ │ │ +203 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e h(unsigned int _i) const; │ │ │ │ +205 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e h0() const; │ │ │ │ +207 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e h1() const; │ │ │ │ +209 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vertex(unsigned int _i) const; │ │ │ │ +211 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e v(unsigned int _i) const; │ │ │ │ +213 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e v0() const; │ │ │ │ +215 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e v1() const; │ │ │ │ +216 │ │ │ │ +218 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e vertices() const; │ │ │ │ +220 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e halfedges() const; │ │ │ │ +222 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e halfedges(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +const; │ │ │ │ +224 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e faces() const; │ │ │ │ +225}; │ │ │ │ +226 │ │ │ │ +_2_2_7struct OPENMESHDLLEXPORT _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ +_F_a_c_e_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ +_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +228{ │ │ │ │ +229 explicit _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ +nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _F_a_c_e_H_a_n_d_l_e(_idx) {} │ │ │ │ +230 │ │ │ │ +232 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge() const; │ │ │ │ +233 │ │ │ │ +235 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e vertices() const; │ │ │ │ +237 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e vertices_cw() const; │ │ │ │ +239 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e vertices_ccw() const; │ │ │ │ +241 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e halfedges() const; │ │ │ │ +243 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e halfedges_cw() const; │ │ │ │ +245 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e halfedges_ccw() const; │ │ │ │ +247 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e edges() const; │ │ │ │ +249 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e edges_cw() const; │ │ │ │ +251 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e edges_ccw() const; │ │ │ │ +253 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e faces() const; │ │ │ │ +255 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e faces_cw() const; │ │ │ │ +257 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e faces_ccw() const; │ │ │ │ +258 │ │ │ │ +260 uint valence() const; │ │ │ │ +261}; │ │ │ │ 262 │ │ │ │ -269 template │ │ │ │ -_2_7_0 auto _m_i_n(Functor&& f) -> typename std::decay()))>::type │ │ │ │ -271 { │ │ │ │ -272 using std::min; │ │ │ │ -273 │ │ │ │ -274 auto range = static_cast(this); │ │ │ │ -275 auto it = range->begin(); │ │ │ │ -276 auto end = range->end(); │ │ │ │ -277 assert(it != end); │ │ │ │ -278 │ │ │ │ -279 typename std::decay()))>::type res = f │ │ │ │ -(*it); │ │ │ │ -280 ++it; │ │ │ │ +263 │ │ │ │ +_2_6_5inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ +_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh) { return _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e (_vh._i_d_x(), _mesh); } │ │ │ │ +_2_6_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh, const │ │ │ │ +_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh) { return _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_hh._i_d_x(), _mesh); } │ │ │ │ +_2_6_9inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_E_d_g_e_H_a_n_d_l_e _eh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* │ │ │ │ +_mesh) { return _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e (_eh._i_d_x(), _mesh); } │ │ │ │ +_2_7_1inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_F_a_c_e_H_a_n_d_l_e _fh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* │ │ │ │ +_mesh) { return _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e (_fh._i_d_x(), _mesh); } │ │ │ │ +272 │ │ │ │ +_2_7_4inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ +_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _mesh) { return _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e (_vh._i_d_x(), &_mesh); } │ │ │ │ +_2_7_6inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh, const │ │ │ │ +_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _mesh) { return _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_hh._i_d_x(), &_mesh); } │ │ │ │ +_2_7_8inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_E_d_g_e_H_a_n_d_l_e _eh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& │ │ │ │ +_mesh) { return _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e (_eh._i_d_x(), &_mesh); } │ │ │ │ +_2_8_0inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_F_a_c_e_H_a_n_d_l_e _fh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& │ │ │ │ +_mesh) { return _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e (_fh._i_d_x(), &_mesh); } │ │ │ │ 281 │ │ │ │ -282 for (; it != end; ++it) │ │ │ │ -283 res = _m_i_n(res, f(*it)); │ │ │ │ -284 │ │ │ │ -285 return res; │ │ │ │ -286 } │ │ │ │ -287 │ │ │ │ -294 template │ │ │ │ -_2_9_5 auto _a_r_g_m_i_n(Functor&& f) -> HandleT │ │ │ │ -296 { │ │ │ │ -297 auto range = static_cast(this); │ │ │ │ -298 auto it = range->begin(); │ │ │ │ -299 auto min_it = it; │ │ │ │ -300 auto end = range->end(); │ │ │ │ -301 assert(it != end); │ │ │ │ -302 │ │ │ │ -303 typename std::decay()))>::type curr_min = │ │ │ │ -f(*it); │ │ │ │ -304 ++it; │ │ │ │ -305 │ │ │ │ -306 for (; it != end; ++it) │ │ │ │ -307 { │ │ │ │ -308 auto val = f(*it); │ │ │ │ -309 if (val < curr_min) │ │ │ │ -310 { │ │ │ │ -311 curr_min = val; │ │ │ │ -312 min_it = it; │ │ │ │ -313 } │ │ │ │ -314 } │ │ │ │ -315 │ │ │ │ -316 return *min_it; │ │ │ │ -317 } │ │ │ │ -318 │ │ │ │ -325 template │ │ │ │ -_3_2_6 auto _m_a_x(Functor&& f) -> typename std::decay()))>::type │ │ │ │ -327 { │ │ │ │ -328 using std::max; │ │ │ │ -329 │ │ │ │ -330 auto range = static_cast(this); │ │ │ │ -331 auto it = range->begin(); │ │ │ │ -332 auto end = range->end(); │ │ │ │ -333 assert(it != end); │ │ │ │ -334 │ │ │ │ -335 typename std::decay()))>::type res = f │ │ │ │ -(*it); │ │ │ │ -336 ++it; │ │ │ │ -337 │ │ │ │ -338 for (; it != end; ++it) │ │ │ │ -339 res = _m_a_x(res, f(*it)); │ │ │ │ +282 │ │ │ │ +283// helper to convert Handle Types to Smarthandle Types │ │ │ │ +284template │ │ │ │ +_2_8_5struct _S_m_a_r_t_H_a_n_d_l_e; │ │ │ │ +286 │ │ │ │ +_2_8_7template <> struct _S_m_a_r_t_H_a_n_d_l_e<_V_e_r_t_e_x_H_a_n_d_l_e> { using _t_y_p_e = │ │ │ │ +_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e; }; │ │ │ │ +_2_8_8template <> struct _S_m_a_r_t_H_a_n_d_l_e<_H_a_l_f_e_d_g_e_H_a_n_d_l_e> { using _t_y_p_e = │ │ │ │ +_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e; }; │ │ │ │ +_2_8_9template <> struct _S_m_a_r_t_H_a_n_d_l_e<_E_d_g_e_H_a_n_d_l_e> { using _t_y_p_e = _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +}; │ │ │ │ +_2_9_0template <> struct _S_m_a_r_t_H_a_n_d_l_e<_F_a_c_e_H_a_n_d_l_e> { using _t_y_p_e = _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +}; │ │ │ │ +291 │ │ │ │ +292 │ │ │ │ +293template │ │ │ │ +_2_9_4inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_f_e_a_t_u_r_e() const │ │ │ │ +295{ │ │ │ │ +296 const auto& handle = static_cast(*this); │ │ │ │ +297 assert(handle.mesh() != nullptr); │ │ │ │ +298 return handle.mesh()->status(handle).feature(); │ │ │ │ +299} │ │ │ │ +300 │ │ │ │ +301template │ │ │ │ +_3_0_2inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_s_e_l_e_c_t_e_d() const │ │ │ │ +303{ │ │ │ │ +304 const auto& handle = static_cast(*this); │ │ │ │ +305 assert(handle.mesh() != nullptr); │ │ │ │ +306 return handle.mesh()->status(handle).selected(); │ │ │ │ +307} │ │ │ │ +308 │ │ │ │ +309template │ │ │ │ +_3_1_0inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_t_a_g_g_e_d() const │ │ │ │ +311{ │ │ │ │ +312 const auto& handle = static_cast(*this); │ │ │ │ +313 assert(handle.mesh() != nullptr); │ │ │ │ +314 return handle.mesh()->status(handle).tagged(); │ │ │ │ +315} │ │ │ │ +316 │ │ │ │ +317template │ │ │ │ +_3_1_8inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_t_a_g_g_e_d_2() const │ │ │ │ +319{ │ │ │ │ +320 const auto& handle = static_cast(*this); │ │ │ │ +321 assert(handle.mesh() != nullptr); │ │ │ │ +322 return handle.mesh()->status(handle).tagged2(); │ │ │ │ +323} │ │ │ │ +324 │ │ │ │ +325template │ │ │ │ +_3_2_6inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_l_o_c_k_e_d() const │ │ │ │ +327{ │ │ │ │ +328 const auto& handle = static_cast(*this); │ │ │ │ +329 assert(handle.mesh() != nullptr); │ │ │ │ +330 return handle.mesh()->status(handle).locked(); │ │ │ │ +331} │ │ │ │ +332 │ │ │ │ +333template │ │ │ │ +_3_3_4inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_h_i_d_d_e_n() const │ │ │ │ +335{ │ │ │ │ +336 const auto& handle = static_cast(*this); │ │ │ │ +337 assert(handle.mesh() != nullptr); │ │ │ │ +338 return handle.mesh()->status(handle).hidden(); │ │ │ │ +339} │ │ │ │ 340 │ │ │ │ -341 return res; │ │ │ │ -342 } │ │ │ │ -343 │ │ │ │ -344 │ │ │ │ -351 template │ │ │ │ -_3_5_2 auto _a_r_g_m_a_x(Functor&& f) -> HandleT │ │ │ │ -353 { │ │ │ │ -354 auto range = static_cast(this); │ │ │ │ -355 auto it = range->begin(); │ │ │ │ -356 auto max_it = it; │ │ │ │ -357 auto end = range->end(); │ │ │ │ -358 assert(it != end); │ │ │ │ -359 │ │ │ │ -360 typename std::decay()))>::type curr_max = │ │ │ │ -f(*it); │ │ │ │ -361 ++it; │ │ │ │ +341template │ │ │ │ +_3_4_2inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_d_e_l_e_t_e_d() const │ │ │ │ +343{ │ │ │ │ +344 const auto& handle = static_cast(*this); │ │ │ │ +345 assert(handle.mesh() != nullptr); │ │ │ │ +346 return handle.mesh()->status(handle).deleted(); │ │ │ │ +347} │ │ │ │ +348 │ │ │ │ +349template │ │ │ │ +_3_5_0inline bool _S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e_<_H_a_n_d_l_e_T_y_p_e_>_:_:_i_s___b_o_u_n_d_a_r_y() const │ │ │ │ +351{ │ │ │ │ +352 const auto& handle = static_cast(*this); │ │ │ │ +353 assert(handle.mesh() != nullptr); │ │ │ │ +354 return handle.mesh()->is_boundary(handle); │ │ │ │ +355} │ │ │ │ +356 │ │ │ │ +_3_5_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t() const │ │ │ │ +358{ │ │ │ │ +359 assert(_m_e_s_h() != nullptr); │ │ │ │ +360 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->halfedge_handle(*this), _m_e_s_h()); │ │ │ │ +361} │ │ │ │ 362 │ │ │ │ -363 for (; it != end; ++it) │ │ │ │ -364 { │ │ │ │ -365 auto val = f(*it); │ │ │ │ -366 if (val > curr_max) │ │ │ │ -367 { │ │ │ │ -368 curr_max = val; │ │ │ │ -369 max_it = it; │ │ │ │ -370 } │ │ │ │ -371 } │ │ │ │ +_3_6_3inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e() const │ │ │ │ +364{ │ │ │ │ +365 return _o_u_t(); │ │ │ │ +366} │ │ │ │ +367 │ │ │ │ +_3_6_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n() const │ │ │ │ +369{ │ │ │ │ +370 return _o_u_t()._o_p_p(); │ │ │ │ +371} │ │ │ │ 372 │ │ │ │ -373 return *max_it; │ │ │ │ -374 } │ │ │ │ -375 │ │ │ │ -383 template │ │ │ │ -_3_8_4 auto _m_i_n_m_a_x(Functor&& f) -> std::pair()))>::type, │ │ │ │ -385 typename std::decay()))>::type> │ │ │ │ -386 { │ │ │ │ -387 return std::make_pair(this->_m_i_n(f), this->_m_a_x(f)); │ │ │ │ -388 } │ │ │ │ -389 │ │ │ │ +_3_7_3inline uint _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e() const │ │ │ │ +374{ │ │ │ │ +375 assert(_m_e_s_h() != nullptr); │ │ │ │ +376 return _m_e_s_h()->_v_a_l_e_n_c_e(*this); │ │ │ │ +377} │ │ │ │ +378 │ │ │ │ +_3_7_9inline bool _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_s___m_a_n_i_f_o_l_d() const │ │ │ │ +380{ │ │ │ │ +381 assert(_m_e_s_h() != nullptr); │ │ │ │ +382 return _m_e_s_h()->_i_s___m_a_n_i_f_o_l_d(*this); │ │ │ │ +383} │ │ │ │ +384 │ │ │ │ +_3_8_5inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_n_e_x_t() const │ │ │ │ +386{ │ │ │ │ +387 assert(_m_e_s_h() != nullptr); │ │ │ │ +388 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->next_halfedge_handle(*this), _m_e_s_h()); │ │ │ │ +389} │ │ │ │ 390 │ │ │ │ -397 template │ │ │ │ -_3_9_8 auto _c_o_u_n_t___i_f(Functor&& f) -> int │ │ │ │ -399 { │ │ │ │ -400 int count = 0; │ │ │ │ -401 auto range = static_cast(this); │ │ │ │ -402 for (const auto& e : *range) │ │ │ │ -403 if (f(e)) │ │ │ │ -404 ++count; │ │ │ │ -405 return count; │ │ │ │ -406 } │ │ │ │ -407 │ │ │ │ +_3_9_1inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_p_r_e_v() const │ │ │ │ +392{ │ │ │ │ +393 assert(_m_e_s_h() != nullptr); │ │ │ │ +394 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->prev_halfedge_handle(*this), _m_e_s_h()); │ │ │ │ +395} │ │ │ │ +396 │ │ │ │ +_3_9_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_o_p_p() const │ │ │ │ +398{ │ │ │ │ +399 assert(_m_e_s_h() != nullptr); │ │ │ │ +400 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->opposite_halfedge_handle(*this), _m_e_s_h()); │ │ │ │ +401} │ │ │ │ +402 │ │ │ │ +_4_0_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_t_o() const │ │ │ │ +404{ │ │ │ │ +405 assert(_m_e_s_h() != nullptr); │ │ │ │ +406 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->to_vertex_handle(*this), _m_e_s_h()); │ │ │ │ +407} │ │ │ │ 408 │ │ │ │ -415 template │ │ │ │ -_4_1_6 auto _f_o_r___e_a_c_h(Functor&& f) -> void │ │ │ │ -417 { │ │ │ │ -418 auto range = static_cast(this); │ │ │ │ -419 for (const auto& e : *range) │ │ │ │ -420 f(e); │ │ │ │ -421 } │ │ │ │ -422 │ │ │ │ -423 │ │ │ │ -430 template │ │ │ │ -_4_3_1 auto _f_i_l_t_e_r_e_d(Functor&& f) -> _F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T_<_S_m_a_r_t_R_a_n_g_e_,_ _H_a_n_d_l_e_, │ │ │ │ -_F_u_n_c_t_o_r_> │ │ │ │ -432 { │ │ │ │ -433 auto range = static_cast(this); │ │ │ │ -434 return _F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T_<_S_m_a_r_t_R_a_n_g_e_,_ _H_a_n_d_l_e_,_ _F_u_n_c_t_o_r_>(std:: │ │ │ │ -forward(f), (*range).begin(), (*range).end()); │ │ │ │ -435 } │ │ │ │ -436}; │ │ │ │ +_4_0_9inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_r_o_m() const │ │ │ │ +410{ │ │ │ │ +411 assert(_m_e_s_h() != nullptr); │ │ │ │ +412 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->from_vertex_handle(*this), _m_e_s_h()); │ │ │ │ +413} │ │ │ │ +414 │ │ │ │ +_4_1_5inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_e_d_g_e() const │ │ │ │ +416{ │ │ │ │ +417 assert(_m_e_s_h() != nullptr); │ │ │ │ +418 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->edge_handle(*this), _m_e_s_h()); │ │ │ │ +419} │ │ │ │ +420 │ │ │ │ +_4_2_1inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_a_c_e() const │ │ │ │ +422{ │ │ │ │ +423 assert(_m_e_s_h() != nullptr); │ │ │ │ +424 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->face_handle(*this), _m_e_s_h()); │ │ │ │ +425} │ │ │ │ +426 │ │ │ │ +_4_2_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e(unsigned int _i = 0) │ │ │ │ +const │ │ │ │ +428{ │ │ │ │ +429 assert(_m_e_s_h() != nullptr); │ │ │ │ +430 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->halfedge_handle(*this, _i), _m_e_s_h()); │ │ │ │ +431} │ │ │ │ +432 │ │ │ │ +_4_3_3inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h(unsigned int _i = 0) const │ │ │ │ +434{ │ │ │ │ +435 return _h_a_l_f_e_d_g_e(_i); │ │ │ │ +436} │ │ │ │ 437 │ │ │ │ -438 │ │ │ │ -440template │ │ │ │ -_4_4_1struct _F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T : public _S_m_a_r_t_R_a_n_g_e_T, HandleT> │ │ │ │ -442{ │ │ │ │ -443 using _B_a_s_e_R_a_n_g_e = _S_m_a_r_t_R_a_n_g_e_T_<_F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T_<_R_a_n_g_e_T_,_ _H_a_n_d_l_e_T_, │ │ │ │ -_F_u_n_c_t_o_r_>, HandleT>; │ │ │ │ -444 using BaseIterator = decltype((std::declval().begin │ │ │ │ -())); │ │ │ │ -445 │ │ │ │ -_4_4_6 struct _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r : public BaseIterator │ │ │ │ -447 { │ │ │ │ -448 │ │ │ │ -449 _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r(Functor f, BaseIterator it, BaseIterator end): │ │ │ │ -BaseIterator(it), f_(f), end_(end) │ │ │ │ -450 { │ │ │ │ -451 if (!BaseIterator::operator==(end_) && !f_(*(*this))) // if start is not │ │ │ │ -valid go to first valid one │ │ │ │ -452 operator++(); │ │ │ │ -453 } │ │ │ │ -454 │ │ │ │ -455 _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r(const _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r& other) = default; │ │ │ │ -456 │ │ │ │ -457 _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r& operator=(const _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r& other) │ │ │ │ -458 { │ │ │ │ -459 BaseIterator::operator=(other); │ │ │ │ -460 end_ = other.end_; │ │ │ │ -461 return *this; │ │ │ │ -462 } │ │ │ │ -463 │ │ │ │ -464 _F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r& operator++() │ │ │ │ -465 { │ │ │ │ -466 if (BaseIterator::operator==(end_)) // don't go past end │ │ │ │ -467 return *this; │ │ │ │ -468 │ │ │ │ -469 // go to next valid one │ │ │ │ -470 do │ │ │ │ -471 BaseIterator::operator++(); │ │ │ │ -472 while (BaseIterator::operator!=(end_) && !f_(*(*this))); │ │ │ │ -473 return *this; │ │ │ │ -474 } │ │ │ │ -475 │ │ │ │ -476 Functor f_; // Should iterators always get a reference to filter stored in │ │ │ │ -range? │ │ │ │ -477 // Should iterators stay valid after range goes out of scope? │ │ │ │ -478 BaseIterator end_; │ │ │ │ -479 }; │ │ │ │ -480 │ │ │ │ -481 _F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T(Functor&& f, BaseIterator begin, BaseIterator end) : f_ │ │ │ │ -(std::forward(f)), begin_(std::move(begin)), end_(std::move(end)){} │ │ │ │ -482 FilteredIterator begin() const { return FilteredIterator(f_, begin_, end_); │ │ │ │ -} │ │ │ │ -483 FilteredIterator end() const { return FilteredIterator(f_, end_, end_); } │ │ │ │ -484 │ │ │ │ -485 Functor f_; │ │ │ │ -486 BaseIterator begin_; │ │ │ │ -487 BaseIterator end_; │ │ │ │ -488}; │ │ │ │ -489 │ │ │ │ -490 │ │ │ │ -491 │ │ │ │ -492// │ │ │ │ +_4_3_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_0() const │ │ │ │ +439{ │ │ │ │ +440 return _h(0); │ │ │ │ +441} │ │ │ │ +442 │ │ │ │ +_4_4_3inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_1() const │ │ │ │ +444{ │ │ │ │ +445 return _h(1); │ │ │ │ +446} │ │ │ │ +447 │ │ │ │ +_4_4_8inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_e_r_t_e_x(unsigned int _i) const │ │ │ │ +449{ │ │ │ │ +450 return _h_a_l_f_e_d_g_e(_i)._f_r_o_m(); │ │ │ │ +451} │ │ │ │ +452 │ │ │ │ +_4_5_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v(unsigned int _i) const │ │ │ │ +454{ │ │ │ │ +455 return _v_e_r_t_e_x(_i); │ │ │ │ +456} │ │ │ │ +457 │ │ │ │ +_4_5_8inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_0() const │ │ │ │ +459{ │ │ │ │ +460 return _v(0); │ │ │ │ +461} │ │ │ │ +462 │ │ │ │ +_4_6_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_1() const │ │ │ │ +464{ │ │ │ │ +465 return _v(1); │ │ │ │ +466} │ │ │ │ +467 │ │ │ │ +_4_6_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e() const │ │ │ │ +469{ │ │ │ │ +470 assert(_m_e_s_h() != nullptr); │ │ │ │ +471 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->halfedge_handle(*this), _m_e_s_h()); │ │ │ │ +472} │ │ │ │ +473 │ │ │ │ +_4_7_4inline uint _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e() const │ │ │ │ +475{ │ │ │ │ +476 assert(_m_e_s_h() != nullptr); │ │ │ │ +477 return _m_e_s_h()->_v_a_l_e_n_c_e(*this); │ │ │ │ +478} │ │ │ │ +479 │ │ │ │ +480// │ │ │ │ ============================================================================= │ │ │ │ -493} // namespace OpenMesh │ │ │ │ -494// │ │ │ │ +481} // namespace OpenMesh │ │ │ │ +482// │ │ │ │ ============================================================================= │ │ │ │ -495 │ │ │ │ -496// │ │ │ │ +483 │ │ │ │ +484// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T │ │ │ │ -Class which applies a filter when iterating over elements. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:442 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T │ │ │ │ -Base class for all smart range types. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_f_o_r___e_a_c_h │ │ │ │ -auto for_each(Functor &&f) -> void │ │ │ │ -Apply a functor to each element. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:416 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_t_o___s_e_t │ │ │ │ -auto to_set(Functor &&f={}) -> std::set< typename std::decay< decltype(f(std:: │ │ │ │ -declval< HandleT >()))>::type > │ │ │ │ -Convert range to set. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:236 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_s_u_m │ │ │ │ -auto sum(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT │ │ │ │ ->()))>::type │ │ │ │ -Computes the sum of elements. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:88 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_t_o___a_r_r_a_y │ │ │ │ -auto to_array(Functor &&f={}) -> std::array< typename std::decay< decltype(f │ │ │ │ -(std::declval< HandleT >()))>::type, n > │ │ │ │ -Convert range to array. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:199 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_a_r_g_m_a_x │ │ │ │ -auto argmax(Functor &&f) -> HandleT │ │ │ │ -Compute maximal element. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:352 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_a_v_g │ │ │ │ -auto avg(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT │ │ │ │ ->()))>::type │ │ │ │ -Computes the average of elements. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:109 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_m_i_n │ │ │ │ -auto min(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT │ │ │ │ ->()))>::type │ │ │ │ -Compute minimum. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:270 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_m_i_n_m_a_x │ │ │ │ -auto minmax(Functor &&f) -> std::pair< typename std::decay< decltype(f(std:: │ │ │ │ -declval< HandleT >()))>::type, typename std::decay< decltype(f(std::declval< │ │ │ │ -HandleT >()))>::type > │ │ │ │ -Computes minimum and maximum. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:384 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_a_n_y___o_f │ │ │ │ -auto any_of(Functor &&f) -> bool │ │ │ │ -Check if any element fulfils condition. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:163 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_f_i_r_s_t │ │ │ │ -auto first(Functor &&f={}) -> HandleT │ │ │ │ -Get the first element that fulfills a condition. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:254 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_a_l_l___o_f │ │ │ │ -auto all_of(Functor &&f) -> bool │ │ │ │ -Check if all elements fulfil condition. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:180 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_f_i_l_t_e_r_e_d │ │ │ │ -auto filtered(Functor &&f) -> FilteredSmartRangeT< SmartRange, Handle, Functor │ │ │ │ -> │ │ │ │ -Only iterate over a subset of elements. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:431 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_t_o___v_e_c_t_o_r │ │ │ │ -auto to_vector(Functor &&f={}) -> std::vector< typename std::decay< decltype(f │ │ │ │ -(std::declval< HandleT >()))>::type > │ │ │ │ -Convert range to vector. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:219 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_a_v_g │ │ │ │ -auto avg(Functor &&f, WeightFunctor &&w) -> typename std::decay< decltype((1.0/ │ │ │ │ -(w(std::declval< HandleT >())+w(std::declval< HandleT >()))) *f(std::declval< │ │ │ │ -HandleT >()))>::type │ │ │ │ -Computes the weighted average of elements. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_a_r_g_m_i_n │ │ │ │ -auto argmin(Functor &&f) -> HandleT │ │ │ │ -Compute minimal element. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:295 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_m_a_x │ │ │ │ -auto max(Functor &&f) -> typename std::decay< decltype(f(std::declval< HandleT │ │ │ │ ->()))>::type │ │ │ │ -Compute maximum. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:326 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T_:_:_c_o_u_n_t___i_f │ │ │ │ -auto count_if(Functor &&f) -> int │ │ │ │ -Compute number of elements that satisfy a given predicate. │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:398 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_i_l_t_e_r_e_d_S_m_a_r_t_R_a_n_g_e_T_:_:_F_i_l_t_e_r_e_d_I_t_e_r_a_t_o_r │ │ │ │ -DDeeffiinniittiioonn SmartRange.hh:447 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ +SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ +Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ +Generic class for iterator ranges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ +int idx() const │ │ │ │ +Get the underlying index of this handle. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +Connectivity Class for polygonal meshes. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_a_l_e_n_c_e │ │ │ │ +uint valence(VertexHandle _vh) const │ │ │ │ +Vertex valence. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.cc:1072 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___m_a_n_i_f_o_l_d │ │ │ │ +bool is_manifold(VertexHandle _vh) const │ │ │ │ +Is (the mesh at) vertex _vh two-manifold ? │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.cc:84 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_B_a_s_e_H_a_n_d_l_e │ │ │ │ +Base class for all smart handle types. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:64 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_B_a_s_e_H_a_n_d_l_e_:_:_m_e_s_h │ │ │ │ +const PolyConnectivity * mesh() const │ │ │ │ +Get the underlying mesh of this handle. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s │ │ │ │ +Base class for all smart handle types that contains status related methods. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_s_e_l_e_c_t_e_d │ │ │ │ +bool selected() const │ │ │ │ +Returns true iff the handle is marked as selected. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_f_e_a_t_u_r_e │ │ │ │ +bool feature() const │ │ │ │ +Returns true iff the handle is marked as feature. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:294 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_l_o_c_k_e_d │ │ │ │ +bool locked() const │ │ │ │ +Returns true iff the handle is marked as locked. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:326 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_d_e_l_e_t_e_d │ │ │ │ +bool deleted() const │ │ │ │ +Returns true iff the handle is marked as deleted. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:342 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_t_a_g_g_e_d │ │ │ │ +bool tagged() const │ │ │ │ +Returns true iff the handle is marked as tagged. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:310 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_t_a_g_g_e_d_2 │ │ │ │ +bool tagged2() const │ │ │ │ +Returns true iff the handle is marked as tagged2. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:318 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_h_i_d_d_e_n │ │ │ │ +bool hidden() const │ │ │ │ +Returns true iff the handle is marked as hidden. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:334 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +Base class for all smart handle types that contains status related methods. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:102 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary() const │ │ │ │ +Returns true iff the handle is boundary. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ +allows easier access t... │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e │ │ │ │ +SmartHalfedgeHandle halfedge() const │ │ │ │ +Returns an outgoing halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:363 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t │ │ │ │ +SmartHalfedgeHandle out() const │ │ │ │ +Returns an outgoing halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:357 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_s___m_a_n_i_f_o_l_d │ │ │ │ +bool is_manifold() const │ │ │ │ +Returns true iff (the mesh at) the vertex is two-manifold ? │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:379 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n │ │ │ │ +SmartHalfedgeHandle in() const │ │ │ │ +Returns an incoming halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:368 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e │ │ │ │ +uint valence() const │ │ │ │ +Returns valence of the vertex. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:373 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:170 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_a_c_e │ │ │ │ +SmartFaceHandle face() const │ │ │ │ +Returns incident face of halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:421 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_r_o_m │ │ │ │ +SmartVertexHandle from() const │ │ │ │ +Returns vertex at start of halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:409 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_n_e_x_t │ │ │ │ +SmartHalfedgeHandle next() const │ │ │ │ +Returns next halfedge handle. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:385 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_p_r_e_v │ │ │ │ +SmartHalfedgeHandle prev() const │ │ │ │ +Returns previous halfedge handle. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:391 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_e_d_g_e │ │ │ │ +SmartEdgeHandle edge() const │ │ │ │ +Returns incident edge of halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:415 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_o_p_p │ │ │ │ +SmartHalfedgeHandle opp() const │ │ │ │ +Returns opposite halfedge handle. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:397 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_t_o │ │ │ │ +SmartVertexHandle to() const │ │ │ │ +Returns vertex pointed to by halfedge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:403 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:197 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v │ │ │ │ +SmartVertexHandle v(unsigned int _i) const │ │ │ │ +Shorthand for vertex() │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:453 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_1 │ │ │ │ +SmartVertexHandle v1() const │ │ │ │ +Shorthand for vertex(1) │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:463 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h │ │ │ │ +SmartHalfedgeHandle h(unsigned int _i) const │ │ │ │ +Shorthand for halfedge() │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:433 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_1 │ │ │ │ +SmartHalfedgeHandle h1() const │ │ │ │ +Shorthand for halfedge(1) │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:443 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_e_r_t_e_x │ │ │ │ +SmartVertexHandle vertex(unsigned int _i) const │ │ │ │ +Returns one of the two incident vertices of the edge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:448 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_0 │ │ │ │ +SmartVertexHandle v0() const │ │ │ │ +Shorthand for vertex(0) │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:458 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e │ │ │ │ +SmartHalfedgeHandle halfedge(unsigned int _i) const │ │ │ │ +Returns one of the two halfedges of the edge. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:427 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_0 │ │ │ │ +SmartHalfedgeHandle h0() const │ │ │ │ +Shorthand for halfedge(0) │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:438 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:228 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e │ │ │ │ +uint valence() const │ │ │ │ +Returns the valence of the face. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:474 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e │ │ │ │ +SmartHalfedgeHandle halfedge() const │ │ │ │ +Returns one of the halfedges of the face. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:468 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:285 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00665_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/Attributes.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/IteratorsT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │
│ │ │ -
Attributes.hh
│ │ │ +
IteratorsT.hh
│ │ │
│ │ │
│ │ │ -Go to the documentation of this file.
1/* ========================================================================= *
│ │ │ +
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -137,69 +137,258 @@ │ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │ -
43
│ │ │ +
43#pragma once
│ │ │
44
│ │ │ -
51#ifndef OPENMESH_ATTRIBUTES_HH
│ │ │ -
52#define OPENMESH_ATTRIBUTES_HH
│ │ │ -
53
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Iterators for PolyMesh/TriMesh
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52
│ │ │ +
53//== INCLUDES =================================================================
│ │ │
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ -
56
│ │ │ -
57
│ │ │ -
58#include <OpenMesh/Core/System/config.h>
│ │ │ -
59#include <OpenMesh/Core/Mesh/Status.hh>
│ │ │ +
55#include <OpenMesh/Core/System/config.h>
│ │ │ +
56#include <OpenMesh/Core/Mesh/Status.hh>
│ │ │ +
57#include <cassert>
│ │ │ +
58#include <cstddef>
│ │ │ +
59#include <iterator>
│ │ │
60
│ │ │
61
│ │ │
62//== NAMESPACES ===============================================================
│ │ │
63
│ │ │ -
64
│ │ │ -
65namespace OpenMesh {
│ │ │ -
66namespace Attributes {
│ │ │ +
64namespace OpenMesh {
│ │ │ +
65namespace Iterators {
│ │ │ +
66
│ │ │
67
│ │ │ -
68
│ │ │ -
69//== CLASS DEFINITION ========================================================
│ │ │ +
68//== FORWARD DECLARATIONS =====================================================
│ │ │ +
69
│ │ │
70
│ │ │ -
│ │ │ - │ │ │ -
80{
│ │ │ -
81 None = 0,
│ │ │ -
82 Normal = 1,
│ │ │ -
83 Color = 2,
│ │ │ - │ │ │ -
85 Status = 8,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
89 TextureIndex = 128
│ │ │ -
90};
│ │ │ -
│ │ │ -
91
│ │ │ -
92
│ │ │ -
93//=============================================================================
│ │ │ -
94} // namespace Attributes
│ │ │ -
95} // namespace OpenMesh
│ │ │ -
96//=============================================================================
│ │ │ -
97#endif // OPENMESH_ATTRIBUTES_HH defined
│ │ │ -
98//=============================================================================
│ │ │ +
71template <class Mesh> class ConstVertexIterT;
│ │ │ +
72template <class Mesh> class VertexIterT;
│ │ │ +
73template <class Mesh> class ConstHalfedgeIterT;
│ │ │ +
74template <class Mesh> class HalfedgeIterT;
│ │ │ +
75template <class Mesh> class ConstEdgeIterT;
│ │ │ +
76template <class Mesh> class EdgeIterT;
│ │ │ +
77template <class Mesh> class ConstFaceIterT;
│ │ │ +
78template <class Mesh> class FaceIterT;
│ │ │ +
79
│ │ │ +
80
│ │ │ +
81template <class Mesh, class ValueHandle, class MemberOwner, bool (MemberOwner::*PrimitiveStatusMember)() const, size_t (MemberOwner::*PrimitiveCountMember)() const>
│ │ │ +
│ │ │ + │ │ │ +
83 public:
│ │ │ +
84 //--- Typedefs ---
│ │ │ +
85
│ │ │ +
86 typedef ValueHandle value_handle;
│ │ │ +
87 typedef value_handle value_type;
│ │ │ +
88 typedef std::bidirectional_iterator_tag iterator_category;
│ │ │ +
89 typedef std::ptrdiff_t difference_type;
│ │ │ +
90 typedef const Mesh* mesh_ptr;
│ │ │ +
91 typedef const Mesh& mesh_ref;
│ │ │ +
92 typedef decltype(make_smart(std::declval<ValueHandle>(), std::declval<Mesh>())) SmartHandle;
│ │ │ +
93 typedef const SmartHandle& reference;
│ │ │ +
94 typedef const SmartHandle* pointer;
│ │ │ +
95
│ │ │ +
│ │ │ + │ │ │ +
98 : hnd_(make_smart(ValueHandle(),nullptr)), skip_bits_(0)
│ │ │ +
99 {}
│ │ │ +
│ │ │ +
100
│ │ │ +
│ │ │ +
102 GenericIteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)
│ │ │ +
103 : hnd_(make_smart(_hnd, _mesh)), skip_bits_(0)
│ │ │ +
104 {
│ │ │ +
105 if (_skip) enable_skipping();
│ │ │ +
106 }
│ │ │ +
│ │ │ +
107
│ │ │ +
│ │ │ +
109 reference operator*() const {
│ │ │ +
110 return hnd_;
│ │ │ +
111 }
│ │ │ +
│ │ │ +
112
│ │ │ +
│ │ │ +
114 pointer operator->() const {
│ │ │ +
115 return &hnd_;
│ │ │ +
116 }
│ │ │ +
│ │ │ +
117
│ │ │ +
123 OM_DEPRECATED("This function clutters your code. Use dereferencing operators -> and * instead.")
│ │ │ +
│ │ │ +
124 value_handle handle() const {
│ │ │ +
125 return hnd_;
│ │ │ +
126 }
│ │ │ +
│ │ │ +
127
│ │ │ +
134 OM_DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.")
│ │ │ +
│ │ │ +
135 operator value_handle() const {
│ │ │ +
136 return hnd_;
│ │ │ +
137 }
│ │ │ +
│ │ │ +
138
│ │ │ +
│ │ │ +
140 bool operator==(const GenericIteratorT& _rhs) const {
│ │ │ +
141 return ((hnd_.mesh() == _rhs.hnd_.mesh()) && (hnd_ == _rhs.hnd_));
│ │ │ +
142 }
│ │ │ +
│ │ │ +
143
│ │ │ +
│ │ │ +
145 bool operator!=(const GenericIteratorT& _rhs) const {
│ │ │ +
146 return !operator==(_rhs);
│ │ │ +
147 }
│ │ │ +
│ │ │ +
148
│ │ │ +
│ │ │ + │ │ │ +
151 hnd_.__increment();
│ │ │ +
152 if (skip_bits_)
│ │ │ +
153 skip_fwd();
│ │ │ +
154 return *this;
│ │ │ +
155 }
│ │ │ +
│ │ │ +
156
│ │ │ +
│ │ │ + │ │ │ +
159 GenericIteratorT cpy(*this);
│ │ │ +
160 ++(*this);
│ │ │ +
161 return cpy;
│ │ │ +
162 }
│ │ │ +
│ │ │ +
163
│ │ │ +
164#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
│ │ │ +
165 template<class T = value_handle>
│ │ │ +
166 auto operator+=(int amount) ->
│ │ │ +
167 typename std::enable_if<
│ │ │ +
168 sizeof(decltype(std::declval<T>().__increment(amount))) >= 0,
│ │ │ +
169 GenericIteratorT&>::type {
│ │ │ +
170 static_assert(std::is_same<T, value_handle>::value,
│ │ │ +
171 "Template parameter must not deviate from default.");
│ │ │ +
172 if (skip_bits_)
│ │ │ +
173 throw std::logic_error("Skipping iterators do not support "
│ │ │ +
174 "random access.");
│ │ │ +
175 hnd_.__increment(amount);
│ │ │ +
176 return *this;
│ │ │ +
177 }
│ │ │ +
178
│ │ │ +
179 template<class T = value_handle>
│ │ │ +
180 auto operator+(int rhs) ->
│ │ │ +
181 typename std::enable_if<
│ │ │ +
182 sizeof(decltype(std::declval<T>().__increment(rhs), void (), int {})) >= 0,
│ │ │ +
183 GenericIteratorT>::type {
│ │ │ +
184 static_assert(std::is_same<T, value_handle>::value,
│ │ │ +
185 "Template parameter must not deviate from default.");
│ │ │ +
186 if (skip_bits_)
│ │ │ +
187 throw std::logic_error("Skipping iterators do not support "
│ │ │ +
188 "random access.");
│ │ │ +
189 GenericIteratorT result = *this;
│ │ │ +
190 result.hnd_.__increment(rhs);
│ │ │ +
191 return result;
│ │ │ +
192 }
│ │ │ +
193#endif
│ │ │ +
194
│ │ │ +
│ │ │ + │ │ │ +
197 hnd_.__decrement();
│ │ │ +
198 if (skip_bits_)
│ │ │ +
199 skip_bwd();
│ │ │ +
200 return *this;
│ │ │ +
201 }
│ │ │ +
│ │ │ +
202
│ │ │ +
│ │ │ + │ │ │ +
205 GenericIteratorT cpy(*this);
│ │ │ +
206 --(*this);
│ │ │ +
207 return cpy;
│ │ │ +
208 }
│ │ │ +
│ │ │ +
209
│ │ │ +
│ │ │ + │ │ │ +
212 if (hnd_.mesh() && (hnd_.mesh()->*PrimitiveStatusMember)()) {
│ │ │ + │ │ │ +
214 status.set_deleted(true);
│ │ │ +
215 status.set_hidden(true);
│ │ │ +
216 skip_bits_ = status.bits();
│ │ │ +
217 skip_fwd();
│ │ │ +
218 } else
│ │ │ +
219 skip_bits_ = 0;
│ │ │ +
220 }
│ │ │ +
│ │ │ +
221
│ │ │ +
│ │ │ + │ │ │ +
224 skip_bits_ = 0;
│ │ │ +
225 }
│ │ │ +
│ │ │ +
226
│ │ │ +
227 private:
│ │ │ +
228
│ │ │ +
229 void skip_fwd() {
│ │ │ +
230 assert(hnd_.mesh() && skip_bits_);
│ │ │ +
231 while ((hnd_.idx() < (signed) (hnd_.mesh()->*PrimitiveCountMember)())
│ │ │ +
232 && (hnd_.mesh()->status(hnd_).bits() & skip_bits_))
│ │ │ +
233 hnd_.__increment();
│ │ │ +
234 }
│ │ │ +
235
│ │ │ +
236 void skip_bwd() {
│ │ │ +
237 assert(hnd_.mesh() && skip_bits_);
│ │ │ +
238 while ((hnd_.idx() >= 0) && (hnd_.mesh()->status(hnd_).bits() & skip_bits_))
│ │ │ +
239 hnd_.__decrement();
│ │ │ +
240 }
│ │ │ +
241
│ │ │ +
242 protected:
│ │ │ +
243 SmartHandle hnd_;
│ │ │ +
244 unsigned int skip_bits_;
│ │ │ +
245};
│ │ │ +
│ │ │ +
246
│ │ │ +
247//=============================================================================
│ │ │ +
248} // namespace Iterators
│ │ │ +
249} // namespace OpenMesh
│ │ │ +
250//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
AttributeBits
Attribute bits.
Definition Attributes.hh:80
│ │ │ -
@ TextureIndex
Add texture index (faces)
Definition Attributes.hh:89
│ │ │ -
@ Normal
Add normals to mesh item (vertices/faces)
Definition Attributes.hh:82
│ │ │ -
@ TexCoord2D
Add 2D texture coordinates (vertices, halfedges)
Definition Attributes.hh:87
│ │ │ -
@ TexCoord1D
Add 1D texture coordinates (vertices, halfedges)
Definition Attributes.hh:86
│ │ │ -
@ TexCoord3D
Add 3D texture coordinates (vertices, halfedges)
Definition Attributes.hh:88
│ │ │ -
@ None
Clear all attribute bits.
Definition Attributes.hh:81
│ │ │ -
@ Status
Add status to mesh item (all items)
Definition Attributes.hh:85
│ │ │ -
@ Color
Add colors to mesh item (vertices/faces/edges)
Definition Attributes.hh:83
│ │ │ -
@ PrevHalfedge
Add storage for previous halfedge (halfedges). The bit is set by default in the DefaultTraits.
Definition Attributes.hh:84
│ │ │ +
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ +
Definition IteratorsT.hh:71
│ │ │ +
Definition IteratorsT.hh:72
│ │ │ +
Definition IteratorsT.hh:73
│ │ │ +
Definition IteratorsT.hh:74
│ │ │ +
Definition IteratorsT.hh:75
│ │ │ +
Definition IteratorsT.hh:76
│ │ │ +
Definition IteratorsT.hh:77
│ │ │ +
Definition IteratorsT.hh:78
│ │ │ +
Definition IteratorsT.hh:82
│ │ │ +
void disable_skipping()
Turn on skipping: automatically skip deleted/hidden elements.
Definition IteratorsT.hh:223
│ │ │ +
GenericIteratorT operator--(int)
Standard post-decrement operator.
Definition IteratorsT.hh:204
│ │ │ +
GenericIteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)
Construct with mesh and a target handle.
Definition IteratorsT.hh:102
│ │ │ +
GenericIteratorT()
Default constructor.
Definition IteratorsT.hh:97
│ │ │ +
pointer operator->() const
Standard pointer operator.
Definition IteratorsT.hh:114
│ │ │ +
GenericIteratorT operator++(int)
Standard post-increment operator.
Definition IteratorsT.hh:158
│ │ │ +
GenericIteratorT & operator--()
Standard pre-decrement operator.
Definition IteratorsT.hh:196
│ │ │ +
void enable_skipping()
Turn on skipping: automatically skip deleted/hidden elements.
Definition IteratorsT.hh:211
│ │ │ +
reference operator*() const
Standard dereferencing operator.
Definition IteratorsT.hh:109
│ │ │ +
bool operator==(const GenericIteratorT &_rhs) const
Are two iterators equal? Only valid if they refer to the same mesh!
Definition IteratorsT.hh:140
│ │ │ +
GenericIteratorT & operator++()
Standard pre-increment operator.
Definition IteratorsT.hh:150
│ │ │ +
value_handle handle() const
Get the handle of the item the iterator refers to.
Definition IteratorsT.hh:124
│ │ │ +
bool operator!=(const GenericIteratorT &_rhs) const
Not equal?
Definition IteratorsT.hh:145
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
Add status information to a base class.
Definition Status.hh:95
│ │ │ +
void set_hidden(bool _b)
set hidden
Definition Status.hh:123
│ │ │ +
void set_deleted(bool _b)
set deleted
Definition Status.hh:105
│ │ │ +
unsigned int bits() const
return whole status
Definition Status.hh:151
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,13 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -Attributes.hh │ │ │ │ -_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ +IteratorsT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,103 +46,305 @@ │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ -43 │ │ │ │ +43#pragma once │ │ │ │ 44 │ │ │ │ -51#ifndef OPENMESH_ATTRIBUTES_HH │ │ │ │ -52#define OPENMESH_ATTRIBUTES_HH │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Iterators for PolyMesh/TriMesh │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52 │ │ │ │ +53//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ -56 │ │ │ │ -57 │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ +54 │ │ │ │ +55#include │ │ │ │ +56#include │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59#include │ │ │ │ 60 │ │ │ │ 61 │ │ │ │ 62//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ 63 │ │ │ │ -64 │ │ │ │ -65namespace _O_p_e_n_M_e_s_h { │ │ │ │ -66namespace Attributes { │ │ │ │ +64namespace _O_p_e_n_M_e_s_h { │ │ │ │ +65namespace Iterators { │ │ │ │ +66 │ │ │ │ 67 │ │ │ │ -68 │ │ │ │ -69//== CLASS DEFINITION │ │ │ │ -======================================================== │ │ │ │ +68//== FORWARD DECLARATIONS │ │ │ │ +===================================================== │ │ │ │ +69 │ │ │ │ 70 │ │ │ │ -_7_9enum _A_t_t_r_i_b_u_t_e_B_i_t_s │ │ │ │ -80{ │ │ │ │ -_8_1 _N_o_n_e = 0, │ │ │ │ -_8_2 _N_o_r_m_a_l = 1, │ │ │ │ -_8_3 _C_o_l_o_r = 2, │ │ │ │ -_8_4 _P_r_e_v_H_a_l_f_e_d_g_e = 4, │ │ │ │ -_8_5 _S_t_a_t_u_s = 8, │ │ │ │ -_8_6 _T_e_x_C_o_o_r_d_1_D = 16, │ │ │ │ -_8_7 _T_e_x_C_o_o_r_d_2_D = 32, │ │ │ │ -_8_8 _T_e_x_C_o_o_r_d_3_D = 64, │ │ │ │ -89 _T_e_x_t_u_r_e_I_n_d_e_x = 128 │ │ │ │ -_9_0}; │ │ │ │ -91 │ │ │ │ -92 │ │ │ │ -93// │ │ │ │ -============================================================================= │ │ │ │ -94} // namespace Attributes │ │ │ │ -95} // namespace OpenMesh │ │ │ │ -96// │ │ │ │ +_7_1template class _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_T; │ │ │ │ +_7_2template class _V_e_r_t_e_x_I_t_e_r_T; │ │ │ │ +_7_3template class _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r_T; │ │ │ │ +_7_4template class _H_a_l_f_e_d_g_e_I_t_e_r_T; │ │ │ │ +_7_5template class _C_o_n_s_t_E_d_g_e_I_t_e_r_T; │ │ │ │ +_7_6template class _E_d_g_e_I_t_e_r_T; │ │ │ │ +_7_7template class _C_o_n_s_t_F_a_c_e_I_t_e_r_T; │ │ │ │ +_7_8template class _F_a_c_e_I_t_e_r_T; │ │ │ │ +79 │ │ │ │ +80 │ │ │ │ +81template │ │ │ │ +_8_2class _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T { │ │ │ │ +83 public: │ │ │ │ +84 //--- Typedefs --- │ │ │ │ +85 │ │ │ │ +86 typedef ValueHandle value_handle; │ │ │ │ +87 typedef value_handle value_type; │ │ │ │ +88 typedef std::bidirectional_iterator_tag iterator_category; │ │ │ │ +89 typedef std::ptrdiff_t difference_type; │ │ │ │ +90 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ +91 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ +92 typedef decltype(_m_a_k_e___s_m_a_r_t(std::declval(), std::declval │ │ │ │ +())) SmartHandle; │ │ │ │ +93 typedef const SmartHandle& reference; │ │ │ │ +94 typedef const SmartHandle* pointer; │ │ │ │ +95 │ │ │ │ +_9_7 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T() │ │ │ │ +98 : hnd_(_m_a_k_e___s_m_a_r_t(ValueHandle(),nullptr)), skip_bits_(0) │ │ │ │ +99 {} │ │ │ │ +100 │ │ │ │ +_1_0_2 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, value_handle _hnd, bool _skip=false) │ │ │ │ +103 : hnd_(_m_a_k_e___s_m_a_r_t(_hnd, _mesh)), skip_bits_(0) │ │ │ │ +104 { │ │ │ │ +105 if (_skip) _e_n_a_b_l_e___s_k_i_p_p_i_n_g(); │ │ │ │ +106 } │ │ │ │ +107 │ │ │ │ +_1_0_9 reference _o_p_e_r_a_t_o_r_*() const { │ │ │ │ +110 return hnd_; │ │ │ │ +111 } │ │ │ │ +112 │ │ │ │ +_1_1_4 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ +115 return &hnd_; │ │ │ │ +116 } │ │ │ │ +117 │ │ │ │ +123 OM_DEPRECATED("This function clutters your code. Use dereferencing │ │ │ │ +operators -> and * instead.") │ │ │ │ +_1_2_4 value_handle _h_a_n_d_l_e() const { │ │ │ │ +125 return hnd_; │ │ │ │ +126 } │ │ │ │ +127 │ │ │ │ +134 OM_DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing │ │ │ │ +operators -> and * instead.") │ │ │ │ +_1_3_5 operator value_handle() const { │ │ │ │ +136 return hnd_; │ │ │ │ +137 } │ │ │ │ +138 │ │ │ │ +_1_4_0 bool _o_p_e_r_a_t_o_r_=_=(const _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T& _rhs) const { │ │ │ │ +141 return ((hnd_.mesh() == _rhs.hnd_.mesh()) && (hnd_ == _rhs.hnd_)); │ │ │ │ +142 } │ │ │ │ +143 │ │ │ │ +_1_4_5 bool _o_p_e_r_a_t_o_r_!_=(const _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T& _rhs) const { │ │ │ │ +146 return !_o_p_e_r_a_t_o_r_=_=(_rhs); │ │ │ │ +147 } │ │ │ │ +148 │ │ │ │ +_1_5_0 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_+_+() { │ │ │ │ +151 hnd_.__increment(); │ │ │ │ +152 if (skip_bits_) │ │ │ │ +153 skip_fwd(); │ │ │ │ +154 return *this; │ │ │ │ +155 } │ │ │ │ +156 │ │ │ │ +_1_5_8 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T _o_p_e_r_a_t_o_r_+_+(int) { │ │ │ │ +159 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T cpy(*this); │ │ │ │ +160 ++(*this); │ │ │ │ +161 return cpy; │ │ │ │ +162 } │ │ │ │ +163 │ │ │ │ +164#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || │ │ │ │ +defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) │ │ │ │ +165 template │ │ │ │ +166 auto operator+=(int amount) -> │ │ │ │ +167 typename std::enable_if< │ │ │ │ +168 sizeof(decltype(std::declval().__increment(amount))) >= 0, │ │ │ │ +169 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T&>::type { │ │ │ │ +170 static_assert(std::is_same::value, │ │ │ │ +171 "Template parameter must not deviate from default."); │ │ │ │ +172 if (skip_bits_) │ │ │ │ +173 throw std::logic_error("Skipping iterators do not support " │ │ │ │ +174 "random access."); │ │ │ │ +175 hnd_.__increment(amount); │ │ │ │ +176 return *this; │ │ │ │ +177 } │ │ │ │ +178 │ │ │ │ +179 template │ │ │ │ +180 auto operator+(int rhs) -> │ │ │ │ +181 typename std::enable_if< │ │ │ │ +182 sizeof(decltype(std::declval().__increment(rhs), void (), int {})) >= 0, │ │ │ │ +183 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T>::type { │ │ │ │ +184 static_assert(std::is_same::value, │ │ │ │ +185 "Template parameter must not deviate from default."); │ │ │ │ +186 if (skip_bits_) │ │ │ │ +187 throw std::logic_error("Skipping iterators do not support " │ │ │ │ +188 "random access."); │ │ │ │ +189 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T result = *this; │ │ │ │ +190 result.hnd_.__increment(rhs); │ │ │ │ +191 return result; │ │ │ │ +192 } │ │ │ │ +193#endif │ │ │ │ +194 │ │ │ │ +_1_9_6 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_-_-() { │ │ │ │ +197 hnd_.__decrement(); │ │ │ │ +198 if (skip_bits_) │ │ │ │ +199 skip_bwd(); │ │ │ │ +200 return *this; │ │ │ │ +201 } │ │ │ │ +202 │ │ │ │ +_2_0_4 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T _o_p_e_r_a_t_o_r_-_-(int) { │ │ │ │ +205 _G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T cpy(*this); │ │ │ │ +206 --(*this); │ │ │ │ +207 return cpy; │ │ │ │ +208 } │ │ │ │ +209 │ │ │ │ +_2_1_1 void _e_n_a_b_l_e___s_k_i_p_p_i_n_g() { │ │ │ │ +212 if (hnd_.mesh() && (hnd_.mesh()->*PrimitiveStatusMember)()) { │ │ │ │ +213 _A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o status; │ │ │ │ +214 status._s_e_t___d_e_l_e_t_e_d(true); │ │ │ │ +215 status._s_e_t___h_i_d_d_e_n(true); │ │ │ │ +216 skip_bits_ = status._b_i_t_s(); │ │ │ │ +217 skip_fwd(); │ │ │ │ +218 } else │ │ │ │ +219 skip_bits_ = 0; │ │ │ │ +220 } │ │ │ │ +221 │ │ │ │ +_2_2_3 void _d_i_s_a_b_l_e___s_k_i_p_p_i_n_g() { │ │ │ │ +224 skip_bits_ = 0; │ │ │ │ +225 } │ │ │ │ +226 │ │ │ │ +227 private: │ │ │ │ +228 │ │ │ │ +229 void skip_fwd() { │ │ │ │ +230 assert(hnd_.mesh() && skip_bits_); │ │ │ │ +231 while ((hnd_.idx() < (signed) (hnd_.mesh()->*PrimitiveCountMember)()) │ │ │ │ +232 && (hnd_.mesh()->status(hnd_).bits() & skip_bits_)) │ │ │ │ +233 hnd_.__increment(); │ │ │ │ +234 } │ │ │ │ +235 │ │ │ │ +236 void skip_bwd() { │ │ │ │ +237 assert(hnd_.mesh() && skip_bits_); │ │ │ │ +238 while ((hnd_.idx() >= 0) && (hnd_.mesh()->status(hnd_).bits() & │ │ │ │ +skip_bits_)) │ │ │ │ +239 hnd_.__decrement(); │ │ │ │ +240 } │ │ │ │ +241 │ │ │ │ +242 protected: │ │ │ │ +243 SmartHandle hnd_; │ │ │ │ +244 unsigned int skip_bits_; │ │ │ │ +245}; │ │ │ │ +246 │ │ │ │ +247// │ │ │ │ ============================================================================= │ │ │ │ -97#endif // OPENMESH_ATTRIBUTES_HH defined │ │ │ │ -98// │ │ │ │ +248} // namespace Iterators │ │ │ │ +249} // namespace OpenMesh │ │ │ │ +250// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_A_t_t_r_i_b_u_t_e_B_i_t_s │ │ │ │ -AttributeBits │ │ │ │ -Attribute bits. │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_e_x_t_u_r_e_I_n_d_e_x │ │ │ │ -@ TextureIndex │ │ │ │ -Add texture index (faces) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_r_m_a_l │ │ │ │ -@ Normal │ │ │ │ -Add normals to mesh item (vertices/faces) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:82 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ -@ TexCoord2D │ │ │ │ -Add 2D texture coordinates (vertices, halfedges) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_e_x_C_o_o_r_d_1_D │ │ │ │ -@ TexCoord1D │ │ │ │ -Add 1D texture coordinates (vertices, halfedges) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:86 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ -@ TexCoord3D │ │ │ │ -Add 3D texture coordinates (vertices, halfedges) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:88 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_n_e │ │ │ │ -@ None │ │ │ │ -Clear all attribute bits. │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s │ │ │ │ -@ Status │ │ │ │ -Add status to mesh item (all items) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:85 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_C_o_l_o_r │ │ │ │ -@ Color │ │ │ │ -Add colors to mesh item (vertices/faces/edges) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_P_r_e_v_H_a_l_f_e_d_g_e │ │ │ │ -@ PrevHalfedge │ │ │ │ -Add storage for previous halfedge (halfedges). The bit is set by default in the │ │ │ │ -DefaultTraits. │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:84 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ +SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ +Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:71 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_V_e_r_t_e_x_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:73 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_H_a_l_f_e_d_g_e_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:75 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_E_d_g_e_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_F_a_c_e_I_t_e_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:78 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:82 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_d_i_s_a_b_l_e___s_k_i_p_p_i_n_g │ │ │ │ +void disable_skipping() │ │ │ │ +Turn on skipping: automatically skip deleted/hidden elements. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:223 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ +GenericIteratorT operator--(int) │ │ │ │ +Standard post-decrement operator. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:204 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T │ │ │ │ +GenericIteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false) │ │ │ │ +Construct with mesh and a target handle. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:102 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T │ │ │ │ +GenericIteratorT() │ │ │ │ +Default constructor. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ +pointer operator->() const │ │ │ │ +Standard pointer operator. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:114 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ +GenericIteratorT operator++(int) │ │ │ │ +Standard post-increment operator. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:158 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ +GenericIteratorT & operator--() │ │ │ │ +Standard pre-decrement operator. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:196 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_e_n_a_b_l_e___s_k_i_p_p_i_n_g │ │ │ │ +void enable_skipping() │ │ │ │ +Turn on skipping: automatically skip deleted/hidden elements. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:211 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +reference operator*() const │ │ │ │ +Standard dereferencing operator. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:109 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +bool operator==(const GenericIteratorT &_rhs) const │ │ │ │ +Are two iterators equal? Only valid if they refer to the same mesh! │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:140 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ +GenericIteratorT & operator++() │ │ │ │ +Standard pre-increment operator. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:150 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_h_a_n_d_l_e │ │ │ │ +value_handle handle() const │ │ │ │ +Get the handle of the item the iterator refers to. │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ +bool operator!=(const GenericIteratorT &_rhs) const │ │ │ │ +Not equal? │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ +Add status information to a base class. │ │ │ │ +DDeeffiinniittiioonn Status.hh:95 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___h_i_d_d_e_n │ │ │ │ +void set_hidden(bool _b) │ │ │ │ +set hidden │ │ │ │ +DDeeffiinniittiioonn Status.hh:123 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___d_e_l_e_t_e_d │ │ │ │ +void set_deleted(bool _b) │ │ │ │ +set deleted │ │ │ │ +DDeeffiinniittiioonn Status.hh:105 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_b_i_t_s │ │ │ │ +unsigned int bits() const │ │ │ │ +return whole status │ │ │ │ +DDeeffiinniittiioonn Status.hh:151 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00668_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/TriMeshT_impl.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/Tags.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
TriMeshT_impl.hh
│ │ │ +
Tags.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,67 +136,26 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ +
42#pragma once
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS TriMeshT - IMPLEMENTATION
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ +
44namespace OpenMesh {
│ │ │ +
45
│ │ │ + │ │ │ + │ │ │
50
│ │ │ -
51
│ │ │ -
52#define OPENMESH_TRIMESH_C
│ │ │ -
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ -
56
│ │ │ -
57
│ │ │ -
58#include <OpenMesh/Core/Mesh/TriMeshT.hh>
│ │ │ - │ │ │ -
60#include <vector>
│ │ │ -
61
│ │ │ -
62
│ │ │ -
63//== NAMESPACES ==============================================================
│ │ │ -
64
│ │ │ -
65
│ │ │ -
66namespace OpenMesh {
│ │ │ -
67
│ │ │ -
68
│ │ │ -
69//== IMPLEMENTATION ==========================================================
│ │ │ -
70
│ │ │ -
71template <class Kernel>
│ │ │ -
72typename TriMeshT<Kernel>::Normal
│ │ │ -
│ │ │ - │ │ │ -
74calc_face_normal(FaceHandle _fh) const
│ │ │ -
75{
│ │ │ -
76 assert(this->halfedge_handle(_fh).is_valid());
│ │ │ -
77 ConstFaceVertexIter fv_it(this->cfv_iter(_fh));
│ │ │ -
78
│ │ │ -
79 const Point& p0(this->point(*fv_it)); ++fv_it;
│ │ │ -
80 const Point& p1(this->point(*fv_it)); ++fv_it;
│ │ │ -
81 const Point& p2(this->point(*fv_it));
│ │ │ -
82
│ │ │ -
83 return PolyMesh::calc_face_normal(p0, p1, p2);
│ │ │ -
84}
│ │ │ -
│ │ │ -
85
│ │ │ -
86//=============================================================================
│ │ │ -
87} // namespace OpenMesh
│ │ │ -
88//=============================================================================
│ │ │ -
This file provides the streams omlog, omout, and omerr.
│ │ │ +
51} // namespace OpenMesh
│ │ │ +
52
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition PolyMeshT_impl.hh:97
│ │ │ -
Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh (specialized for TriMesh).
Definition TriMeshT_impl.hh:74
│ │ │ +
Connectivity tag indicating that the tagged mesh has polygon connectivity.
Definition Tags.hh:47
│ │ │ +
Connectivity tag indicating that the tagged mesh has triangle connectivity.
Definition Tags.hh:49
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -TriMeshT_impl.hh │ │ │ │ +Tags.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,78 +45,29 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ +42#pragma once │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS TriMeshT - IMPLEMENTATION │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ +44namespace _O_p_e_n_M_e_s_h { │ │ │ │ +45 │ │ │ │ +_4_7struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g {}; │ │ │ │ +_4_9struct _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g {}; │ │ │ │ 50 │ │ │ │ -51 │ │ │ │ -52#define OPENMESH_TRIMESH_C │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -56 │ │ │ │ -57 │ │ │ │ -58#include │ │ │ │ -59#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ -60#include │ │ │ │ -61 │ │ │ │ -62 │ │ │ │ -63//== NAMESPACES │ │ │ │ -============================================================== │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66namespace _O_p_e_n_M_e_s_h { │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -69//== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -70 │ │ │ │ -71template │ │ │ │ -72typename TriMeshT::Normal │ │ │ │ -_7_3_T_r_i_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -74_c_a_l_c___f_a_c_e___n_o_r_m_a_l(FaceHandle _fh) const │ │ │ │ -75{ │ │ │ │ -76 assert(this->halfedge_handle(_fh).is_valid()); │ │ │ │ -77 ConstFaceVertexIter fv_it(this->cfv_iter(_fh)); │ │ │ │ -78 │ │ │ │ -79 const Point& p0(this->point(*fv_it)); ++fv_it; │ │ │ │ -80 const Point& p1(this->point(*fv_it)); ++fv_it; │ │ │ │ -81 const Point& p2(this->point(*fv_it)); │ │ │ │ -82 │ │ │ │ -83 return _P_o_l_y_M_e_s_h_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l(p0, p1, p2); │ │ │ │ -84} │ │ │ │ -85 │ │ │ │ -86// │ │ │ │ -============================================================================= │ │ │ │ -87} // namespace OpenMesh │ │ │ │ -88// │ │ │ │ -============================================================================= │ │ │ │ -_o_m_s_t_r_e_a_m_._h_h │ │ │ │ -This file provides the streams omlog, omout, and omerr. │ │ │ │ +51} // namespace OpenMesh │ │ │ │ +52 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ -virtual Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ -Calculate normal vector for face _fh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ -Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ -Calculate normal vector for face _fh (specialized for TriMesh). │ │ │ │ -DDeeffiinniittiioonn TriMeshT_impl.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g │ │ │ │ +Connectivity tag indicating that the tagged mesh has polygon connectivity. │ │ │ │ +DDeeffiinniittiioonn Tags.hh:47 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_T_a_g │ │ │ │ +Connectivity tag indicating that the tagged mesh has triangle connectivity. │ │ │ │ +DDeeffiinniittiioonn Tags.hh:49 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00671_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/FinalMeshItemsT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/PolyConnectivity.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
FinalMeshItemsT.hh
│ │ │ +
PolyConnectivity.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,185 +138,1327 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44#ifndef OPENMESH_MESH_ITEMS_HH
│ │ │ -
45#define OPENMESH_MESH_ITEMS_HH
│ │ │ +
44#ifndef OPENMESH_POLYCONNECTIVITY_HH
│ │ │ +
45#define OPENMESH_POLYCONNECTIVITY_HH
│ │ │
46
│ │ │ -
47
│ │ │ -
48//== INCLUDES =================================================================
│ │ │ +
47#include <OpenMesh/Core/Mesh/ArrayKernel.hh>
│ │ │ +
48#include <OpenMesh/Core/Mesh/SmartRange.hh>
│ │ │
49
│ │ │ -
50
│ │ │ -
51#include <OpenMesh/Core/System/config.h>
│ │ │ -
52#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
53#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ -
54#include <OpenMesh/Core/Mesh/Handles.hh>
│ │ │ -
55
│ │ │ -
56
│ │ │ -
57//== NAMESPACES ===============================================================
│ │ │ -
58
│ │ │ -
59
│ │ │ -
60namespace OpenMesh {
│ │ │ -
61
│ │ │ -
62
│ │ │ -
63//== CLASS DEFINITION =========================================================
│ │ │ -
64
│ │ │ -
66template <class Traits, bool IsTriMesh>
│ │ │ -
│ │ │ - │ │ │ -
68{
│ │ │ -
69 //--- build Refs structure ---
│ │ │ -
70#ifndef DOXY_IGNORE_THIS
│ │ │ -
71 struct Refs
│ │ │ -
72 {
│ │ │ -
73 typedef typename Traits::Point Point;
│ │ │ -
74 typedef typename vector_traits<Point>::value_type Scalar;
│ │ │ -
75
│ │ │ -
76 typedef typename Traits::Normal Normal;
│ │ │ -
77 typedef typename Traits::Color Color;
│ │ │ -
78 typedef typename Traits::TexCoord1D TexCoord1D;
│ │ │ -
79 typedef typename Traits::TexCoord2D TexCoord2D;
│ │ │ -
80 typedef typename Traits::TexCoord3D TexCoord3D;
│ │ │ -
81 typedef typename Traits::TextureIndex TextureIndex;
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
86 };
│ │ │ -
87#endif
│ │ │ -
88 //--- export Refs types ---
│ │ │ -
89 typedef typename Refs::Point Point;
│ │ │ -
90 typedef typename Refs::Scalar Scalar;
│ │ │ -
91 typedef typename Refs::Normal Normal;
│ │ │ -
92 typedef typename Refs::Color Color;
│ │ │ -
93 typedef typename Refs::TexCoord1D TexCoord1D;
│ │ │ -
94 typedef typename Refs::TexCoord2D TexCoord2D;
│ │ │ -
95 typedef typename Refs::TexCoord3D TexCoord3D;
│ │ │ -
96 typedef typename Refs::TextureIndex TextureIndex;
│ │ │ -
97
│ │ │ -
98 //--- get attribute bits from Traits ---
│ │ │ -
99 enum Attribs
│ │ │ -
100 {
│ │ │ -
101 VAttribs = Traits::VertexAttributes,
│ │ │ -
102 HAttribs = Traits::HalfedgeAttributes,
│ │ │ -
103 EAttribs = Traits::EdgeAttributes,
│ │ │ -
104 FAttribs = Traits::FaceAttributes
│ │ │ -
105 };
│ │ │ -
106 //--- merge internal items with traits items ---
│ │ │ -
107
│ │ │ -
108
│ │ │ -
109/*
│ │ │ -
110 typedef typename GenProg::IF<
│ │ │ -
111 (bool)(HAttribs & Attributes::PrevHalfedge),
│ │ │ -
112 typename InternalItems::Halfedge_with_prev,
│ │ │ -
113 typename InternalItems::Halfedge_without_prev
│ │ │ -
114 >::Result InternalHalfedge;
│ │ │ -
115*/
│ │ │ -
116 //typedef typename InternalItems::Vertex InternalVertex;
│ │ │ -
117 //typedef typename InternalItems::template Edge<Halfedge> InternalEdge;
│ │ │ -
118 //typedef typename InternalItems::template Face<IsTriMesh> InternalFace;
│ │ │ -
│ │ │ - │ │ │ -
120 {};
│ │ │ -
│ │ │ -
121
│ │ │ -
122 typedef typename Traits::template VertexT<ITraits, Refs> VertexData;
│ │ │ -
123 typedef typename Traits::template HalfedgeT<ITraits, Refs> HalfedgeData;
│ │ │ -
124 typedef typename Traits::template EdgeT<ITraits, Refs> EdgeData;
│ │ │ -
125 typedef typename Traits::template FaceT<ITraits, Refs> FaceData;
│ │ │ -
126};
│ │ │ +
50namespace OpenMesh
│ │ │ +
51{
│ │ │ +
52
│ │ │ +
53namespace Iterators
│ │ │ +
54{
│ │ │ +
55 template <class Mesh, class ValueHandle, class MemberOwner, bool (MemberOwner::*PrimitiveStatusMember)() const, size_t (MemberOwner::*PrimitiveCountMember)() const>
│ │ │ +
56 class GenericIteratorT;
│ │ │ +
57
│ │ │ +
58 template<class Mesh>
│ │ │ +
59 class GenericCirculatorBaseT;
│ │ │ +
60
│ │ │ +
61 template<typename Traits>
│ │ │ +
62 class GenericCirculatorT_DEPRECATED;
│ │ │ +
63
│ │ │ +
64 template<typename Traits, bool CW>
│ │ │ +
65 class GenericCirculatorT;
│ │ │ +
66}
│ │ │ +
67
│ │ │ +
68template <typename RangeTraitT>
│ │ │ +
69class EntityRange;
│ │ │ +
70
│ │ │ +
71template<
│ │ │ +
72 typename CONTAINER_T,
│ │ │ +
73 typename ITER_T,
│ │ │ +
74 ITER_T (CONTAINER_T::*begin_fn)() const,
│ │ │ +
75 ITER_T (CONTAINER_T::*end_fn)() const>
│ │ │ +
│ │ │ + │ │ │ +
77{
│ │ │ +
78 using CONTAINER_TYPE = CONTAINER_T;
│ │ │ +
79 using ITER_TYPE = ITER_T;
│ │ │ +
80 static ITER_TYPE begin(const CONTAINER_TYPE& _container) { return (_container.*begin_fn)(); }
│ │ │ +
81 static ITER_TYPE end(const CONTAINER_TYPE& _container) { return (_container.*end_fn)(); }
│ │ │ +
82};
│ │ │
│ │ │ -
127
│ │ │ +
83
│ │ │ +
84
│ │ │ +
85template <typename CirculatorRangeTraitT>
│ │ │ +
86class CirculatorRange;
│ │ │ +
87
│ │ │ +
88template<
│ │ │ +
89 typename CONTAINER_T,
│ │ │ +
90 typename ITER_T,
│ │ │ +
91 typename CENTER_ENTITY_T,
│ │ │ +
92 typename TO_ENTITY_T,
│ │ │ +
93 ITER_T (CONTAINER_T::*begin_fn)(CENTER_ENTITY_T) const,
│ │ │ +
94 ITER_T (CONTAINER_T::*end_fn)(CENTER_ENTITY_T) const>
│ │ │ +
│ │ │ + │ │ │ +
96{
│ │ │ +
97 using CONTAINER_TYPE = CONTAINER_T;
│ │ │ +
98 using ITER_TYPE = ITER_T;
│ │ │ +
99 using CENTER_ENTITY_TYPE = CENTER_ENTITY_T;
│ │ │ +
100 using TO_ENTITYE_TYPE = TO_ENTITY_T;
│ │ │ +
101 static ITER_TYPE begin(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*begin_fn)(_ce); }
│ │ │ +
102 static ITER_TYPE begin(const CONTAINER_TYPE& _container, HalfedgeHandle _heh, int) { return ITER_TYPE(_container, _heh); }
│ │ │ +
103 static ITER_TYPE end(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*end_fn)(_ce); }
│ │ │ +
104 static ITER_TYPE end(const CONTAINER_TYPE& _container, HalfedgeHandle _heh, int) { return ITER_TYPE(_container, _heh, true); }
│ │ │ +
105};
│ │ │ +
│ │ │ +
106
│ │ │ +
107struct SmartVertexHandle;
│ │ │ + │ │ │ +
109struct SmartEdgeHandle;
│ │ │ +
110struct SmartFaceHandle;
│ │ │ +
111
│ │ │ +
│ │ │ +
114class OPENMESHDLLEXPORT PolyConnectivity : public ArrayKernel
│ │ │ +
115{
│ │ │ +
116public:
│ │ │ +
118
│ │ │ +
119
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │
128
│ │ │ -
129#ifndef DOXY_IGNORE_THIS
│ │ │ -
130namespace {
│ │ │ -
131namespace TM {
│ │ │ -
132template<typename Lhs, typename Rhs> struct TypeEquality;
│ │ │ -
133template<typename Lhs> struct TypeEquality<Lhs, Lhs> {};
│ │ │ -
134
│ │ │ -
135template<typename LhsTraits, typename RhsTraits> struct ItemsEquality {
│ │ │ -
136 TypeEquality<typename LhsTraits::Point, typename RhsTraits::Point> te1;
│ │ │ -
137 TypeEquality<typename LhsTraits::Scalar, typename RhsTraits::Scalar> te2;
│ │ │ -
138 TypeEquality<typename LhsTraits::Normal, typename RhsTraits::Normal> te3;
│ │ │ -
139 TypeEquality<typename LhsTraits::Color, typename RhsTraits::Color> te4;
│ │ │ -
140 TypeEquality<typename LhsTraits::TexCoord1D, typename RhsTraits::TexCoord1D> te5;
│ │ │ -
141 TypeEquality<typename LhsTraits::TexCoord2D, typename RhsTraits::TexCoord2D> te6;
│ │ │ -
142 TypeEquality<typename LhsTraits::TexCoord3D, typename RhsTraits::TexCoord3D> te7;
│ │ │ -
143 TypeEquality<typename LhsTraits::TextureIndex, typename RhsTraits::TextureIndex> te8;
│ │ │ -
144};
│ │ │ -
145
│ │ │ -
146} /* namespace TM */
│ │ │ -
147} /* anonymous namespace */
│ │ │ -
148#endif
│ │ │ + │ │ │ +
130
│ │ │ +
131 //--- iterators ---
│ │ │ +
132
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
143
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │
149
│ │ │ -
178template<typename LhsMeshT, typename RhsMeshT> struct MeshCast;
│ │ │ -
179
│ │ │ -
180template<typename LhsMeshT, typename RhsMeshT>
│ │ │ -
│ │ │ -
181struct MeshCast<LhsMeshT&, RhsMeshT&> {
│ │ │ -
182 static LhsMeshT &cast(RhsMeshT &rhs) {
│ │ │ -
183 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ -
184 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ -
185 return reinterpret_cast<LhsMeshT&>(rhs);
│ │ │ -
186 }
│ │ │ -
187};
│ │ │ -
│ │ │ -
188
│ │ │ -
189template<typename LhsMeshT, typename RhsMeshT>
│ │ │ -
│ │ │ -
190struct MeshCast<const LhsMeshT&, const RhsMeshT&> {
│ │ │ -
191 static const LhsMeshT &cast(const RhsMeshT &rhs) {
│ │ │ -
192 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ -
193 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ -
194 return reinterpret_cast<const LhsMeshT&>(rhs);
│ │ │ -
195 }
│ │ │ -
196};
│ │ │ -
│ │ │ -
197
│ │ │ -
198template<typename LhsMeshT, typename RhsMeshT>
│ │ │ -
│ │ │ -
199struct MeshCast<LhsMeshT*, RhsMeshT*> {
│ │ │ -
200 static LhsMeshT *cast(RhsMeshT *rhs) {
│ │ │ -
201 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ -
202 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ -
203 return reinterpret_cast<LhsMeshT*>(rhs);
│ │ │ -
204 }
│ │ │ -
205};
│ │ │ -
│ │ │ -
206
│ │ │ -
207template<typename LhsMeshT, typename RhsMeshT>
│ │ │ -
│ │ │ -
208struct MeshCast<const LhsMeshT*, const RhsMeshT*> {
│ │ │ -
209 static const LhsMeshT *cast(const RhsMeshT *rhs) {
│ │ │ -
210 (void)sizeof(TM::ItemsEquality<typename LhsMeshT::MeshItemsT, typename RhsMeshT::MeshItemsT>);
│ │ │ -
211 (void)sizeof(TM::TypeEquality<typename LhsMeshT::ConnectivityT, typename RhsMeshT::ConnectivityT>);
│ │ │ -
212 return reinterpret_cast<const LhsMeshT*>(rhs);
│ │ │ -
213 }
│ │ │ -
214};
│ │ │ +
150 //--- circulators ---
│ │ │ +
151
│ │ │ +
157
│ │ │ +
158 /*
│ │ │ +
159 * Vertex-centered circulators
│ │ │ +
160 */
│ │ │ +
161
│ │ │ +
│ │ │ + │ │ │ +
163 {
│ │ │ +
164 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
167 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->to_vertex_handle(_heh);}
│ │ │ +
168 };
│ │ │ +
│ │ │ +
169
│ │ │ +
170
│ │ │ + │ │ │ + │ │ │ +
176
│ │ │ + │ │ │ +
181
│ │ │ +
182
│ │ │ +
│ │ │ + │ │ │ +
184 {
│ │ │ +
185 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
188 static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh;}
│ │ │ +
189 };
│ │ │ +
│ │ │ +
190
│ │ │ + │ │ │ + │ │ │ +
196
│ │ │ + │ │ │ +
201
│ │ │ +
│ │ │ + │ │ │ +
203 {
│ │ │ +
204 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
207 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->opposite_halfedge_handle(_heh); }
│ │ │ +
208 };
│ │ │
│ │ │ +
209
│ │ │ + │ │ │ + │ │ │
215
│ │ │ -
216
│ │ │ -
217//=============================================================================
│ │ │ -
218} // namespace OpenMesh
│ │ │ -
219//=============================================================================
│ │ │ -
220#endif // OPENMESH_MESH_ITEMS_HH defined
│ │ │ -
221//=============================================================================
│ │ │ -
222
│ │ │ + │ │ │ +
220
│ │ │ +
221
│ │ │ +
│ │ │ + │ │ │ +
223 {
│ │ │ +
224 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
227 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
│ │ │ +
228 };
│ │ │ +
│ │ │ +
229
│ │ │ + │ │ │ + │ │ │ +
235
│ │ │ + │ │ │ +
240
│ │ │ +
241
│ │ │ +
│ │ │ + │ │ │ +
243 {
│ │ │ +
244 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
247 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
│ │ │ +
248 };
│ │ │ +
│ │ │ +
249
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
259
│ │ │ +
260
│ │ │ +
│ │ │ + │ │ │ +
262 {
│ │ │ +
263 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
266 static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh; }
│ │ │ +
267 };
│ │ │ +
│ │ │ +
268
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
278
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
294
│ │ │ +
295 /*
│ │ │ +
296 * Face-centered circulators
│ │ │ +
297 */
│ │ │ +
298
│ │ │ +
│ │ │ + │ │ │ +
300 {
│ │ │ +
301 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
304 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->to_vertex_handle(_heh); }
│ │ │ +
305 };
│ │ │ +
│ │ │ +
306
│ │ │ + │ │ │ + │ │ │ +
312
│ │ │ + │ │ │ +
317
│ │ │ + │ │ │ + │ │ │ +
323
│ │ │ + │ │ │ +
328
│ │ │ +
329
│ │ │ +
│ │ │ + │ │ │ +
331 {
│ │ │ +
332 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
335 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
│ │ │ +
336 };
│ │ │ +
│ │ │ +
337
│ │ │ + │ │ │ + │ │ │ +
343
│ │ │ + │ │ │ +
348
│ │ │ +
349
│ │ │ +
│ │ │ + │ │ │ +
351 {
│ │ │ +
352 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
355 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_mesh->opposite_halfedge_handle(_heh)); }
│ │ │ +
356 };
│ │ │ +
│ │ │ +
357
│ │ │ + │ │ │ + │ │ │ +
363
│ │ │ + │ │ │ +
368
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
381
│ │ │ +
382 /*
│ │ │ +
383 * Edge-centered circulators
│ │ │ +
384 */
│ │ │ +
385
│ │ │ +
│ │ │ + │ │ │ +
387 {
│ │ │ +
388 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
391 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->from_vertex_handle(_heh); }
│ │ │ +
392 };
│ │ │ +
│ │ │ +
393
│ │ │ + │ │ │ +
398
│ │ │ +
│ │ │ + │ │ │ +
400 {
│ │ │ +
401 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
404 static ValueHandle toHandle(const Mesh* const /* _mesh */, This::HalfedgeHandle _heh) { return _heh; }
│ │ │ +
405 };
│ │ │ +
│ │ │ +
406
│ │ │ + │ │ │ +
411
│ │ │ +
│ │ │ + │ │ │ +
413 {
│ │ │ +
414 using Mesh = This;
│ │ │ + │ │ │ + │ │ │ +
417 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
│ │ │ +
418 };
│ │ │ +
│ │ │ +
419
│ │ │ + │ │ │ +
424
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
428
│ │ │ +
429 /*
│ │ │ +
430 * Halfedge circulator
│ │ │ +
431 */
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
435
│ │ │ +
437
│ │ │ +
438 // --- shortcuts
│ │ │ +
439
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
449
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
454
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
459
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
488
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
520
│ │ │ +
521public:
│ │ │ +
522
│ │ │ + │ │ │ +
524 virtual ~PolyConnectivity() {}
│ │ │ +
525
│ │ │ +
│ │ │ +
526 inline static bool is_triangles()
│ │ │ +
527 { return false; }
│ │ │ +
│ │ │ +
528
│ │ │ +
│ │ │ +
531 inline void assign_connectivity(const PolyConnectivity& _other)
│ │ │ + │ │ │ +
│ │ │ +
533
│ │ │ +
537
│ │ │ +
539 inline SmartVertexHandle add_vertex();
│ │ │ +
540
│ │ │ +
548 SmartFaceHandle add_face(const std::vector<VertexHandle>& _vhandles);
│ │ │ +
549
│ │ │ +
557 SmartFaceHandle add_face(const std::vector<SmartVertexHandle>& _vhandles);
│ │ │ +
558
│ │ │ +
559
│ │ │ +
569 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);
│ │ │ +
570
│ │ │ +
581 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3);
│ │ │ +
582
│ │ │ +
591 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);
│ │ │ +
592
│ │ │ +
594
│ │ │ +
596
│ │ │ +
597
│ │ │ +
602 bool is_collapse_ok(HalfedgeHandle _he);
│ │ │ +
603
│ │ │ +
604
│ │ │ +
610 void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true);
│ │ │ +
611
│ │ │ +
620 void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true);
│ │ │ +
621
│ │ │ +
632 void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true);
│ │ │ +
633
│ │ │ +
634
│ │ │ +
636
│ │ │ +
640
│ │ │ +
641 using ArrayKernel::next_halfedge_handle;
│ │ │ +
642 using ArrayKernel::prev_halfedge_handle;
│ │ │ +
643 using ArrayKernel::opposite_halfedge_handle;
│ │ │ +
644 using ArrayKernel::ccw_rotated_halfedge_handle;
│ │ │ +
645 using ArrayKernel::cw_rotated_halfedge_handle;
│ │ │ +
646
│ │ │ +
647 inline SmartHalfedgeHandle next_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ +
648 inline SmartHalfedgeHandle prev_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ +
649 inline SmartHalfedgeHandle opposite_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ +
650 inline SmartHalfedgeHandle ccw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const;
│ │ │ +
651 inline SmartHalfedgeHandle cw_rotated_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ +
652
│ │ │ +
653 using ArrayKernel::s_halfedge_handle;
│ │ │ +
654 using ArrayKernel::s_edge_handle;
│ │ │ +
655
│ │ │ +
656 static SmartHalfedgeHandle s_halfedge_handle(SmartEdgeHandle _eh, unsigned int _i = 0);
│ │ │ +
657 static SmartEdgeHandle s_edge_handle(SmartHalfedgeHandle _heh);
│ │ │ +
658
│ │ │ +
659 using ArrayKernel::halfedge_handle;
│ │ │ +
660 using ArrayKernel::edge_handle;
│ │ │ +
661 using ArrayKernel::face_handle;
│ │ │ +
662
│ │ │ +
663 inline SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i = 0) const;
│ │ │ +
664 inline SmartHalfedgeHandle halfedge_handle(SmartFaceHandle _fh) const;
│ │ │ +
665 inline SmartHalfedgeHandle halfedge_handle(SmartVertexHandle _vh) const;
│ │ │ +
666 inline SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const;
│ │ │ +
667 inline SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const;
│ │ │ +
668
│ │ │ +
670 inline SmartFaceHandle opposite_face_handle(HalfedgeHandle _heh) const;
│ │ │ +
671
│ │ │ +
673
│ │ │ +
677
│ │ │ +
679 VertexIter vertices_begin();
│ │ │ +
681 ConstVertexIter vertices_begin() const;
│ │ │ +
683 VertexIter vertices_end();
│ │ │ +
685 ConstVertexIter vertices_end() const;
│ │ │ +
686
│ │ │ +
688 HalfedgeIter halfedges_begin();
│ │ │ +
690 ConstHalfedgeIter halfedges_begin() const;
│ │ │ +
692 HalfedgeIter halfedges_end();
│ │ │ +
694 ConstHalfedgeIter halfedges_end() const;
│ │ │ +
695
│ │ │ +
697 EdgeIter edges_begin();
│ │ │ +
699 ConstEdgeIter edges_begin() const;
│ │ │ +
701 EdgeIter edges_end();
│ │ │ +
703 ConstEdgeIter edges_end() const;
│ │ │ +
704
│ │ │ +
706 FaceIter faces_begin();
│ │ │ +
708 ConstFaceIter faces_begin() const;
│ │ │ +
710 FaceIter faces_end();
│ │ │ +
712 ConstFaceIter faces_end() const;
│ │ │ +
714
│ │ │ +
715
│ │ │ +
719
│ │ │ +
721 VertexIter vertices_sbegin();
│ │ │ +
723 ConstVertexIter vertices_sbegin() const;
│ │ │ +
724
│ │ │ +
726 HalfedgeIter halfedges_sbegin();
│ │ │ +
728 ConstHalfedgeIter halfedges_sbegin() const;
│ │ │ +
729
│ │ │ +
731 EdgeIter edges_sbegin();
│ │ │ +
733 ConstEdgeIter edges_sbegin() const;
│ │ │ +
734
│ │ │ +
736 FaceIter faces_sbegin();
│ │ │ +
738 ConstFaceIter faces_sbegin() const;
│ │ │ +
739
│ │ │ +
741
│ │ │ +
742 //--- circulators ---
│ │ │ +
743
│ │ │ +
747
│ │ │ +
749 VertexVertexIter vv_iter(VertexHandle _vh);
│ │ │ +
751 VertexVertexCWIter vv_cwiter(VertexHandle _vh);
│ │ │ +
753 VertexVertexCCWIter vv_ccwiter(VertexHandle _vh);
│ │ │ +
755 VertexIHalfedgeIter vih_iter(VertexHandle _vh);
│ │ │ +
757 VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh);
│ │ │ +
759 VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh);
│ │ │ +
761 VertexOHalfedgeIter voh_iter(VertexHandle _vh);
│ │ │ +
763 VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh);
│ │ │ +
765 VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh);
│ │ │ +
767 VertexEdgeIter ve_iter(VertexHandle _vh);
│ │ │ +
769 VertexEdgeCWIter ve_cwiter(VertexHandle _vh);
│ │ │ +
771 VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh);
│ │ │ +
773 VertexFaceIter vf_iter(VertexHandle _vh);
│ │ │ +
775 VertexFaceCWIter vf_cwiter(VertexHandle _vh);
│ │ │ +
777 VertexFaceCCWIter vf_ccwiter(VertexHandle _vh);
│ │ │ +
778
│ │ │ +
780 ConstVertexVertexIter cvv_iter(VertexHandle _vh) const;
│ │ │ +
782 ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const;
│ │ │ +
784 ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const;
│ │ │ +
786 ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const;
│ │ │ +
788 ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const;
│ │ │ +
790 ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const;
│ │ │ +
792 ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const;
│ │ │ +
794 ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const;
│ │ │ +
796 ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const;
│ │ │ +
798 ConstVertexEdgeIter cve_iter(VertexHandle _vh) const;
│ │ │ +
800 ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const;
│ │ │ +
802 ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const;
│ │ │ +
804 ConstVertexFaceIter cvf_iter(VertexHandle _vh) const;
│ │ │ +
806 ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const;
│ │ │ +
808 ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const;
│ │ │ +
809
│ │ │ +
811 FaceVertexIter fv_iter(FaceHandle _fh);
│ │ │ +
813 FaceVertexCWIter fv_cwiter(FaceHandle _fh);
│ │ │ +
815 FaceVertexCCWIter fv_ccwiter(FaceHandle _fh);
│ │ │ +
817 FaceHalfedgeIter fh_iter(FaceHandle _fh);
│ │ │ +
819 FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh);
│ │ │ +
821 FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh);
│ │ │ +
823 FaceEdgeIter fe_iter(FaceHandle _fh);
│ │ │ +
825 FaceEdgeCWIter fe_cwiter(FaceHandle _fh);
│ │ │ +
827 FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh);
│ │ │ +
829 FaceFaceIter ff_iter(FaceHandle _fh);
│ │ │ +
831 FaceFaceCWIter ff_cwiter(FaceHandle _fh);
│ │ │ +
833 FaceFaceCCWIter ff_ccwiter(FaceHandle _fh);
│ │ │ +
834
│ │ │ +
836 ConstFaceVertexIter cfv_iter(FaceHandle _fh) const;
│ │ │ +
838 ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const;
│ │ │ +
840 ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const;
│ │ │ +
842 ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const;
│ │ │ +
844 ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const;
│ │ │ +
846 ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const;
│ │ │ +
848 ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const;
│ │ │ +
850 ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const;
│ │ │ +
852 ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const;
│ │ │ +
854 ConstFaceFaceIter cff_iter(FaceHandle _fh) const;
│ │ │ +
856 ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const;
│ │ │ +
858 ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const;
│ │ │ +
859
│ │ │ +
861 EdgeVertexIter ev_iter(EdgeHandle _eh);
│ │ │ +
863 EdgeHalfedgeIter eh_iter(EdgeHandle _eh);
│ │ │ +
865 EdgeFaceIter ef_iter(EdgeHandle _eh);
│ │ │ +
866
│ │ │ +
868 ConstEdgeVertexIter cev_iter(EdgeHandle _eh) const;
│ │ │ +
870 ConstEdgeHalfedgeIter ceh_iter(EdgeHandle _eh) const;
│ │ │ +
872 ConstEdgeFaceIter cef_iter(EdgeHandle _eh) const;
│ │ │ +
873
│ │ │ +
874 // 'begin' circulators
│ │ │ +
875
│ │ │ +
877 VertexVertexIter vv_begin(VertexHandle _vh);
│ │ │ +
879 VertexVertexCWIter vv_cwbegin(VertexHandle _vh);
│ │ │ +
881 VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh);
│ │ │ +
883 VertexIHalfedgeIter vih_begin(VertexHandle _vh);
│ │ │ +
885 VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh);
│ │ │ +
887 VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh);
│ │ │ +
889 VertexOHalfedgeIter voh_begin(VertexHandle _vh);
│ │ │ +
891 VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh);
│ │ │ +
893 VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh);
│ │ │ +
895 VertexEdgeIter ve_begin(VertexHandle _vh);
│ │ │ +
897 VertexEdgeCWIter ve_cwbegin(VertexHandle _vh);
│ │ │ +
899 VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh);
│ │ │ +
901 VertexFaceIter vf_begin(VertexHandle _vh);
│ │ │ +
903 VertexFaceCWIter vf_cwbegin(VertexHandle _vh);
│ │ │ +
905 VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh);
│ │ │ +
906
│ │ │ +
907
│ │ │ +
909 ConstVertexVertexIter cvv_begin(VertexHandle _vh) const;
│ │ │ +
911 ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const;
│ │ │ +
913 ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const;
│ │ │ +
915 ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const;
│ │ │ +
917 ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const;
│ │ │ +
919 ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const;
│ │ │ +
921 ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const;
│ │ │ +
923 ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const;
│ │ │ +
925 ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const;
│ │ │ +
927 ConstVertexEdgeIter cve_begin(VertexHandle _vh) const;
│ │ │ +
929 ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const;
│ │ │ +
931 ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const;
│ │ │ +
933 ConstVertexFaceIter cvf_begin(VertexHandle _vh) const;
│ │ │ +
935 ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const;
│ │ │ +
937 ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const;
│ │ │ +
938
│ │ │ +
940 FaceVertexIter fv_begin(FaceHandle _fh);
│ │ │ +
942 FaceVertexCWIter fv_cwbegin(FaceHandle _fh);
│ │ │ +
944 FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh);
│ │ │ +
946 FaceHalfedgeIter fh_begin(FaceHandle _fh);
│ │ │ +
948 FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh);
│ │ │ +
950 FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh);
│ │ │ +
952 FaceEdgeIter fe_begin(FaceHandle _fh);
│ │ │ +
954 FaceEdgeCWIter fe_cwbegin(FaceHandle _fh);
│ │ │ +
956 FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh);
│ │ │ +
958 FaceFaceIter ff_begin(FaceHandle _fh);
│ │ │ +
960 FaceFaceCWIter ff_cwbegin(FaceHandle _fh);
│ │ │ +
962 FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh);
│ │ │ +
964 HalfedgeLoopIter hl_begin(HalfedgeHandle _heh);
│ │ │ +
966 HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh);
│ │ │ +
968 HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh);
│ │ │ +
969
│ │ │ +
971 ConstFaceVertexIter cfv_begin(FaceHandle _fh) const;
│ │ │ +
973 ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const;
│ │ │ +
975 ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const;
│ │ │ +
977 ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const;
│ │ │ +
979 ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const;
│ │ │ +
981 ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const;
│ │ │ +
983 ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const;
│ │ │ +
985 ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const;
│ │ │ +
987 ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const;
│ │ │ +
989 ConstFaceFaceIter cff_begin(FaceHandle _fh) const;
│ │ │ +
991 ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const;
│ │ │ +
993 ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const;
│ │ │ +
995 ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const;
│ │ │ +
997 ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const;
│ │ │ +
999 ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const;
│ │ │ +
1000
│ │ │ +
1002 EdgeVertexIter ev_begin(EdgeHandle _eh);
│ │ │ +
1004 EdgeHalfedgeIter eh_begin(EdgeHandle _eh);
│ │ │ +
1006 EdgeFaceIter ef_begin(EdgeHandle _eh);
│ │ │ +
1007
│ │ │ +
1009 ConstEdgeVertexIter cev_begin(EdgeHandle _eh) const;
│ │ │ +
1011 ConstEdgeHalfedgeIter ceh_begin(EdgeHandle _eh) const;
│ │ │ +
1013 ConstEdgeFaceIter cef_begin(EdgeHandle _eh) const;
│ │ │ +
1014
│ │ │ +
1015 // 'end' circulators
│ │ │ +
1016
│ │ │ +
1018 VertexVertexIter vv_end(VertexHandle _vh);
│ │ │ +
1020 VertexVertexCWIter vv_cwend(VertexHandle _vh);
│ │ │ +
1022 VertexVertexCCWIter vv_ccwend(VertexHandle _vh);
│ │ │ +
1024 VertexIHalfedgeIter vih_end(VertexHandle _vh);
│ │ │ +
1026 VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh);
│ │ │ +
1028 VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh);
│ │ │ +
1030 VertexOHalfedgeIter voh_end(VertexHandle _vh);
│ │ │ +
1032 VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh);
│ │ │ +
1034 VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh);
│ │ │ +
1036 VertexEdgeIter ve_end(VertexHandle _vh);
│ │ │ +
1038 VertexEdgeCWIter ve_cwend(VertexHandle _vh);
│ │ │ +
1040 VertexEdgeCCWIter ve_ccwend(VertexHandle _vh);
│ │ │ +
1042 VertexFaceIter vf_end(VertexHandle _vh);
│ │ │ +
1044 VertexFaceCWIter vf_cwend(VertexHandle _vh);
│ │ │ +
1046 VertexFaceCCWIter vf_ccwend(VertexHandle _vh);
│ │ │ +
1047
│ │ │ +
1049 ConstVertexVertexIter cvv_end(VertexHandle _vh) const;
│ │ │ +
1051 ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const;
│ │ │ +
1053 ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const;
│ │ │ +
1055 ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const;
│ │ │ +
1057 ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const;
│ │ │ +
1059 ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const;
│ │ │ +
1061 ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const;
│ │ │ +
1063 ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const;
│ │ │ +
1065 ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const;
│ │ │ +
1067 ConstVertexEdgeIter cve_end(VertexHandle _vh) const;
│ │ │ +
1069 ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const;
│ │ │ +
1071 ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const;
│ │ │ +
1073 ConstVertexFaceIter cvf_end(VertexHandle _vh) const;
│ │ │ +
1075 ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const;
│ │ │ +
1077 ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const;
│ │ │ +
1078
│ │ │ +
1080 FaceVertexIter fv_end(FaceHandle _fh);
│ │ │ +
1082 FaceVertexCWIter fv_cwend(FaceHandle _fh);
│ │ │ +
1084 FaceVertexCCWIter fv_ccwend(FaceHandle _fh);
│ │ │ +
1086 FaceHalfedgeIter fh_end(FaceHandle _fh);
│ │ │ +
1088 FaceHalfedgeCWIter fh_cwend(FaceHandle _fh);
│ │ │ +
1090 FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh);
│ │ │ +
1092 FaceEdgeIter fe_end(FaceHandle _fh);
│ │ │ +
1094 FaceEdgeCWIter fe_cwend(FaceHandle _fh);
│ │ │ +
1096 FaceEdgeCCWIter fe_ccwend(FaceHandle _fh);
│ │ │ +
1098 FaceFaceIter ff_end(FaceHandle _fh);
│ │ │ +
1100 FaceFaceCWIter ff_cwend(FaceHandle _fh);
│ │ │ +
1102 FaceFaceCCWIter ff_ccwend(FaceHandle _fh);
│ │ │ +
1104 HalfedgeLoopIter hl_end(HalfedgeHandle _heh);
│ │ │ +
1106 HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh);
│ │ │ +
1108 HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh);
│ │ │ +
1109
│ │ │ +
1111 ConstFaceVertexIter cfv_end(FaceHandle _fh) const;
│ │ │ +
1113 ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const;
│ │ │ +
1115 ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const;
│ │ │ +
1117 ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const;
│ │ │ +
1119 ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const;
│ │ │ +
1121 ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const;
│ │ │ +
1123 ConstFaceEdgeIter cfe_end(FaceHandle _fh) const;
│ │ │ +
1125 ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const;
│ │ │ +
1127 ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const;
│ │ │ +
1129 ConstFaceFaceIter cff_end(FaceHandle _fh) const;
│ │ │ +
1131 ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const;
│ │ │ +
1133 ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const;
│ │ │ +
1135 ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const;
│ │ │ +
1137 ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const;
│ │ │ +
1139 ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const;
│ │ │ +
1140
│ │ │ +
1142 EdgeVertexIter ev_end(EdgeHandle _eh);
│ │ │ +
1144 EdgeHalfedgeIter eh_end(EdgeHandle _eh);
│ │ │ +
1146 EdgeFaceIter ef_end(EdgeHandle _eh);
│ │ │ +
1147
│ │ │ +
1149 ConstEdgeVertexIter cev_end(EdgeHandle _eh) const;
│ │ │ +
1151 ConstEdgeHalfedgeIter ceh_end(EdgeHandle _eh) const;
│ │ │ +
1153 ConstEdgeFaceIter cef_end(EdgeHandle _eh) const;
│ │ │ +
1154
│ │ │ +
1156
│ │ │ +
1159
│ │ │ +
1160 typedef EntityRange<RangeTraitT<
│ │ │ +
1161 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1165 typedef EntityRange<RangeTraitT<
│ │ │ +
1166 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1170 typedef EntityRange<RangeTraitT<
│ │ │ +
1171 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1175 typedef EntityRange<RangeTraitT<
│ │ │ +
1176 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1180 typedef EntityRange<RangeTraitT<
│ │ │ +
1181 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1185 typedef EntityRange<RangeTraitT<
│ │ │ +
1186 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1190 typedef EntityRange<RangeTraitT<
│ │ │ +
1191 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1195 typedef EntityRange<RangeTraitT<
│ │ │ +
1196 const PolyConnectivity,
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
1200
│ │ │ +
1201
│ │ │ +
1202 template <typename HandleType>
│ │ │ + │ │ │ +
1204
│ │ │ +
1209 ConstVertexRangeSkipping vertices() const;
│ │ │ +
1210
│ │ │ +
1215 ConstVertexRange all_vertices() const;
│ │ │ +
1216
│ │ │ +
1221 ConstHalfedgeRangeSkipping halfedges() const;
│ │ │ +
1222
│ │ │ +
1227 ConstHalfedgeRange all_halfedges() const;
│ │ │ +
1228
│ │ │ +
1233 ConstEdgeRangeSkipping edges() const;
│ │ │ +
1234
│ │ │ +
1239 ConstEdgeRange all_edges() const;
│ │ │ +
1240
│ │ │ +
1245 ConstFaceRangeSkipping faces() const;
│ │ │ +
1246
│ │ │ +
1251 ConstFaceRange all_faces() const;
│ │ │ +
1252
│ │ │ +
1257 template <typename HandleType>
│ │ │ + │ │ │ +
1259
│ │ │ +
1264 template <typename HandleType>
│ │ │ + │ │ │ +
1266
│ │ │ +
1267
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
1281
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
1292
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
1303
│ │ │ +
1308 ConstVertexVertexRange vv_range(VertexHandle _vh) const;
│ │ │ +
1309
│ │ │ +
1314 ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const;
│ │ │ +
1315
│ │ │ +
1321 ConstVertexIHalfedgeRange vih_range(HalfedgeHandle _heh) const;
│ │ │ +
1322
│ │ │ +
1327 ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const;
│ │ │ +
1328
│ │ │ +
1334 ConstVertexOHalfedgeRange voh_range(HalfedgeHandle _heh) const;
│ │ │ +
1335
│ │ │ +
1340 ConstVertexEdgeRange ve_range(VertexHandle _vh) const ;
│ │ │ +
1341
│ │ │ +
1346 ConstVertexFaceRange vf_range(VertexHandle _vh) const;
│ │ │ +
1347
│ │ │ +
1352 ConstFaceVertexRange fv_range(FaceHandle _fh) const;
│ │ │ +
1353
│ │ │ +
1358 ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const;
│ │ │ +
1359
│ │ │ +
1364 ConstFaceEdgeRange fe_range(FaceHandle _fh) const;
│ │ │ +
1365
│ │ │ +
1370 ConstFaceFaceRange ff_range(FaceHandle _fh) const;
│ │ │ +
1371
│ │ │ +
1376 ConstEdgeVertexRange ev_range(EdgeHandle _eh) const;
│ │ │ +
1377
│ │ │ +
1382 ConstEdgeHalfedgeRange eh_range(EdgeHandle _eh) const;
│ │ │ +
1383
│ │ │ +
1389 ConstEdgeHalfedgeRange eh_range(HalfedgeHandle _heh) const;
│ │ │ +
1390
│ │ │ +
1395 ConstEdgeFaceRange ef_range(EdgeHandle _eh) const;
│ │ │ +
1396
│ │ │ +
1401 ConstHalfedgeLoopRange hl_range(HalfedgeHandle _heh) const;
│ │ │ +
1402
│ │ │ +
1403
│ │ │ +
1408 ConstVertexVertexCWRange vv_cw_range(VertexHandle _vh) const;
│ │ │ +
1409
│ │ │ +
1414 ConstVertexIHalfedgeCWRange vih_cw_range(VertexHandle _vh) const;
│ │ │ +
1415
│ │ │ +
1421 ConstVertexIHalfedgeCWRange vih_cw_range(HalfedgeHandle _heh) const;
│ │ │ +
1422
│ │ │ +
1427 ConstVertexOHalfedgeCWRange voh_cw_range(VertexHandle _vh) const;
│ │ │ +
1428
│ │ │ +
1434 ConstVertexOHalfedgeCWRange voh_cw_range(HalfedgeHandle _heh) const;
│ │ │ +
1435
│ │ │ +
1440 ConstVertexEdgeCWRange ve_cw_range(VertexHandle _vh) const;
│ │ │ +
1441
│ │ │ +
1446 ConstVertexFaceCWRange vf_cw_range(VertexHandle _vh) const;
│ │ │ +
1447
│ │ │ +
1452 ConstFaceVertexCWRange fv_cw_range(FaceHandle _fh) const;
│ │ │ +
1453
│ │ │ +
1458 ConstFaceHalfedgeCWRange fh_cw_range(FaceHandle _fh) const;
│ │ │ +
1459
│ │ │ +
1464 ConstFaceEdgeCWRange fe_cw_range(FaceHandle _fh) const;
│ │ │ +
1465
│ │ │ +
1470 ConstFaceFaceCWRange ff_cw_range(FaceHandle _fh) const;
│ │ │ +
1471
│ │ │ +
1476 ConstHalfedgeLoopCWRange hl_cw_range(HalfedgeHandle _heh) const;
│ │ │ +
1477
│ │ │ +
1478
│ │ │ +
1483 ConstVertexVertexCCWRange vv_ccw_range(VertexHandle _vh) const;
│ │ │ +
1484
│ │ │ +
1489 ConstVertexIHalfedgeCCWRange vih_ccw_range(VertexHandle _vh) const;
│ │ │ +
1490
│ │ │ +
1496 ConstVertexIHalfedgeCCWRange vih_ccw_range(HalfedgeHandle _heh) const;
│ │ │ +
1497
│ │ │ +
1502 ConstVertexOHalfedgeCCWRange voh_ccw_range(VertexHandle _vh) const;
│ │ │ +
1503
│ │ │ +
1509 ConstVertexOHalfedgeCCWRange voh_ccw_range(HalfedgeHandle _heh) const;
│ │ │ +
1510
│ │ │ +
1515 ConstVertexEdgeCCWRange ve_ccw_range(VertexHandle _vh) const ;
│ │ │ +
1516
│ │ │ +
1521 ConstVertexFaceCCWRange vf_ccw_range(VertexHandle _vh) const;
│ │ │ +
1522
│ │ │ +
1527 ConstFaceVertexCCWRange fv_ccw_range(FaceHandle _fh) const;
│ │ │ +
1528
│ │ │ +
1533 ConstFaceHalfedgeCCWRange fh_ccw_range(FaceHandle _fh) const;
│ │ │ +
1534
│ │ │ +
1539 ConstFaceEdgeCCWRange fe_ccw_range(FaceHandle _fh) const;
│ │ │ +
1540
│ │ │ +
1545 ConstFaceFaceCCWRange ff_ccw_range(FaceHandle _fh) const;
│ │ │ +
1546
│ │ │ +
1547
│ │ │ +
1552 ConstHalfedgeLoopCCWRange hl_ccw_range(HalfedgeHandle _heh) const;
│ │ │ +
1553
│ │ │ +
1555
│ │ │ +
1556 //===========================================================================
│ │ │ +
1559 //===========================================================================
│ │ │ +
1560
│ │ │ +
│ │ │ + │ │ │ +
1569 { return ArrayKernel::is_boundary(_heh); }
│ │ │ +
│ │ │ +
1570
│ │ │ +
│ │ │ +
1579 bool is_boundary(EdgeHandle _eh) const
│ │ │ +
1580 {
│ │ │ +
1581 return (is_boundary(halfedge_handle(_eh, 0)) ||
│ │ │ +
1582 is_boundary(halfedge_handle(_eh, 1)));
│ │ │ +
1583 }
│ │ │ +
│ │ │ +
1584
│ │ │ +
│ │ │ + │ │ │ +
1597 {
│ │ │ +
1598 HalfedgeHandle heh(halfedge_handle(_vh));
│ │ │ +
1599 return (!(heh.is_valid() && face_handle(heh).is_valid()));
│ │ │ +
1600 }
│ │ │ +
│ │ │ +
1601
│ │ │ +
1611 bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const;
│ │ │ +
1612
│ │ │ +
1623 bool is_manifold(VertexHandle _vh) const;
│ │ │ +
1624
│ │ │ +
1627 // --- misc ---
│ │ │ +
1628
│ │ │ +
1632 void adjust_outgoing_halfedge(VertexHandle _vh);
│ │ │ +
1633
│ │ │ +
1635 SmartHalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const;
│ │ │ +
1637 uint valence(VertexHandle _vh) const;
│ │ │ +
1639 uint valence(FaceHandle _fh) const;
│ │ │ +
1640
│ │ │ +
1641 // --- connectivity operattions
│ │ │ +
1642
│ │ │ +
1657 void collapse(HalfedgeHandle _heh);
│ │ │ +
1662 bool is_simple_link(EdgeHandle _eh) const;
│ │ │ +
1667 bool is_simply_connected(FaceHandle _fh) const;
│ │ │ +
1680 FaceHandle remove_edge(EdgeHandle _eh);
│ │ │ +
1684 void reinsert_edge(EdgeHandle _eh);
│ │ │ +
1694 HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh);
│ │ │ +
1695
│ │ │ +
1708 void split(FaceHandle _fh, VertexHandle _vh);
│ │ │ +
1709
│ │ │ +
1723 void split_copy(FaceHandle _fh, VertexHandle _vh);
│ │ │ +
1724
│ │ │ +
1738 void triangulate(FaceHandle _fh);
│ │ │ +
1739
│ │ │ +
1742 void triangulate();
│ │ │ +
1743
│ │ │ +
1754 void split_edge(EdgeHandle _eh, VertexHandle _vh);
│ │ │ +
1755
│ │ │ +
1767 void split_edge_copy(EdgeHandle _eh, VertexHandle _vh);
│ │ │ +
1768
│ │ │ +
1769
│ │ │ +
1776 const Vertex& deref(VertexHandle _h) const { return vertex(_h); }
│ │ │ +
1777 Vertex& deref(VertexHandle _h) { return vertex(_h); }
│ │ │ +
1778 const Halfedge& deref(HalfedgeHandle _h) const { return halfedge(_h); }
│ │ │ +
1779 Halfedge& deref(HalfedgeHandle _h) { return halfedge(_h); }
│ │ │ +
1780 const Edge& deref(EdgeHandle _h) const { return edge(_h); }
│ │ │ +
1781 Edge& deref(EdgeHandle _h) { return edge(_h); }
│ │ │ +
1782 const Face& deref(FaceHandle _h) const { return face(_h); }
│ │ │ +
1783 Face& deref(FaceHandle _h) { return face(_h); }
│ │ │ +
1785
│ │ │ +
1786protected:
│ │ │ +
1788 void collapse_edge(HalfedgeHandle _hh);
│ │ │ +
1790 void collapse_loop(HalfedgeHandle _hh);
│ │ │ +
1791
│ │ │ +
1792
│ │ │ +
1793
│ │ │ +
1794private: // Working storage for add_face()
│ │ │ +
1795 struct AddFaceEdgeInfo
│ │ │ +
1796 {
│ │ │ +
1797 HalfedgeHandle halfedge_handle;
│ │ │ +
1798 bool is_new;
│ │ │ +
1799 bool needs_adjust;
│ │ │ +
1800 };
│ │ │ +
1801 std::vector<AddFaceEdgeInfo> edgeData_; //
│ │ │ +
1802 std::vector<std::pair<HalfedgeHandle, HalfedgeHandle> > next_cache_; // cache for set_next_halfedge and vertex' set_halfedge
│ │ │ +
1803
│ │ │ +
1804};
│ │ │ +
│ │ │ +
1805
│ │ │ +
1806template <>
│ │ │ +
│ │ │ + │ │ │ +
1808{
│ │ │ +
1809 using Range = ConstVertexRange;
│ │ │ + │ │ │ +
1811};
│ │ │ +
│ │ │ +
1812
│ │ │ +
1813template <>
│ │ │ +
│ │ │ + │ │ │ +
1815{
│ │ │ +
1816 using Range = ConstHalfedgeRange;
│ │ │ + │ │ │ +
1818};
│ │ │ +
│ │ │ +
1819
│ │ │ +
1820template <>
│ │ │ +
│ │ │ + │ │ │ +
1822{
│ │ │ +
1823 using Range = ConstEdgeRange;
│ │ │ + │ │ │ +
1825};
│ │ │ +
│ │ │ +
1826
│ │ │ +
1827template <>
│ │ │ +
│ │ │ + │ │ │ +
1829{
│ │ │ +
1830 using Range = ConstFaceRange;
│ │ │ + │ │ │ +
1832};
│ │ │ +
│ │ │ +
1833
│ │ │ +
1834}//namespace OpenMesh
│ │ │ +
1835
│ │ │ +
1836#define OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ +
1837#include <OpenMesh/Core/Mesh/SmartHandles.hh>
│ │ │ +
1838#include <OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh>
│ │ │ +
1839#undef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ +
1840
│ │ │ +
1841#endif//OPENMESH_POLYCONNECTIVITY_HH
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Definition of the mesh entities (items).
Definition FinalMeshItemsT.hh:68
│ │ │ -
Definition FinalMeshItemsT.hh:120
│ │ │ -
Cast a mesh with different but identical traits into each other.
Definition FinalMeshItemsT.hh:178
│ │ │ +
Mesh kernel using arrays for mesh item storage.
Definition ArrayKernel.hh:88
│ │ │ +
bool is_boundary(HalfedgeHandle _heh) const
Is halfedge _heh a boundary halfedge (is its face handle invalid) ?
Definition ArrayKernel.hh:400
│ │ │ +
void assign_connectivity(const ArrayKernel &_other)
ArrayKernel uses the default copy constructor and assignment operator, which means that the connectiv...
Definition ArrayKernel.cc:71
│ │ │ +
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ +
Definition CirculatorsT.hh:305
│ │ │ + │ │ │
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │
Handle for a edge entity.
Definition Handles.hh:135
│ │ │
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │ +
Definition IteratorsT.hh:82
│ │ │ +
Generic class for vertex/halfedge/edge/face ranges.
Definition PolyConnectivity_inline_impl.hh:76
│ │ │ +
Definition PolyConnectivity.hh:77
│ │ │ +
Definition PolyConnectivity.hh:96
│ │ │ +
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ +
const Halfedge & deref(HalfedgeHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1778
│ │ │ +
VertexVertexCWIter VVCWIter
Alias typedef.
Definition PolyConnectivity.hh:461
│ │ │ +
ConstVertexVertexIter CVVIter
Alias typedef.
Definition PolyConnectivity.hh:489
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange
Definition PolyConnectivity.hh:1268
│ │ │ +
EdgeIter edges_end()
End iterator for edges.
Definition PolyConnectivity_inline_impl.hh:338
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity::cfv_end > > ConstFaceVertexRange
Definition PolyConnectivity.hh:1273
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange
Definition PolyConnectivity.hh:1288
│ │ │ +
EdgeIter ConstEdgeIter
Linear iterator.
Definition PolyConnectivity.hh:146
│ │ │ +
EdgeIter EIter
Alias typedef.
Definition PolyConnectivity.hh:452
│ │ │ +
VertexVertexIter VVIter
Alias typedef.
Definition PolyConnectivity.hh:460
│ │ │ +
Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter
Enumerates incident edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:258
│ │ │ +
VertexVertexCCWIter VVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:462
│ │ │ +
ConstVertexIHalfedgeCCWIter CVIHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:497
│ │ │ +
HalfedgeLoopCWIter ConstHalfedgeLoopCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:433
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity::cff_cwend > > ConstFaceFaceCWRange
Definition PolyConnectivity.hh:1290
│ │ │ +
Edge & deref(EdgeHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1781
│ │ │ +
HalfedgeIter halfedges_end()
End iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:326
│ │ │ +
ConstFaceHalfedgeCCWIter CFHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:509
│ │ │ +
VertexHandle VHandle
Alias typedef.
Definition PolyConnectivity.hh:445
│ │ │ +
ConstFaceVertexCCWIter CFVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:506
│ │ │ +
PolyConnectivity This
Invalid handle.
Definition PolyConnectivity.hh:129
│ │ │ +
Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, &ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter
Linear iterator.
Definition PolyConnectivity.hh:140
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange
Definition PolyConnectivity.hh:1299
│ │ │ +
ConstVertexFaceCCWIter CVFCCWIter
Alias typedef.
Definition PolyConnectivity.hh:503
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange
Definition PolyConnectivity.hh:1293
│ │ │ +
VertexIHalfedgeIter ConstVertexIHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:285
│ │ │ +
VertexFaceCCWIter VFCCWIter
Alias typedef.
Definition PolyConnectivity.hh:474
│ │ │ +
FaceFaceIter ConstFaceFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:378
│ │ │ +
FaceEdgeCWIter FECWIter
Alias typedef.
Definition PolyConnectivity.hh:482
│ │ │ +
Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter
Enumerates 1-ring vertices in a counter clockwise fashion.
Definition PolyConnectivity.hh:180
│ │ │ +
VertexIter vertices_sbegin()
Begin iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:357
│ │ │ +
HalfedgeIter halfedges_sbegin()
Begin iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:363
│ │ │ +
FaceVertexCCWIter FVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:477
│ │ │ +
ConstVertexIter CVIter
Alias typedef.
Definition PolyConnectivity.hh:455
│ │ │ +
ConstHalfedgeIter CHIter
Alias typedef.
Definition PolyConnectivity.hh:456
│ │ │ +
Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter
Enumerate incident vertices in a clockwise fashion.
Definition PolyConnectivity.hh:316
│ │ │ +
HalfedgeIter halfedges_begin()
Begin iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:320
│ │ │ +
static const HalfedgeHandle InvalidHalfedgeHandle
Invalid handle.
Definition PolyConnectivity.hh:122
│ │ │ +
SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:57
│ │ │ +
FaceFaceCWIter ConstFaceFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:379
│ │ │ +
FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:374
│ │ │ +
EdgeIter edges_sbegin()
Begin iterator for edges.
Definition PolyConnectivity_inline_impl.hh:369
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange
Definition PolyConnectivity.hh:1282
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange
Definition PolyConnectivity.hh:1295
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > > ConstEdgeRangeSkipping
Definition PolyConnectivity.hh:1189
│ │ │ +
EdgeIter edges_begin()
Begin iterator for edges.
Definition PolyConnectivity_inline_impl.hh:332
│ │ │ +
ConstFaceEdgeCCWIter CFECCWIter
Alias typedef.
Definition PolyConnectivity.hh:512
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange
Definition PolyConnectivity.hh:1302
│ │ │ +
ConstEdgeIter CEIter
Alias typedef.
Definition PolyConnectivity.hh:457
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange
Definition PolyConnectivity.hh:1287
│ │ │ +
ElementRange< HandleType >::Range all_elements() const
│ │ │ +
ConstFaceVertexIter CFVIter
Alias typedef.
Definition PolyConnectivity.hh:504
│ │ │ +
VertexVertexCCWIter ConstVertexVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:281
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange
Definition PolyConnectivity.hh:1269
│ │ │ +
ConstVertexOHalfedgeIter CVOHIter
Alias typedef.
Definition PolyConnectivity.hh:492
│ │ │ +
Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, &ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter
Linear iterator.
Definition PolyConnectivity.hh:139
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > ConstFaceRange
Definition PolyConnectivity.hh:1194
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity::cff_ccwend > > ConstFaceFaceCCWRange
Definition PolyConnectivity.hh:1301
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange
Definition PolyConnectivity.hh:1283
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > VertexIHalfedgeIter
Enumerates incoming half edges in a clockwise fashion.
Definition PolyConnectivity.hh:213
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity::vertices_end > > ConstVertexRange
Definition PolyConnectivity.hh:1164
│ │ │ +
FaceFaceCCWIter ConstFaceFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:380
│ │ │ +
ConstFaceEdgeIter CFEIter
Alias typedef.
Definition PolyConnectivity.hh:510
│ │ │ +
PolyConnectivity()
Alias typedef.
Definition PolyConnectivity.hh:523
│ │ │ +
VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:283
│ │ │ +
FaceEdgeCWIter ConstFaceEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:376
│ │ │ +
ConstVertexIHalfedgeCWIter CVIHCWIter
Alias typedef.
Definition PolyConnectivity.hh:496
│ │ │ +
ConstFaceHalfedgeIter CFHIter
Alias typedef.
Definition PolyConnectivity.hh:507
│ │ │ +
ConstFaceVertexCWIter CFVCWIter
Alias typedef.
Definition PolyConnectivity.hh:505
│ │ │ +
VertexFaceIter VFIter
Alias typedef.
Definition PolyConnectivity.hh:472
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:174
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange
Definition PolyConnectivity.hh:1284
│ │ │ +
HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:434
│ │ │ +
ConstVertexOHalfedgeCCWIter CVOHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:494
│ │ │ +
HalfedgeIter HIter
Alias typedef.
Definition PolyConnectivity.hh:451
│ │ │ +
VertexEdgeIter ConstVertexEdgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:291
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter
Enumerate incident half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:321
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity::cfe_end > > ConstFaceEdgeRange
Definition PolyConnectivity.hh:1275
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > VertexOHalfedgeIter
Enumerates outgoing half edges in a clockwise fashion.
Definition PolyConnectivity.hh:194
│ │ │ +
HalfedgeLoopIter ConstHalfedgeLoopIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:432
│ │ │ +
HalfedgeHandle HHandle
Alias typedef.
Definition PolyConnectivity.hh:446
│ │ │ +
static bool is_triangles()
Alias typedef.
Definition PolyConnectivity.hh:526
│ │ │ +
ConstFaceFaceCWIter CFFCWIter
Alias typedef.
Definition PolyConnectivity.hh:514
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange
Definition PolyConnectivity.hh:1280
│ │ │ +
VertexIHalfedgeIter VIHIter
Alias typedef.
Definition PolyConnectivity.hh:466
│ │ │ +
EdgeVertexIter ConstEdgeVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:425
│ │ │ +
VertexFaceIter ConstVertexFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:288
│ │ │ +
VertexIter VIter
Alias typedef.
Definition PolyConnectivity.hh:450
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange
Definition PolyConnectivity.hh:1285
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange
Definition PolyConnectivity.hh:1296
│ │ │ +
VertexIter ConstVertexIter
Linear iterator.
Definition PolyConnectivity.hh:144
│ │ │ +
Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, &ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter
Linear iterator.
Definition PolyConnectivity.hh:142
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter
Enumerates incident edges in a clockwise fashion.
Definition PolyConnectivity.hh:253
│ │ │ +
FaceVertexIter ConstFaceVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:369
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity::cfe_cwend > > ConstFaceEdgeCWRange
Definition PolyConnectivity.hh:1289
│ │ │ +
VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:287
│ │ │ +
ConstVertexEdgeCWIter CVECWIter
Alias typedef.
Definition PolyConnectivity.hh:499
│ │ │ +
VertexFaceCWIter ConstVertexFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:289
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity::cve_end > > ConstVertexEdgeRange
Definition PolyConnectivity.hh:1271
│ │ │ +
ConstEdgeVertexIter CEVIter
Alias typedef.
Definition PolyConnectivity.hh:516
│ │ │ +
EdgeFaceIter ConstEdgeFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:427
│ │ │ +
FaceEdgeCCWIter FECWWIter
Alias typedef.
Definition PolyConnectivity.hh:483
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter
Enumerate the halfedges of an edge.
Definition PolyConnectivity.hh:410
│ │ │ +
FaceHalfedgeIter FHIter
Alias typedef.
Definition PolyConnectivity.hh:478
│ │ │ +
EdgeHalfedgeIter EHIter
Alias typedef.
Definition PolyConnectivity.hh:486
│ │ │ +
ElementRange< HandleType >::RangeSkipping elements() const
│ │ │ +
bool is_boundary(EdgeHandle _eh) const
Is the edge a boundary edge?
Definition PolyConnectivity.hh:1579
│ │ │ +
const Edge & deref(EdgeHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1780
│ │ │ +
FaceIter faces_sbegin()
Begin iterator for faces.
Definition PolyConnectivity_inline_impl.hh:375
│ │ │ +
virtual ~PolyConnectivity()
Alias typedef.
Definition PolyConnectivity.hh:524
│ │ │ +
Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > VertexOHalfedgeCCWIter
Enumerates outgoing half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:200
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter
Enumerates incident faces in a clockwise fashion.
Definition PolyConnectivity.hh:233
│ │ │ +
VertexEdgeCWIter VECWIter
Alias typedef.
Definition PolyConnectivity.hh:470
│ │ │ +
static const FaceHandle InvalidFaceHandle
Invalid handle.
Definition PolyConnectivity.hh:126
│ │ │ +
Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, &ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter
Linear iterator.
Definition PolyConnectivity.hh:141
│ │ │ +
ConstVertexEdgeCCWIter CVECCWIter
Alias typedef.
Definition PolyConnectivity.hh:500
│ │ │ +
EdgeHalfedgeIter ConstEdgeHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:426
│ │ │ +
EdgeVertexIter EVIter
Alias typedef.
Definition PolyConnectivity.hh:485
│ │ │ +
ConstVertexVertexCCWIter CVVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:491
│ │ │ +
FaceHalfedgeCCWIter FHCWWIter
Alias typedef.
Definition PolyConnectivity.hh:480
│ │ │ +
bool is_boundary(VertexHandle _vh) const
Is vertex _vh a boundary vertex ?
Definition PolyConnectivity.hh:1596
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter
Identical to FaceHalfedgeIter.
Definition PolyConnectivity.hh:277
│ │ │ +
Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:362
│ │ │ +
FaceEdgeCCWIter ConstFaceEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:377
│ │ │ +
ConstVertexVertexCWIter CVVCWIter
Alias typedef.
Definition PolyConnectivity.hh:490
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter
Identical to FaceHalfedgeIter.
Definition PolyConnectivity.hh:272
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > ConstEdgeRange
Definition PolyConnectivity.hh:1184
│ │ │ +
ConstEdgeFaceIter CEFIter
Alias typedef.
Definition PolyConnectivity.hh:518
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity::cfe_ccwend > > ConstFaceEdgeCCWRange
Definition PolyConnectivity.hh:1300
│ │ │ +
VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:284
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRangeSkipping
Definition PolyConnectivity.hh:1179
│ │ │ +
ConstVertexOHalfedgeCWIter CVOHCWIter
Alias typedef.
Definition PolyConnectivity.hh:493
│ │ │ +
FaceHalfedgeIter ConstFaceHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:372
│ │ │ +
VertexOHalfedgeCWIter VOHCWIter
Alias typedef.
Definition PolyConnectivity.hh:464
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter
Enumerate incident vertices in a counter clockwise fashion.
Definition PolyConnectivity.hh:310
│ │ │ +
FaceVertexCWIter FVCWIter
Alias typedef.
Definition PolyConnectivity.hh:476
│ │ │ +
Face & deref(FaceHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1783
│ │ │ +
EdgeFaceIter EFIter
Alias typedef.
Definition PolyConnectivity.hh:487
│ │ │ +
static const VertexHandle InvalidVertexHandle
Invalid handle.
Definition PolyConnectivity.hh:120
│ │ │ +
VertexIter vertices_begin()
Begin iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:308
│ │ │ +
ConstFaceIter CFIter
Alias typedef.
Definition PolyConnectivity.hh:458
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange
Definition PolyConnectivity.hh:1286
│ │ │ +
Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:234
│ │ │ +
HalfedgeIter ConstHalfedgeIter
Linear iterator.
Definition PolyConnectivity.hh:145
│ │ │ +
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > VertexIHalfedgeCCWIter
Enumerates incoming half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:219
│ │ │ +
FaceVertexCCWIter ConstFaceVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:371
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange
Definition PolyConnectivity.hh:1270
│ │ │ +
static const EdgeHandle InvalidEdgeHandle
Invalid handle.
Definition PolyConnectivity.hh:124
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity::ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange
Definition PolyConnectivity.hh:1278
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity::vertices_end > > ConstVertexRangeSkipping
Definition PolyConnectivity.hh:1169
│ │ │ +
Halfedge & deref(HalfedgeHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1779
│ │ │ +
Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:254
│ │ │ +
FaceEdgeIter FEIter
Alias typedef.
Definition PolyConnectivity.hh:481
│ │ │ +
FaceEdgeIter ConstFaceEdgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:375
│ │ │ +
ConstVertexEdgeIter CVEIter
Alias typedef.
Definition PolyConnectivity.hh:498
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:322
│ │ │ +
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > VertexIHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:214
│ │ │ +
FaceIter faces_end()
End iterator for faces.
Definition PolyConnectivity_inline_impl.hh:350
│ │ │ +
void assign_connectivity(const PolyConnectivity &_other)
assign_connectivity() method.
Definition PolyConnectivity.hh:531
│ │ │ +
VertexOHalfedgeCCWIter VOHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:465
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity::cvf_end > > ConstVertexFaceRange
Definition PolyConnectivity.hh:1272
│ │ │ +
EdgeHandle EHandle
Alias typedef.
Definition PolyConnectivity.hh:447
│ │ │ +
FaceHandle FHandle
Alias typedef.
Definition PolyConnectivity.hh:448
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange
Definition PolyConnectivity.hh:1294
│ │ │ +
Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:311
│ │ │ +
ConstFaceEdgeCWIter CFECWIter
Alias typedef.
Definition PolyConnectivity.hh:511
│ │ │ +
ConstFaceFaceIter CFFIter
Alias typedef.
Definition PolyConnectivity.hh:513
│ │ │ +
VertexFaceCCWIter ConstVertexFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:290
│ │ │ +
ConstEdgeHalfedgeIter CEHIter
Alias typedef.
Definition PolyConnectivity.hh:517
│ │ │ +
VertexOHalfedgeIter ConstVertexOHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:282
│ │ │ +
VertexIHalfedgeCWIter VIHICWter
Alias typedef.
Definition PolyConnectivity.hh:467
│ │ │ +
VertexEdgeIter VEIter
Alias typedef.
Definition PolyConnectivity.hh:469
│ │ │ +
FaceIter ConstFaceIter
Linear iterator.
Definition PolyConnectivity.hh:147
│ │ │ +
VertexOHalfedgeIter VOHIter
Alias typedef.
Definition PolyConnectivity.hh:463
│ │ │ +
VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:286
│ │ │ +
VertexEdgeCWIter ConstVertexEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:292
│ │ │ +
Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:175
│ │ │ +
ConstVertexFaceCWIter CVFCWIter
Alias typedef.
Definition PolyConnectivity.hh:502
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity::cef_end > > ConstEdgeFaceRange
Definition PolyConnectivity.hh:1279
│ │ │ +
bool is_boundary(HalfedgeHandle _heh) const
Check if the halfedge is at the boundary.
Definition PolyConnectivity.hh:1568
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRange
Definition PolyConnectivity.hh:1174
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter
Enumerate incident half edges in a clockwise fashion.
Definition PolyConnectivity.hh:327
│ │ │ +
VertexVertexCWIter ConstVertexVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:280
│ │ │ +
VertexEdgeCCWIter ConstVertexEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:293
│ │ │ +
VertexVertexIter ConstVertexVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:279
│ │ │ +
VertexFaceCWIter VFCWIter
Alias typedef.
Definition PolyConnectivity.hh:473
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter
Enumerate adjacent faces in a counter clockwise fashion.
Definition PolyConnectivity.hh:361
│ │ │ +
FaceHalfedgeCWIter ConstFaceHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:373
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange
Definition PolyConnectivity.hh:1274
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter
Enumerate faces incident to an edge.
Definition PolyConnectivity.hh:423
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity::cev_end > > ConstEdgeVertexRange
Definition PolyConnectivity.hh:1277
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:273
│ │ │ +
const Vertex & deref(VertexHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1776
│ │ │ +
Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter
Enumerate adjacent faces in a clockwise fashion.
Definition PolyConnectivity.hh:367
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter
Enumerate incident edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:341
│ │ │ +
VertexIter vertices_end()
End iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:314
│ │ │ +
Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter
Enumerate incident edges in a clockwise fashion.
Definition PolyConnectivity.hh:347
│ │ │ +
Vertex & deref(VertexHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1777
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter
Enumerate vertices incident to an edge.
Definition PolyConnectivity.hh:397
│ │ │ +
Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter
Enumerates incident faces in a counter clockwise fashion.
Definition PolyConnectivity.hh:239
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity::cff_end > > ConstFaceFaceRange
Definition PolyConnectivity.hh:1276
│ │ │ +
ConstFaceHalfedgeCWIter CFHCWIter
Alias typedef.
Definition PolyConnectivity.hh:508
│ │ │ +
const Face & deref(FaceHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1782
│ │ │ +
FaceIter faces_begin()
Begin iterator for faces.
Definition PolyConnectivity_inline_impl.hh:344
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange
Definition PolyConnectivity.hh:1291
│ │ │ +
FaceVertexIter FVIter
Alias typedef.
Definition PolyConnectivity.hh:475
│ │ │ +
FaceFaceIter FFIter
Alias typedef.
Definition PolyConnectivity.hh:484
│ │ │ +
FaceHalfedgeCWIter FHCWIter
Alias typedef.
Definition PolyConnectivity.hh:479
│ │ │ +
Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:342
│ │ │ +
ConstFaceFaceCCWIter CFFCCWIter
Alias typedef.
Definition PolyConnectivity.hh:515
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange
Definition PolyConnectivity.hh:1297
│ │ │ +
VertexIHalfedgeCCWIter VIHICCWter
Alias typedef.
Definition PolyConnectivity.hh:468
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > > ConstFaceRangeSkipping
Definition PolyConnectivity.hh:1199
│ │ │ +
ConstVertexIHalfedgeIter CVIHIter
Alias typedef.
Definition PolyConnectivity.hh:495
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange
Definition PolyConnectivity.hh:1298
│ │ │ +
VertexEdgeCCWIter VECCWIter
Alias typedef.
Definition PolyConnectivity.hh:471
│ │ │ +
FaceVertexCWIter ConstFaceVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:370
│ │ │ +
FaceIter FIter
Alias typedef.
Definition PolyConnectivity.hh:453
│ │ │ +
Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > VertexOHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:195
│ │ │ +
ConstVertexFaceIter CVFIter
Alias typedef.
Definition PolyConnectivity.hh:501
│ │ │ +
Definition PolyConnectivity.hh:163
│ │ │ +
Definition PolyConnectivity.hh:184
│ │ │ + │ │ │ +
Definition PolyConnectivity.hh:223
│ │ │ +
Definition PolyConnectivity.hh:243
│ │ │ +
Definition PolyConnectivity.hh:262
│ │ │ +
Definition PolyConnectivity.hh:300
│ │ │ +
Definition PolyConnectivity.hh:331
│ │ │ +
Definition PolyConnectivity.hh:351
│ │ │ +
Definition PolyConnectivity.hh:387
│ │ │ +
Definition PolyConnectivity.hh:400
│ │ │ +
Definition PolyConnectivity.hh:413
│ │ │ +
Definition PolyConnectivity.hh:1203
│ │ │ +
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ +
Definition SmartHandles.hh:170
│ │ │ +
Definition SmartHandles.hh:197
│ │ │ +
Definition SmartHandles.hh:228
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -FinalMeshItemsT.hh │ │ │ │ +PolyConnectivity.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,206 +47,2174 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44#ifndef OPENMESH_MESH_ITEMS_HH │ │ │ │ -45#define OPENMESH_MESH_ITEMS_HH │ │ │ │ +44#ifndef OPENMESH_POLYCONNECTIVITY_HH │ │ │ │ +45#define OPENMESH_POLYCONNECTIVITY_HH │ │ │ │ 46 │ │ │ │ -47 │ │ │ │ -48//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ 49 │ │ │ │ -50 │ │ │ │ -51#include │ │ │ │ -52#include │ │ │ │ -53#include │ │ │ │ -54#include │ │ │ │ -55 │ │ │ │ -56 │ │ │ │ -57//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -58 │ │ │ │ -59 │ │ │ │ -60namespace _O_p_e_n_M_e_s_h { │ │ │ │ -61 │ │ │ │ -62 │ │ │ │ -63//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -64 │ │ │ │ -66template │ │ │ │ -_6_7struct _F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ -68{ │ │ │ │ -69 //--- build Refs structure --- │ │ │ │ -70#ifndef DOXY_IGNORE_THIS │ │ │ │ -71 struct Refs │ │ │ │ -72 { │ │ │ │ -73 typedef typename Traits::Point Point; │ │ │ │ -74 typedef typename _v_e_c_t_o_r___t_r_a_i_t_s_<_P_o_i_n_t_>_:_:_v_a_l_u_e___t_y_p_e Scalar; │ │ │ │ -75 │ │ │ │ -76 typedef typename Traits::Normal Normal; │ │ │ │ -77 typedef typename Traits::Color Color; │ │ │ │ -78 typedef typename Traits::TexCoord1D TexCoord1D; │ │ │ │ -79 typedef typename Traits::TexCoord2D TexCoord2D; │ │ │ │ -80 typedef typename Traits::TexCoord3D TexCoord3D; │ │ │ │ -81 typedef typename Traits::TextureIndex TextureIndex; │ │ │ │ -82 typedef _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -83 typedef _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _F_a_c_e_H_a_n_d_l_e; │ │ │ │ -84 typedef _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e _E_d_g_e_H_a_n_d_l_e; │ │ │ │ -85 typedef _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -86 }; │ │ │ │ -87#endif │ │ │ │ -88 //--- export Refs types --- │ │ │ │ -89 typedef typename Refs::Point Point; │ │ │ │ -90 typedef typename Refs::Scalar Scalar; │ │ │ │ -91 typedef typename Refs::Normal Normal; │ │ │ │ -92 typedef typename Refs::Color Color; │ │ │ │ -93 typedef typename Refs::TexCoord1D TexCoord1D; │ │ │ │ -94 typedef typename Refs::TexCoord2D TexCoord2D; │ │ │ │ -95 typedef typename Refs::TexCoord3D TexCoord3D; │ │ │ │ -96 typedef typename Refs::TextureIndex TextureIndex; │ │ │ │ -97 │ │ │ │ -98 //--- get attribute bits from Traits --- │ │ │ │ -99 enum Attribs │ │ │ │ -100 { │ │ │ │ -101 VAttribs = Traits::VertexAttributes, │ │ │ │ -102 HAttribs = Traits::HalfedgeAttributes, │ │ │ │ -103 EAttribs = Traits::EdgeAttributes, │ │ │ │ -104 FAttribs = Traits::FaceAttributes │ │ │ │ -105 }; │ │ │ │ -106 //--- merge internal items with traits items --- │ │ │ │ -107 │ │ │ │ -108 │ │ │ │ -109/* │ │ │ │ -110 typedef typename GenProg::IF< │ │ │ │ -111 (bool)(HAttribs & Attributes::PrevHalfedge), │ │ │ │ -112 typename InternalItems::Halfedge_with_prev, │ │ │ │ -113 typename InternalItems::Halfedge_without_prev │ │ │ │ -114 >::Result InternalHalfedge; │ │ │ │ -115*/ │ │ │ │ -116 //typedef typename InternalItems::Vertex InternalVertex; │ │ │ │ -117 //typedef typename InternalItems::template Edge InternalEdge; │ │ │ │ -118 //typedef typename InternalItems::template Face InternalFace; │ │ │ │ -_1_1_9 class _I_T_r_a_i_t_s │ │ │ │ -120 {}; │ │ │ │ -121 │ │ │ │ -122 typedef typename Traits::template VertexT VertexData; │ │ │ │ -123 typedef typename Traits::template HalfedgeT HalfedgeData; │ │ │ │ -124 typedef typename Traits::template EdgeT EdgeData; │ │ │ │ -125 typedef typename Traits::template FaceT FaceData; │ │ │ │ -126}; │ │ │ │ -127 │ │ │ │ +50namespace _O_p_e_n_M_e_s_h │ │ │ │ +51{ │ │ │ │ +52 │ │ │ │ +53namespace Iterators │ │ │ │ +54{ │ │ │ │ +55 template │ │ │ │ +56 class GenericIteratorT; │ │ │ │ +57 │ │ │ │ +58 template │ │ │ │ +59 class GenericCirculatorBaseT; │ │ │ │ +60 │ │ │ │ +61 template │ │ │ │ +62 class GenericCirculatorT_DEPRECATED; │ │ │ │ +63 │ │ │ │ +64 template │ │ │ │ +65 class GenericCirculatorT; │ │ │ │ +66} │ │ │ │ +67 │ │ │ │ +68template │ │ │ │ +69class EntityRange; │ │ │ │ +70 │ │ │ │ +71template< │ │ │ │ +72 typename CONTAINER_T, │ │ │ │ +73 typename ITER_T, │ │ │ │ +74 ITER_T (CONTAINER_T::*begin_fn)() const, │ │ │ │ +75 ITER_T (CONTAINER_T::*end_fn)() const> │ │ │ │ +_7_6struct _R_a_n_g_e_T_r_a_i_t_T │ │ │ │ +77{ │ │ │ │ +78 using CONTAINER_TYPE = CONTAINER_T; │ │ │ │ +79 using ITER_TYPE = ITER_T; │ │ │ │ +80 static ITER_TYPE begin(const CONTAINER_TYPE& _container) { return │ │ │ │ +(_container.*begin_fn)(); } │ │ │ │ +81 static ITER_TYPE end(const CONTAINER_TYPE& _container) { return │ │ │ │ +(_container.*end_fn)(); } │ │ │ │ +82}; │ │ │ │ +83 │ │ │ │ +84 │ │ │ │ +85template │ │ │ │ +86class _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ +87 │ │ │ │ +88template< │ │ │ │ +89 typename CONTAINER_T, │ │ │ │ +90 typename ITER_T, │ │ │ │ +91 typename CENTER_ENTITY_T, │ │ │ │ +92 typename TO_ENTITY_T, │ │ │ │ +93 ITER_T (CONTAINER_T::*begin_fn)(CENTER_ENTITY_T) const, │ │ │ │ +94 ITER_T (CONTAINER_T::*end_fn)(CENTER_ENTITY_T) const> │ │ │ │ +_9_5struct _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T │ │ │ │ +96{ │ │ │ │ +97 using CONTAINER_TYPE = CONTAINER_T; │ │ │ │ +98 using ITER_TYPE = ITER_T; │ │ │ │ +99 using CENTER_ENTITY_TYPE = CENTER_ENTITY_T; │ │ │ │ +100 using TO_ENTITYE_TYPE = TO_ENTITY_T; │ │ │ │ +101 static ITER_TYPE begin(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE │ │ │ │ +_ce) { return (_container.*begin_fn)(_ce); } │ │ │ │ +102 static ITER_TYPE begin(const CONTAINER_TYPE& _container, _H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh, int) { return ITER_TYPE(_container, _heh); } │ │ │ │ +103 static ITER_TYPE end(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE │ │ │ │ +_ce) { return (_container.*end_fn)(_ce); } │ │ │ │ +104 static ITER_TYPE end(const CONTAINER_TYPE& _container, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, │ │ │ │ +int) { return ITER_TYPE(_container, _heh, true); } │ │ │ │ +105}; │ │ │ │ +106 │ │ │ │ +107struct _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +108struct _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +109struct _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +110struct _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +111 │ │ │ │ +_1_1_4class OPENMESHDLLEXPORT _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y : public _A_r_r_a_y_K_e_r_n_e_l │ │ │ │ +115{ │ │ │ │ +116public: │ │ │ │ +118 │ │ │ │ +119 │ │ │ │ +_1_2_0 static const _V_e_r_t_e_x_H_a_n_d_l_e _I_n_v_a_l_i_d_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +_1_2_2 static const _H_a_l_f_e_d_g_e_H_a_n_d_l_e _I_n_v_a_l_i_d_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +_1_2_4 static const _E_d_g_e_H_a_n_d_l_e _I_n_v_a_l_i_d_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +_1_2_6 static const _F_a_c_e_H_a_n_d_l_e _I_n_v_a_l_i_d_F_a_c_e_H_a_n_d_l_e; │ │ │ │ 128 │ │ │ │ -129#ifndef DOXY_IGNORE_THIS │ │ │ │ -130namespace { │ │ │ │ -131namespace TM { │ │ │ │ -132template struct TypeEquality; │ │ │ │ -133template struct TypeEquality {}; │ │ │ │ -134 │ │ │ │ -135template struct ItemsEquality { │ │ │ │ -136 TypeEquality te1; │ │ │ │ -137 TypeEquality te2; │ │ │ │ -138 TypeEquality te3; │ │ │ │ -139 TypeEquality te4; │ │ │ │ -140 TypeEquality te5; │ │ │ │ -141 TypeEquality te6; │ │ │ │ -142 TypeEquality te7; │ │ │ │ -143 TypeEquality te8; │ │ │ │ -144}; │ │ │ │ -145 │ │ │ │ -146} /* namespace TM */ │ │ │ │ -147} /* anonymous namespace */ │ │ │ │ -148#endif │ │ │ │ +_1_2_9 typedef _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y _T_h_i_s; │ │ │ │ +130 │ │ │ │ +131 //--- iterators --- │ │ │ │ +132 │ │ │ │ +_1_3_9 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l_ _, │ │ │ │ +_&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___v_e_r_t_e_x___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___v_e_r_t_i_c_e_s_> _V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_4_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l │ │ │ │ +_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___h_a_l_f_e_d_g_e___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___h_a_l_f_e_d_g_e_s_> _H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_4_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l_ _, │ │ │ │ +_&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___e_d_g_e___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___e_d_g_e_s_> _E_d_g_e_I_t_e_r; │ │ │ │ +_1_4_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l_ _, │ │ │ │ +_&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___f_a_c_e___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___f_a_c_e_s_> _F_a_c_e_I_t_e_r; │ │ │ │ +143 │ │ │ │ +_1_4_4 typedef _V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_4_5 typedef _H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_4_6 typedef _E_d_g_e_I_t_e_r _C_o_n_s_t_E_d_g_e_I_t_e_r; │ │ │ │ +_1_4_7 typedef _F_a_c_e_I_t_e_r _C_o_n_s_t_F_a_c_e_I_t_e_r; │ │ │ │ 149 │ │ │ │ -_1_7_8template struct _M_e_s_h_C_a_s_t; │ │ │ │ -179 │ │ │ │ -180template │ │ │ │ -_1_8_1struct _M_e_s_h_C_a_s_t { │ │ │ │ -182 static LhsMeshT &cast(RhsMeshT &rhs) { │ │ │ │ -183 (void)sizeof(TM::ItemsEquality); │ │ │ │ -184 (void)sizeof(TM::TypeEquality); │ │ │ │ -185 return reinterpret_cast(rhs); │ │ │ │ -186 } │ │ │ │ -187}; │ │ │ │ -188 │ │ │ │ -189template │ │ │ │ -_1_9_0struct _M_e_s_h_C_a_s_t { │ │ │ │ -191 static const LhsMeshT &cast(const RhsMeshT &rhs) { │ │ │ │ -192 (void)sizeof(TM::ItemsEquality); │ │ │ │ -193 (void)sizeof(TM::TypeEquality); │ │ │ │ -194 return reinterpret_cast(rhs); │ │ │ │ -195 } │ │ │ │ -196}; │ │ │ │ -197 │ │ │ │ -198template │ │ │ │ -_1_9_9struct _M_e_s_h_C_a_s_t { │ │ │ │ -200 static LhsMeshT *cast(RhsMeshT *rhs) { │ │ │ │ -201 (void)sizeof(TM::ItemsEquality); │ │ │ │ -202 (void)sizeof(TM::TypeEquality); │ │ │ │ -203 return reinterpret_cast(rhs); │ │ │ │ -204 } │ │ │ │ -205}; │ │ │ │ -206 │ │ │ │ -207template │ │ │ │ -_2_0_8struct _M_e_s_h_C_a_s_t { │ │ │ │ -209 static const LhsMeshT *cast(const RhsMeshT *rhs) { │ │ │ │ -210 (void)sizeof(TM::ItemsEquality); │ │ │ │ -211 (void)sizeof(TM::TypeEquality); │ │ │ │ -212 return reinterpret_cast(rhs); │ │ │ │ -213 } │ │ │ │ -214}; │ │ │ │ +150 //--- circulators --- │ │ │ │ +151 │ │ │ │ +157 │ │ │ │ +158 /* │ │ │ │ +159 * Vertex-centered circulators │ │ │ │ +160 */ │ │ │ │ +161 │ │ │ │ +_1_6_2 struct _V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ +163 { │ │ │ │ +164 using _M_e_s_h = _T_h_i_s; │ │ │ │ +165 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +166 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +167 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return _mesh->to_vertex_handle(_heh);} │ │ │ │ +168 }; │ │ │ │ +169 │ │ │ │ +170 │ │ │ │ +_1_7_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s_> │ │ │ │ +_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_1_7_5 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ +176 │ │ │ │ +_1_8_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ +181 │ │ │ │ +182 │ │ │ │ +_1_8_3 struct _V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +184 { │ │ │ │ +185 using _M_e_s_h = _T_h_i_s; │ │ │ │ +186 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +187 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +188 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const /*_mesh*/, _T_h_i_s_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { return _heh;} │ │ │ │ +189 }; │ │ │ │ +190 │ │ │ │ +_1_9_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_1_9_5 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ +196 │ │ │ │ +_2_0_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +201 │ │ │ │ +_2_0_2 struct _V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +203 { │ │ │ │ +204 using _M_e_s_h = _T_h_i_s; │ │ │ │ +205 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +206 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +207 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return _mesh->_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh); } │ │ │ │ +208 }; │ │ │ │ +209 │ │ │ │ +_2_1_3 typedef _I_t_e_r_a_t_o_r_s_:_: │ │ │ │ +_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_2_1_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ 215 │ │ │ │ -216 │ │ │ │ -217// │ │ │ │ -============================================================================= │ │ │ │ -218} // namespace OpenMesh │ │ │ │ -219// │ │ │ │ -============================================================================= │ │ │ │ -220#endif // OPENMESH_MESH_ITEMS_HH defined │ │ │ │ -221// │ │ │ │ -============================================================================= │ │ │ │ -222 │ │ │ │ +_2_1_9 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +220 │ │ │ │ +221 │ │ │ │ +_2_2_2 struct _V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s │ │ │ │ +223 { │ │ │ │ +224 using _M_e_s_h = _T_h_i_s; │ │ │ │ +225 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +226 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +227 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->face_handle(_heh); } │ │ │ │ +228 }; │ │ │ │ +229 │ │ │ │ +_2_3_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s_> │ │ │ │ +_V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ +_2_3_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r; │ │ │ │ +235 │ │ │ │ +_2_3_9 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ +240 │ │ │ │ +241 │ │ │ │ +_2_4_2 struct _V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s │ │ │ │ +243 { │ │ │ │ +244 using _M_e_s_h = _T_h_i_s; │ │ │ │ +245 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +246 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +247 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->edge_handle(_heh); } │ │ │ │ +248 }; │ │ │ │ +249 │ │ │ │ +_2_5_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ +_2_5_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r; │ │ │ │ +_2_5_8 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +259 │ │ │ │ +260 │ │ │ │ +_2_6_1 struct _F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +262 { │ │ │ │ +263 using _M_e_s_h = _T_h_i_s; │ │ │ │ +264 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +265 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +266 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const /*_mesh*/, _T_h_i_s_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { return _heh; } │ │ │ │ +267 }; │ │ │ │ +268 │ │ │ │ +_2_7_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r; │ │ │ │ +_2_7_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r; │ │ │ │ +_2_7_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r; │ │ │ │ +278 │ │ │ │ +_2_7_9 typedef _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_2_8_0 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ +_2_8_1 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ +_2_8_2 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_2_8_3 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ +_2_8_4 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +_2_8_5 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_2_8_6 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ +_2_8_7 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +_2_8_8 typedef _V_e_r_t_e_x_F_a_c_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ +_2_8_9 typedef _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r; │ │ │ │ +_2_9_0 typedef _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ +_2_9_1 typedef _V_e_r_t_e_x_E_d_g_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ +_2_9_2 typedef _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r; │ │ │ │ +_2_9_3 typedef _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +294 │ │ │ │ +295 /* │ │ │ │ +296 * Face-centered circulators │ │ │ │ +297 */ │ │ │ │ +298 │ │ │ │ +_2_9_9 struct _F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ +300 { │ │ │ │ +301 using _M_e_s_h = _T_h_i_s; │ │ │ │ +302 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +303 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +304 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->to_vertex_handle(_heh); │ │ │ │ +} │ │ │ │ +305 }; │ │ │ │ +306 │ │ │ │ +_3_1_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s_> │ │ │ │ +_F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_3_1_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ +312 │ │ │ │ +_3_1_6 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ +317 │ │ │ │ +_3_2_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_3_2_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +323 │ │ │ │ +_3_2_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ +328 │ │ │ │ +329 │ │ │ │ +_3_3_0 struct _F_a_c_e_E_d_g_e_T_r_a_i_t_s │ │ │ │ +331 { │ │ │ │ +332 using _M_e_s_h = _T_h_i_s; │ │ │ │ +333 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +334 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +335 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->edge_handle(_heh); } │ │ │ │ +336 }; │ │ │ │ +337 │ │ │ │ +_3_4_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_E_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ +_3_4_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_E_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +343 │ │ │ │ +_3_4_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_E_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_F_a_c_e_E_d_g_e_C_W_I_t_e_r; │ │ │ │ +348 │ │ │ │ +349 │ │ │ │ +_3_5_0 struct _F_a_c_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ +351 { │ │ │ │ +352 using _M_e_s_h = _T_h_i_s; │ │ │ │ +353 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +354 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +355 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->face_handle(_mesh- │ │ │ │ +>_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh)); } │ │ │ │ +356 }; │ │ │ │ +357 │ │ │ │ +_3_6_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_F_a_c_e_T_r_a_i_t_s_> │ │ │ │ +_F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ +_3_6_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_F_a_c_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ +_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ +363 │ │ │ │ +_3_6_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_F_a_c_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ +_F_a_c_e_F_a_c_e_C_W_I_t_e_r; │ │ │ │ +368 │ │ │ │ +_3_6_9 typedef _F_a_c_e_V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_3_7_0 typedef _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ +_3_7_1 typedef _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ +_3_7_2 typedef _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_3_7_3 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ +_3_7_4 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +_3_7_5 typedef _F_a_c_e_E_d_g_e_I_t_e_r _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ +_3_7_6 typedef _F_a_c_e_E_d_g_e_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r; │ │ │ │ +_3_7_7 typedef _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ +_3_7_8 typedef _F_a_c_e_F_a_c_e_I_t_e_r _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ +_3_7_9 typedef _F_a_c_e_F_a_c_e_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r; │ │ │ │ +_3_8_0 typedef _F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ +381 │ │ │ │ +382 /* │ │ │ │ +383 * Edge-centered circulators │ │ │ │ +384 */ │ │ │ │ +385 │ │ │ │ +_3_8_6 struct _E_d_g_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ +387 { │ │ │ │ +388 using _M_e_s_h = _T_h_i_s; │ │ │ │ +389 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +390 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ +391 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->from_vertex_handle │ │ │ │ +(_heh); } │ │ │ │ +392 }; │ │ │ │ +393 │ │ │ │ +_3_9_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_E_d_g_e_V_e_r_t_e_x_T_r_a_i_t_s_> │ │ │ │ +_E_d_g_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +398 │ │ │ │ +_3_9_9 struct _E_d_g_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +400 { │ │ │ │ +401 using _M_e_s_h = _T_h_i_s; │ │ │ │ +402 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +403 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ +404 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const /* _mesh */, _T_h_i_s_:_: │ │ │ │ +_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { return _heh; } │ │ │ │ +405 }; │ │ │ │ +406 │ │ │ │ +_4_1_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_E_d_g_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ +_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +411 │ │ │ │ +_4_1_2 struct _E_d_g_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ +413 { │ │ │ │ +414 using _M_e_s_h = _T_h_i_s; │ │ │ │ +415 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ +416 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ +417 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return static_cast(_mesh)->face_handle(_heh); } │ │ │ │ +418 }; │ │ │ │ +419 │ │ │ │ +_4_2_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_E_d_g_e_F_a_c_e_T_r_a_i_t_s_> │ │ │ │ +_E_d_g_e_F_a_c_e_I_t_e_r; │ │ │ │ +424 │ │ │ │ +_4_2_5 typedef _E_d_g_e_V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ +_4_2_6 typedef _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ +_4_2_7 typedef _E_d_g_e_F_a_c_e_I_t_e_r _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r; │ │ │ │ +428 │ │ │ │ +429 /* │ │ │ │ +430 * Halfedge circulator │ │ │ │ +431 */ │ │ │ │ +_4_3_2 typedef _H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r; │ │ │ │ +_4_3_3 typedef _H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r; │ │ │ │ +_4_3_4 typedef _H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r; │ │ │ │ +435 │ │ │ │ +437 │ │ │ │ +438 // --- shortcuts │ │ │ │ +439 │ │ │ │ +_4_4_5 typedef _V_e_r_t_e_x_H_a_n_d_l_e _V_H_a_n_d_l_e; │ │ │ │ +_4_4_6 typedef _H_a_l_f_e_d_g_e_H_a_n_d_l_e _H_H_a_n_d_l_e; │ │ │ │ +_4_4_7 typedef _E_d_g_e_H_a_n_d_l_e _E_H_a_n_d_l_e; │ │ │ │ +_4_4_8 typedef _F_a_c_e_H_a_n_d_l_e _F_H_a_n_d_l_e; │ │ │ │ +449 │ │ │ │ +_4_5_0 typedef _V_e_r_t_e_x_I_t_e_r _V_I_t_e_r; │ │ │ │ +_4_5_1 typedef _H_a_l_f_e_d_g_e_I_t_e_r _H_I_t_e_r; │ │ │ │ +_4_5_2 typedef _E_d_g_e_I_t_e_r _E_I_t_e_r; │ │ │ │ +_4_5_3 typedef _F_a_c_e_I_t_e_r _F_I_t_e_r; │ │ │ │ +454 │ │ │ │ +_4_5_5 typedef _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r _C_V_I_t_e_r; │ │ │ │ +_4_5_6 typedef _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r _C_H_I_t_e_r; │ │ │ │ +_4_5_7 typedef _C_o_n_s_t_E_d_g_e_I_t_e_r _C_E_I_t_e_r; │ │ │ │ +_4_5_8 typedef _C_o_n_s_t_F_a_c_e_I_t_e_r _C_F_I_t_e_r; │ │ │ │ +459 │ │ │ │ +_4_6_0 typedef _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _V_V_I_t_e_r; │ │ │ │ +_4_6_1 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _V_V_C_W_I_t_e_r; │ │ │ │ +_4_6_2 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _V_V_C_C_W_I_t_e_r; │ │ │ │ +_4_6_3 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _V_O_H_I_t_e_r; │ │ │ │ +_4_6_4 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _V_O_H_C_W_I_t_e_r; │ │ │ │ +_4_6_5 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _V_O_H_C_C_W_I_t_e_r; │ │ │ │ +_4_6_6 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _V_I_H_I_t_e_r; │ │ │ │ +_4_6_7 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _V_I_H_I_C_W_t_e_r; │ │ │ │ +_4_6_8 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _V_I_H_I_C_C_W_t_e_r; │ │ │ │ +_4_6_9 typedef _V_e_r_t_e_x_E_d_g_e_I_t_e_r _V_E_I_t_e_r; │ │ │ │ +_4_7_0 typedef _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _V_E_C_W_I_t_e_r; │ │ │ │ +_4_7_1 typedef _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _V_E_C_C_W_I_t_e_r; │ │ │ │ +_4_7_2 typedef _V_e_r_t_e_x_F_a_c_e_I_t_e_r _V_F_I_t_e_r; │ │ │ │ +_4_7_3 typedef _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _V_F_C_W_I_t_e_r; │ │ │ │ +_4_7_4 typedef _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _V_F_C_C_W_I_t_e_r; │ │ │ │ +_4_7_5 typedef _F_a_c_e_V_e_r_t_e_x_I_t_e_r _F_V_I_t_e_r; │ │ │ │ +_4_7_6 typedef _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _F_V_C_W_I_t_e_r; │ │ │ │ +_4_7_7 typedef _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _F_V_C_C_W_I_t_e_r; │ │ │ │ +_4_7_8 typedef _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _F_H_I_t_e_r; │ │ │ │ +_4_7_9 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _F_H_C_W_I_t_e_r; │ │ │ │ +_4_8_0 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _F_H_C_W_W_I_t_e_r; │ │ │ │ +_4_8_1 typedef _F_a_c_e_E_d_g_e_I_t_e_r _F_E_I_t_e_r; │ │ │ │ +_4_8_2 typedef _F_a_c_e_E_d_g_e_C_W_I_t_e_r _F_E_C_W_I_t_e_r; │ │ │ │ +_4_8_3 typedef _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _F_E_C_W_W_I_t_e_r; │ │ │ │ +_4_8_4 typedef _F_a_c_e_F_a_c_e_I_t_e_r _F_F_I_t_e_r; │ │ │ │ +_4_8_5 typedef _E_d_g_e_V_e_r_t_e_x_I_t_e_r _E_V_I_t_e_r; │ │ │ │ +_4_8_6 typedef _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _E_H_I_t_e_r; │ │ │ │ +_4_8_7 typedef _E_d_g_e_F_a_c_e_I_t_e_r _E_F_I_t_e_r; │ │ │ │ +488 │ │ │ │ +_4_8_9 typedef _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _C_V_V_I_t_e_r; │ │ │ │ +_4_9_0 typedef _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _C_V_V_C_W_I_t_e_r; │ │ │ │ +_4_9_1 typedef _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _C_V_V_C_C_W_I_t_e_r; │ │ │ │ +_4_9_2 typedef _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _C_V_O_H_I_t_e_r; │ │ │ │ +_4_9_3 typedef _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_V_O_H_C_W_I_t_e_r; │ │ │ │ +_4_9_4 typedef _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_V_O_H_C_C_W_I_t_e_r; │ │ │ │ +_4_9_5 typedef _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _C_V_I_H_I_t_e_r; │ │ │ │ +_4_9_6 typedef _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_V_I_H_C_W_I_t_e_r; │ │ │ │ +_4_9_7 typedef _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_V_I_H_C_C_W_I_t_e_r; │ │ │ │ +_4_9_8 typedef _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r _C_V_E_I_t_e_r; │ │ │ │ +_4_9_9 typedef _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _C_V_E_C_W_I_t_e_r; │ │ │ │ +_5_0_0 typedef _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _C_V_E_C_C_W_I_t_e_r; │ │ │ │ +_5_0_1 typedef _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r _C_V_F_I_t_e_r; │ │ │ │ +_5_0_2 typedef _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _C_V_F_C_W_I_t_e_r; │ │ │ │ +_5_0_3 typedef _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _C_V_F_C_C_W_I_t_e_r; │ │ │ │ +_5_0_4 typedef _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r _C_F_V_I_t_e_r; │ │ │ │ +_5_0_5 typedef _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _C_F_V_C_W_I_t_e_r; │ │ │ │ +_5_0_6 typedef _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _C_F_V_C_C_W_I_t_e_r; │ │ │ │ +_5_0_7 typedef _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _C_F_H_I_t_e_r; │ │ │ │ +_5_0_8 typedef _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_F_H_C_W_I_t_e_r; │ │ │ │ +_5_0_9 typedef _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_F_H_C_C_W_I_t_e_r; │ │ │ │ +_5_1_0 typedef _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r _C_F_E_I_t_e_r; │ │ │ │ +_5_1_1 typedef _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r _C_F_E_C_W_I_t_e_r; │ │ │ │ +_5_1_2 typedef _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _C_F_E_C_C_W_I_t_e_r; │ │ │ │ +_5_1_3 typedef _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r _C_F_F_I_t_e_r; │ │ │ │ +_5_1_4 typedef _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r _C_F_F_C_W_I_t_e_r; │ │ │ │ +_5_1_5 typedef _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _C_F_F_C_C_W_I_t_e_r; │ │ │ │ +_5_1_6 typedef _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r _C_E_V_I_t_e_r; │ │ │ │ +_5_1_7 typedef _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _C_E_H_I_t_e_r; │ │ │ │ +_5_1_8 typedef _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r _C_E_F_I_t_e_r; │ │ │ │ +520 │ │ │ │ +521public: │ │ │ │ +522 │ │ │ │ +_5_2_3 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ +_5_2_4 virtual _~_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ +525 │ │ │ │ +_5_2_6 inline static bool _i_s___t_r_i_a_n_g_l_e_s() │ │ │ │ +527 { return false; } │ │ │ │ +528 │ │ │ │ +_5_3_1 inline void _a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _other) │ │ │ │ +532 { _A_r_r_a_y_K_e_r_n_e_l_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y(_other); } │ │ │ │ +533 │ │ │ │ +537 │ │ │ │ +539 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e add_vertex(); │ │ │ │ +540 │ │ │ │ +548 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(const std::vector& _vhandles); │ │ │ │ +549 │ │ │ │ +557 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(const std::vector& _vhandles); │ │ │ │ +558 │ │ │ │ +559 │ │ │ │ +569 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +_vh2); │ │ │ │ +570 │ │ │ │ +581 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +_vh2, _V_e_r_t_e_x_H_a_n_d_l_e _vh3); │ │ │ │ +582 │ │ │ │ +591 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(const _V_e_r_t_e_x_H_a_n_d_l_e* _vhandles, size_t _vhs_size); │ │ │ │ +592 │ │ │ │ +594 │ │ │ │ +596 │ │ │ │ +597 │ │ │ │ +602 bool is_collapse_ok(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _he); │ │ │ │ +603 │ │ │ │ +604 │ │ │ │ +610 void delete_vertex(_V_e_r_t_e_x_H_a_n_d_l_e _vh, bool _delete_isolated_vertices = │ │ │ │ +true); │ │ │ │ +611 │ │ │ │ +620 void delete_edge(_E_d_g_e_H_a_n_d_l_e _eh, bool _delete_isolated_vertices=true); │ │ │ │ +621 │ │ │ │ +632 void delete_face(_F_a_c_e_H_a_n_d_l_e _fh, bool _delete_isolated_vertices=true); │ │ │ │ +633 │ │ │ │ +634 │ │ │ │ +636 │ │ │ │ +640 │ │ │ │ +641 using ArrayKernel::next_halfedge_handle; │ │ │ │ +642 using ArrayKernel::prev_halfedge_handle; │ │ │ │ +643 using ArrayKernel::opposite_halfedge_handle; │ │ │ │ +644 using ArrayKernel::ccw_rotated_halfedge_handle; │ │ │ │ +645 using ArrayKernel::cw_rotated_halfedge_handle; │ │ │ │ +646 │ │ │ │ +647 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e next_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +const; │ │ │ │ +648 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e prev_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +const; │ │ │ │ +649 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e opposite_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) const; │ │ │ │ +650 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e ccw_rotated_halfedge_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) const; │ │ │ │ +651 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e cw_rotated_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) const; │ │ │ │ +652 │ │ │ │ +653 using ArrayKernel::s_halfedge_handle; │ │ │ │ +654 using ArrayKernel::s_edge_handle; │ │ │ │ +655 │ │ │ │ +656 static _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e s_halfedge_handle(_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _eh, unsigned │ │ │ │ +int _i = 0); │ │ │ │ +657 static _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e s_edge_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +658 │ │ │ │ +659 using ArrayKernel::halfedge_handle; │ │ │ │ +660 using ArrayKernel::edge_handle; │ │ │ │ +661 using ArrayKernel::face_handle; │ │ │ │ +662 │ │ │ │ +663 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _eh, unsigned │ │ │ │ +int _i = 0) const; │ │ │ │ +664 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +665 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +666 inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e edge_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +667 inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e face_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +668 │ │ │ │ +670 inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e opposite_face_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +671 │ │ │ │ +673 │ │ │ │ +677 │ │ │ │ +679 VertexIter vertices_begin(); │ │ │ │ +681 ConstVertexIter vertices_begin() const; │ │ │ │ +683 VertexIter vertices_end(); │ │ │ │ +685 ConstVertexIter vertices_end() const; │ │ │ │ +686 │ │ │ │ +688 HalfedgeIter halfedges_begin(); │ │ │ │ +690 ConstHalfedgeIter halfedges_begin() const; │ │ │ │ +692 HalfedgeIter halfedges_end(); │ │ │ │ +694 ConstHalfedgeIter halfedges_end() const; │ │ │ │ +695 │ │ │ │ +697 EdgeIter edges_begin(); │ │ │ │ +699 ConstEdgeIter edges_begin() const; │ │ │ │ +701 EdgeIter edges_end(); │ │ │ │ +703 ConstEdgeIter edges_end() const; │ │ │ │ +704 │ │ │ │ +706 FaceIter faces_begin(); │ │ │ │ +708 ConstFaceIter faces_begin() const; │ │ │ │ +710 FaceIter faces_end(); │ │ │ │ +712 ConstFaceIter faces_end() const; │ │ │ │ +714 │ │ │ │ +715 │ │ │ │ +719 │ │ │ │ +721 VertexIter vertices_sbegin(); │ │ │ │ +723 ConstVertexIter vertices_sbegin() const; │ │ │ │ +724 │ │ │ │ +726 HalfedgeIter halfedges_sbegin(); │ │ │ │ +728 ConstHalfedgeIter halfedges_sbegin() const; │ │ │ │ +729 │ │ │ │ +731 EdgeIter edges_sbegin(); │ │ │ │ +733 ConstEdgeIter edges_sbegin() const; │ │ │ │ +734 │ │ │ │ +736 FaceIter faces_sbegin(); │ │ │ │ +738 ConstFaceIter faces_sbegin() const; │ │ │ │ +739 │ │ │ │ +741 │ │ │ │ +742 //--- circulators --- │ │ │ │ +743 │ │ │ │ +747 │ │ │ │ +749 VertexVertexIter vv_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +751 VertexVertexCWIter vv_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +753 VertexVertexCCWIter vv_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +755 VertexIHalfedgeIter vih_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +757 VertexIHalfedgeCWIter vih_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +759 VertexIHalfedgeCCWIter vih_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +761 VertexOHalfedgeIter voh_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +763 VertexOHalfedgeCWIter voh_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +765 VertexOHalfedgeCCWIter voh_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +767 VertexEdgeIter ve_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +769 VertexEdgeCWIter ve_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +771 VertexEdgeCCWIter ve_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +773 VertexFaceIter vf_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +775 VertexFaceCWIter vf_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +777 VertexFaceCCWIter vf_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +778 │ │ │ │ +780 ConstVertexVertexIter cvv_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +782 ConstVertexVertexCWIter cvv_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +784 ConstVertexVertexCCWIter cvv_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +786 ConstVertexIHalfedgeIter cvih_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +788 ConstVertexIHalfedgeCWIter cvih_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +790 ConstVertexIHalfedgeCCWIter cvih_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +792 ConstVertexOHalfedgeIter cvoh_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +794 ConstVertexOHalfedgeCWIter cvoh_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +796 ConstVertexOHalfedgeCCWIter cvoh_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +798 ConstVertexEdgeIter cve_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +800 ConstVertexEdgeCWIter cve_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +802 ConstVertexEdgeCCWIter cve_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +804 ConstVertexFaceIter cvf_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +806 ConstVertexFaceCWIter cvf_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +808 ConstVertexFaceCCWIter cvf_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +809 │ │ │ │ +811 FaceVertexIter fv_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +813 FaceVertexCWIter fv_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +815 FaceVertexCCWIter fv_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +817 FaceHalfedgeIter fh_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +819 FaceHalfedgeCWIter fh_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +821 FaceHalfedgeCCWIter fh_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +823 FaceEdgeIter fe_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +825 FaceEdgeCWIter fe_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +827 FaceEdgeCCWIter fe_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +829 FaceFaceIter ff_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +831 FaceFaceCWIter ff_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +833 FaceFaceCCWIter ff_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +834 │ │ │ │ +836 ConstFaceVertexIter cfv_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +838 ConstFaceVertexCWIter cfv_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +840 ConstFaceVertexCCWIter cfv_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +842 ConstFaceHalfedgeIter cfh_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +844 ConstFaceHalfedgeCWIter cfh_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +846 ConstFaceHalfedgeCCWIter cfh_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +848 ConstFaceEdgeIter cfe_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +850 ConstFaceEdgeCWIter cfe_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +852 ConstFaceEdgeCCWIter cfe_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +854 ConstFaceFaceIter cff_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +856 ConstFaceFaceCWIter cff_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +858 ConstFaceFaceCCWIter cff_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +859 │ │ │ │ +861 EdgeVertexIter ev_iter(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +863 EdgeHalfedgeIter eh_iter(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +865 EdgeFaceIter ef_iter(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +866 │ │ │ │ +868 ConstEdgeVertexIter cev_iter(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +870 ConstEdgeHalfedgeIter ceh_iter(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +872 ConstEdgeFaceIter cef_iter(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +873 │ │ │ │ +874 // 'begin' circulators │ │ │ │ +875 │ │ │ │ +877 VertexVertexIter vv_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +879 VertexVertexCWIter vv_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +881 VertexVertexCCWIter vv_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +883 VertexIHalfedgeIter vih_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +885 VertexIHalfedgeCWIter vih_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +887 VertexIHalfedgeCCWIter vih_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +889 VertexOHalfedgeIter voh_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +891 VertexOHalfedgeCWIter voh_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +893 VertexOHalfedgeCCWIter voh_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +895 VertexEdgeIter ve_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +897 VertexEdgeCWIter ve_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +899 VertexEdgeCCWIter ve_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +901 VertexFaceIter vf_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +903 VertexFaceCWIter vf_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +905 VertexFaceCCWIter vf_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +906 │ │ │ │ +907 │ │ │ │ +909 ConstVertexVertexIter cvv_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +911 ConstVertexVertexCWIter cvv_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +913 ConstVertexVertexCCWIter cvv_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +915 ConstVertexIHalfedgeIter cvih_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +917 ConstVertexIHalfedgeCWIter cvih_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +919 ConstVertexIHalfedgeCCWIter cvih_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +921 ConstVertexOHalfedgeIter cvoh_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +923 ConstVertexOHalfedgeCWIter cvoh_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +925 ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +927 ConstVertexEdgeIter cve_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +929 ConstVertexEdgeCWIter cve_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +931 ConstVertexEdgeCCWIter cve_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +933 ConstVertexFaceIter cvf_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +935 ConstVertexFaceCWIter cvf_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +937 ConstVertexFaceCCWIter cvf_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +938 │ │ │ │ +940 FaceVertexIter fv_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +942 FaceVertexCWIter fv_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +944 FaceVertexCCWIter fv_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +946 FaceHalfedgeIter fh_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +948 FaceHalfedgeCWIter fh_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +950 FaceHalfedgeCCWIter fh_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +952 FaceEdgeIter fe_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +954 FaceEdgeCWIter fe_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +956 FaceEdgeCCWIter fe_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +958 FaceFaceIter ff_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +960 FaceFaceCWIter ff_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +962 FaceFaceCCWIter ff_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +964 HalfedgeLoopIter hl_begin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +966 HalfedgeLoopCWIter hl_cwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +968 HalfedgeLoopCCWIter hl_ccwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +969 │ │ │ │ +971 ConstFaceVertexIter cfv_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +973 ConstFaceVertexCWIter cfv_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +975 ConstFaceVertexCCWIter cfv_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +977 ConstFaceHalfedgeIter cfh_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +979 ConstFaceHalfedgeCWIter cfh_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +981 ConstFaceHalfedgeCCWIter cfh_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +983 ConstFaceEdgeIter cfe_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +985 ConstFaceEdgeCWIter cfe_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +987 ConstFaceEdgeCCWIter cfe_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +989 ConstFaceFaceIter cff_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +991 ConstFaceFaceCWIter cff_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +993 ConstFaceFaceCCWIter cff_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +995 ConstHalfedgeLoopIter chl_begin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +997 ConstHalfedgeLoopCWIter chl_cwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +999 ConstHalfedgeLoopCCWIter chl_ccwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1000 │ │ │ │ +1002 EdgeVertexIter ev_begin(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1004 EdgeHalfedgeIter eh_begin(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1006 EdgeFaceIter ef_begin(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1007 │ │ │ │ +1009 ConstEdgeVertexIter cev_begin(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1011 ConstEdgeHalfedgeIter ceh_begin(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1013 ConstEdgeFaceIter cef_begin(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1014 │ │ │ │ +1015 // 'end' circulators │ │ │ │ +1016 │ │ │ │ +1018 VertexVertexIter vv_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1020 VertexVertexCWIter vv_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1022 VertexVertexCCWIter vv_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1024 VertexIHalfedgeIter vih_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1026 VertexIHalfedgeCWIter vih_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1028 VertexIHalfedgeCCWIter vih_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1030 VertexOHalfedgeIter voh_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1032 VertexOHalfedgeCWIter voh_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1034 VertexOHalfedgeCCWIter voh_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1036 VertexEdgeIter ve_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1038 VertexEdgeCWIter ve_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1040 VertexEdgeCCWIter ve_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1042 VertexFaceIter vf_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1044 VertexFaceCWIter vf_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1046 VertexFaceCCWIter vf_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1047 │ │ │ │ +1049 ConstVertexVertexIter cvv_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1051 ConstVertexVertexCWIter cvv_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1053 ConstVertexVertexCCWIter cvv_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1055 ConstVertexIHalfedgeIter cvih_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1057 ConstVertexIHalfedgeCWIter cvih_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1059 ConstVertexIHalfedgeCCWIter cvih_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1061 ConstVertexOHalfedgeIter cvoh_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1063 ConstVertexOHalfedgeCWIter cvoh_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1065 ConstVertexOHalfedgeCCWIter cvoh_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1067 ConstVertexEdgeIter cve_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1069 ConstVertexEdgeCWIter cve_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1071 ConstVertexEdgeCCWIter cve_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1073 ConstVertexFaceIter cvf_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1075 ConstVertexFaceCWIter cvf_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1077 ConstVertexFaceCCWIter cvf_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1078 │ │ │ │ +1080 FaceVertexIter fv_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1082 FaceVertexCWIter fv_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1084 FaceVertexCCWIter fv_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1086 FaceHalfedgeIter fh_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1088 FaceHalfedgeCWIter fh_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1090 FaceHalfedgeCCWIter fh_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1092 FaceEdgeIter fe_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1094 FaceEdgeCWIter fe_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1096 FaceEdgeCCWIter fe_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1098 FaceFaceIter ff_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1100 FaceFaceCWIter ff_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1102 FaceFaceCCWIter ff_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1104 HalfedgeLoopIter hl_end(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +1106 HalfedgeLoopCWIter hl_cwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +1108 HalfedgeLoopCCWIter hl_ccwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +1109 │ │ │ │ +1111 ConstFaceVertexIter cfv_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1113 ConstFaceVertexCWIter cfv_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1115 ConstFaceVertexCCWIter cfv_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1117 ConstFaceHalfedgeIter cfh_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1119 ConstFaceHalfedgeCWIter cfh_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1121 ConstFaceHalfedgeCCWIter cfh_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1123 ConstFaceEdgeIter cfe_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1125 ConstFaceEdgeCWIter cfe_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1127 ConstFaceEdgeCCWIter cfe_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1129 ConstFaceFaceIter cff_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1131 ConstFaceFaceCWIter cff_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1133 ConstFaceFaceCCWIter cff_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1135 ConstHalfedgeLoopIter chl_end(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1137 ConstHalfedgeLoopCWIter chl_cwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1139 ConstHalfedgeLoopCCWIter chl_ccwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1140 │ │ │ │ +1142 EdgeVertexIter ev_end(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1144 EdgeHalfedgeIter eh_end(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1146 EdgeFaceIter ef_end(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1147 │ │ │ │ +1149 ConstEdgeVertexIter cev_end(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1151 ConstEdgeHalfedgeIter ceh_end(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1153 ConstEdgeFaceIter cef_end(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1154 │ │ │ │ +1156 │ │ │ │ +1159 │ │ │ │ +1160 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1161 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1162 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r, │ │ │ │ +1163 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n, │ │ │ │ +_1_1_6_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d>> _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ +1165 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1166 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1167 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r, │ │ │ │ +1168 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n, │ │ │ │ +_1_1_6_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d>> _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1170 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1171 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1172 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r, │ │ │ │ +1173 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n, │ │ │ │ +_1_1_7_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d>> _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ +1175 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1176 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1177 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r, │ │ │ │ +1178 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n, │ │ │ │ +_1_1_7_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d>> _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1180 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1181 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1182 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r, │ │ │ │ +1183 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n, │ │ │ │ +_1_1_8_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d>> _C_o_n_s_t_E_d_g_e_R_a_n_g_e; │ │ │ │ +1185 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1186 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1187 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r, │ │ │ │ +1188 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n, │ │ │ │ +_1_1_8_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d>> _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1190 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1191 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1192 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r, │ │ │ │ +1193 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n, │ │ │ │ +_1_1_9_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d>> _C_o_n_s_t_F_a_c_e_R_a_n_g_e; │ │ │ │ +1195 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ +1196 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ +1197 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r, │ │ │ │ +1198 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n, │ │ │ │ +_1_1_9_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d>> _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1200 │ │ │ │ +1201 │ │ │ │ +1202 template │ │ │ │ +_1_2_0_3 struct _E_l_e_m_e_n_t_R_a_n_g_e; │ │ │ │ +1204 │ │ │ │ +1209 _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g vertices() const; │ │ │ │ +1210 │ │ │ │ +1215 _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e all_vertices() const; │ │ │ │ +1216 │ │ │ │ +1221 _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g halfedges() const; │ │ │ │ +1222 │ │ │ │ +1227 _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e all_halfedges() const; │ │ │ │ +1228 │ │ │ │ +1233 _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g edges() const; │ │ │ │ +1234 │ │ │ │ +1239 _C_o_n_s_t_E_d_g_e_R_a_n_g_e all_edges() const; │ │ │ │ +1240 │ │ │ │ +1245 _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g faces() const; │ │ │ │ +1246 │ │ │ │ +1251 _C_o_n_s_t_F_a_c_e_R_a_n_g_e all_faces() const; │ │ │ │ +1252 │ │ │ │ +1257 template │ │ │ │ +_1_2_5_8 typename _E_l_e_m_e_n_t_R_a_n_g_e_<_H_a_n_d_l_e_T_y_p_e_>_:_:_R_a_n_g_e_S_k_i_p_p_i_n_g _e_l_e_m_e_n_t_s() const; │ │ │ │ +1259 │ │ │ │ +1264 template │ │ │ │ +_1_2_6_5 typename _E_l_e_m_e_n_t_R_a_n_g_e_<_H_a_n_d_l_e_T_y_p_e_>_:_:_R_a_n_g_e _a_l_l___e_l_e_m_e_n_t_s() const; │ │ │ │ +1266 │ │ │ │ +1267 │ │ │ │ +_1_2_6_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ +_1_2_6_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ +_1_2_7_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ +_1_2_7_1 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___b_e_g_i_n │ │ │ │ +_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e; │ │ │ │ +_1_2_7_2 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___b_e_g_i_n │ │ │ │ +_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e; │ │ │ │ +_1_2_7_3 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___b_e_g_i_n │ │ │ │ +_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ +_1_2_7_4 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ +_1_2_7_5 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___b_e_g_i_n_ _, │ │ │ │ +_&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e; │ │ │ │ +_1_2_7_6 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___b_e_g_i_n_ _, │ │ │ │ +_&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e; │ │ │ │ +_1_2_7_7 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___b_e_g_i_n │ │ │ │ +_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___e_n_d_ _>> _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ +_1_2_7_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_e_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___e_n_d_ _>> _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ +_1_2_7_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___b_e_g_i_n_ _, │ │ │ │ +_&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___e_n_d_ _>> _C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e; │ │ │ │ +_1_2_8_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_h_l___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___e_n_d_ _>> _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e; │ │ │ │ +1281 │ │ │ │ +_1_2_8_2 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_3 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_4 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_5 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_e___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_6 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_f___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_7 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_v___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_8_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_b_e_g_i_n │ │ │ │ +_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_b_e_g_i_n │ │ │ │ +_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_1 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_h_l___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_w_e_n_d_ _>> _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e; │ │ │ │ +1292 │ │ │ │ +_1_2_9_3 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_4 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r_,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_5 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r_,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_6 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_e___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_7 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_f___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_v___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e; │ │ │ │ +_1_2_9_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_3_0_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_e___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_3_0_1 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_f___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e; │ │ │ │ +_1_3_0_2 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ +_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_h_l___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_c_w_e_n_d_ _>> _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e; │ │ │ │ +1303 │ │ │ │ +1308 _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e vv_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1309 │ │ │ │ +1314 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e vih_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1315 │ │ │ │ +1321 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e vih_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1322 │ │ │ │ +1327 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e voh_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1328 │ │ │ │ +1334 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e voh_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1335 │ │ │ │ +1340 _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e ve_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const ; │ │ │ │ +1341 │ │ │ │ +1346 _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e vf_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1347 │ │ │ │ +1352 _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e fv_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1353 │ │ │ │ +1358 _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e fh_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1359 │ │ │ │ +1364 _C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e fe_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1365 │ │ │ │ +1370 _C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e ff_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1371 │ │ │ │ +1376 _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e ev_range(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1377 │ │ │ │ +1382 _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e eh_range(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1383 │ │ │ │ +1389 _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e eh_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1390 │ │ │ │ +1395 _C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e ef_range(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1396 │ │ │ │ +1401 _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e hl_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1402 │ │ │ │ +1403 │ │ │ │ +1408 _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e vv_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1409 │ │ │ │ +1414 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e vih_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1415 │ │ │ │ +1421 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e vih_cw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1422 │ │ │ │ +1427 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e voh_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1428 │ │ │ │ +1434 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e voh_cw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1435 │ │ │ │ +1440 _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e ve_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1441 │ │ │ │ +1446 _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e vf_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1447 │ │ │ │ +1452 _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e fv_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1453 │ │ │ │ +1458 _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e fh_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1459 │ │ │ │ +1464 _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e fe_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1465 │ │ │ │ +1470 _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e ff_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1471 │ │ │ │ +1476 _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e hl_cw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1477 │ │ │ │ +1478 │ │ │ │ +1483 _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e vv_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1484 │ │ │ │ +1489 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e vih_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1490 │ │ │ │ +1496 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e vih_ccw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1497 │ │ │ │ +1502 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e voh_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1503 │ │ │ │ +1509 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e voh_ccw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1510 │ │ │ │ +1515 _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e ve_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const ; │ │ │ │ +1516 │ │ │ │ +1521 _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e vf_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1522 │ │ │ │ +1527 _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e fv_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1528 │ │ │ │ +1533 _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e fh_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1534 │ │ │ │ +1539 _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e fe_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1540 │ │ │ │ +1545 _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e ff_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1546 │ │ │ │ +1547 │ │ │ │ +1552 _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e hl_ccw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ +1553 │ │ │ │ +1555 │ │ │ │ +1556 // │ │ │ │ +=========================================================================== │ │ │ │ +1559 // │ │ │ │ +=========================================================================== │ │ │ │ +1560 │ │ │ │ +_1_5_6_8 bool _i_s___b_o_u_n_d_a_r_y(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +1569 { return _A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y(_heh); } │ │ │ │ +1570 │ │ │ │ +_1_5_7_9 bool _i_s___b_o_u_n_d_a_r_y(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +1580 { │ │ │ │ +1581 return (is_boundary(halfedge_handle(_eh, 0)) || │ │ │ │ +1582 is_boundary(halfedge_handle(_eh, 1))); │ │ │ │ +1583 } │ │ │ │ +1584 │ │ │ │ +_1_5_9_6 bool _i_s___b_o_u_n_d_a_r_y(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +1597 { │ │ │ │ +1598 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh(halfedge_handle(_vh)); │ │ │ │ +1599 return (!(heh.is_valid() && face_handle(heh).is_valid())); │ │ │ │ +1600 } │ │ │ │ +1601 │ │ │ │ +1611 bool is_boundary(_F_a_c_e_H_a_n_d_l_e _fh, bool _check_vertex=false) const; │ │ │ │ +1612 │ │ │ │ +1623 bool is_manifold(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1624 │ │ │ │ +1627 // --- misc --- │ │ │ │ +1628 │ │ │ │ +1632 void adjust_outgoing_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1633 │ │ │ │ +1635 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e find_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _start_vh, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +_end_vh) const; │ │ │ │ +1637 uint valence(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +1639 uint valence(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1640 │ │ │ │ +1641 // --- connectivity operattions │ │ │ │ +1642 │ │ │ │ +1657 void collapse(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ +1662 bool is_simple_link(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ +1667 bool is_simply_connected(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +1680 _F_a_c_e_H_a_n_d_l_e remove_edge(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1684 void reinsert_edge(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ +1694 _H_a_l_f_e_d_g_e_H_a_n_d_l_e insert_edge(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _prev_heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_next_heh); │ │ │ │ +1695 │ │ │ │ +1708 void split(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1709 │ │ │ │ +1723 void split_copy(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1724 │ │ │ │ +1738 void triangulate(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ +1739 │ │ │ │ +1742 void triangulate(); │ │ │ │ +1743 │ │ │ │ +1754 void split_edge(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1755 │ │ │ │ +1767 void split_edge_copy(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ +1768 │ │ │ │ +1769 │ │ │ │ +_1_7_7_6 const Vertex& _d_e_r_e_f(_V_e_r_t_e_x_H_a_n_d_l_e _h) const { return vertex(_h); } │ │ │ │ +_1_7_7_7 Vertex& _d_e_r_e_f(_V_e_r_t_e_x_H_a_n_d_l_e _h) { return vertex(_h); } │ │ │ │ +_1_7_7_8 const Halfedge& _d_e_r_e_f(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _h) const { return halfedge(_h); } │ │ │ │ +_1_7_7_9 Halfedge& _d_e_r_e_f(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _h) { return halfedge(_h); } │ │ │ │ +_1_7_8_0 const Edge& _d_e_r_e_f(_E_d_g_e_H_a_n_d_l_e _h) const { return edge(_h); } │ │ │ │ +_1_7_8_1 Edge& _d_e_r_e_f(_E_d_g_e_H_a_n_d_l_e _h) { return edge(_h); } │ │ │ │ +_1_7_8_2 const Face& _d_e_r_e_f(_F_a_c_e_H_a_n_d_l_e _h) const { return face(_h); } │ │ │ │ +_1_7_8_3 Face& _d_e_r_e_f(_F_a_c_e_H_a_n_d_l_e _h) { return face(_h); } │ │ │ │ +1785 │ │ │ │ +1786protected: │ │ │ │ +1788 void collapse_edge(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh); │ │ │ │ +1790 void collapse_loop(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh); │ │ │ │ +1791 │ │ │ │ +1792 │ │ │ │ +1793 │ │ │ │ +1794private: // Working storage for add_face() │ │ │ │ +1795 struct AddFaceEdgeInfo │ │ │ │ +1796 { │ │ │ │ +1797 _H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle; │ │ │ │ +1798 bool is_new; │ │ │ │ +1799 bool needs_adjust; │ │ │ │ +1800 }; │ │ │ │ +1801 std::vector edgeData_; // │ │ │ │ +1802 std::vector > next_cache_; / │ │ │ │ +/ cache for set_next_halfedge and vertex' set_halfedge │ │ │ │ +1803 │ │ │ │ +1804}; │ │ │ │ +1805 │ │ │ │ +1806template <> │ │ │ │ +_1_8_0_7struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_V_e_r_t_e_x_H_a_n_d_l_e> │ │ │ │ +1808{ │ │ │ │ +1809 using _R_a_n_g_e = _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ +1810 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1811}; │ │ │ │ +1812 │ │ │ │ +1813template <> │ │ │ │ +_1_8_1_4struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_H_a_l_f_e_d_g_e_H_a_n_d_l_e> │ │ │ │ +1815{ │ │ │ │ +1816 using _R_a_n_g_e = _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ +1817 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1818}; │ │ │ │ +1819 │ │ │ │ +1820template <> │ │ │ │ +_1_8_2_1struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_E_d_g_e_H_a_n_d_l_e> │ │ │ │ +1822{ │ │ │ │ +1823 using _R_a_n_g_e = _C_o_n_s_t_E_d_g_e_R_a_n_g_e; │ │ │ │ +1824 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1825}; │ │ │ │ +1826 │ │ │ │ +1827template <> │ │ │ │ +_1_8_2_8struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_F_a_c_e_H_a_n_d_l_e> │ │ │ │ +1829{ │ │ │ │ +1830 using _R_a_n_g_e = _C_o_n_s_t_F_a_c_e_R_a_n_g_e; │ │ │ │ +1831 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ +1832}; │ │ │ │ +1833 │ │ │ │ +1834}//namespace OpenMesh │ │ │ │ +1835 │ │ │ │ +1836#define OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ +1837#include │ │ │ │ +1838#include │ │ │ │ +1839#undef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ +1840 │ │ │ │ +1841#endif//OPENMESH_POLYCONNECTIVITY_HH │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ -Definition of the mesh entities (items). │ │ │ │ -DDeeffiinniittiioonn FinalMeshItemsT.hh:68 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T_:_:_I_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn FinalMeshItemsT.hh:120 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_M_e_s_h_C_a_s_t │ │ │ │ -Cast a mesh with different but identical traits into each other. │ │ │ │ -DDeeffiinniittiioonn FinalMeshItemsT.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l │ │ │ │ +Mesh kernel using arrays for mesh item storage. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:88 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ +Is halfedge _heh a boundary halfedge (is its face handle invalid) ? │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:400 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +void assign_connectivity(const ArrayKernel &_other) │ │ │ │ +ArrayKernel uses the default copy constructor and assignment operator, which │ │ │ │ +means that the connectiv... │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.cc:71 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ +Generic class for iterator ranges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:305 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:483 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Handle for a vertex entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ Handle for a halfedge entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ Handle for a edge entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ Handle for a face entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -T::value_type value_type │ │ │ │ -Type of the scalar value. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:82 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_n_t_i_t_y_R_a_n_g_e │ │ │ │ +Generic class for vertex/halfedge/edge/face ranges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_R_a_n_g_e_T_r_a_i_t_T │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +Connectivity Class for polygonal meshes. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +const Halfedge & deref(HalfedgeHandle _h) const │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1778 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_V_C_W_I_t_e_r │ │ │ │ +VertexVertexCWIter VVCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:461 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_V_I_t_e_r │ │ │ │ +ConstVertexVertexIter CVVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:489 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1268 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d │ │ │ │ +EdgeIter edges_end() │ │ │ │ +End iterator for edges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:338 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, │ │ │ │ +FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity:: │ │ │ │ +cfv_end > > ConstFaceVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1273 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1288 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ +EdgeIter ConstEdgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:146 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_I_t_e_r │ │ │ │ +EdgeIter EIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:452 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_V_I_t_e_r │ │ │ │ +VertexVertexIter VVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:460 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter │ │ │ │ +Enumerates incident edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:258 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_V_C_C_W_I_t_e_r │ │ │ │ +VertexVertexCCWIter VVCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:462 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_H_C_C_W_I_t_e_r │ │ │ │ +ConstVertexIHalfedgeCCWIter CVIHCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:497 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r │ │ │ │ +HalfedgeLoopCWIter ConstHalfedgeLoopCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:433 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, │ │ │ │ +FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity:: │ │ │ │ +cff_cwend > > ConstFaceFaceCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1290 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +Edge & deref(EdgeHandle _h) │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1781 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d │ │ │ │ +HalfedgeIter halfedges_end() │ │ │ │ +End iterator for halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:326 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_H_C_C_W_I_t_e_r │ │ │ │ +ConstFaceHalfedgeCCWIter CFHCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:509 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_H_a_n_d_l_e │ │ │ │ +VertexHandle VHandle │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:445 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_V_C_C_W_I_t_e_r │ │ │ │ +ConstFaceVertexCCWIter CFVCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:506 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_T_h_i_s │ │ │ │ +PolyConnectivity This │ │ │ │ +Invalid handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:129 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:140 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1299 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_F_C_C_W_I_t_e_r │ │ │ │ +ConstVertexFaceCCWIter CVFCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:503 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1293 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +VertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:285 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_F_C_C_W_I_t_e_r │ │ │ │ +VertexFaceCCWIter VFCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:474 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +FaceFaceIter ConstFaceFaceIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:378 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_E_C_W_I_t_e_r │ │ │ │ +FaceEdgeCWIter FECWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:482 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:180 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n │ │ │ │ +VertexIter vertices_sbegin() │ │ │ │ +Begin iterator for vertices. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:357 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n │ │ │ │ +HalfedgeIter halfedges_sbegin() │ │ │ │ +Begin iterator for halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:363 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_V_C_C_W_I_t_e_r │ │ │ │ +FaceVertexCCWIter FVCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:477 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_t_e_r │ │ │ │ +ConstVertexIter CVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:455 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_H_I_t_e_r │ │ │ │ +ConstHalfedgeIter CHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:456 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter │ │ │ │ +Enumerate incident vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:316 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n │ │ │ │ +HalfedgeIter halfedges_begin() │ │ │ │ +Begin iterator for halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:320 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +static const HalfedgeHandle InvalidHalfedgeHandle │ │ │ │ +Invalid handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:57 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r │ │ │ │ +FaceFaceCWIter ConstFaceFaceCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:379 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:374 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n │ │ │ │ +EdgeIter edges_sbegin() │ │ │ │ +Begin iterator for edges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:369 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1282 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1295 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > │ │ │ │ +> ConstEdgeRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1189 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n │ │ │ │ +EdgeIter edges_begin() │ │ │ │ +Begin iterator for edges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:332 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_E_C_C_W_I_t_e_r │ │ │ │ +ConstFaceEdgeCCWIter CFECCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:512 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_I_t_e_r │ │ │ │ +ConstEdgeIter CEIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:457 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1287 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___e_l_e_m_e_n_t_s │ │ │ │ +ElementRange< HandleType >::Range all_elements() const │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_V_I_t_e_r │ │ │ │ +ConstFaceVertexIter CFVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:504 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +VertexVertexCCWIter ConstVertexVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:281 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1269 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_O_H_I_t_e_r │ │ │ │ +ConstVertexOHalfedgeIter CVOHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:492 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > │ │ │ │ +ConstFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1194 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, │ │ │ │ +FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity:: │ │ │ │ +cff_ccwend > > ConstFaceFaceCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1301 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1283 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > │ │ │ │ +VertexIHalfedgeIter │ │ │ │ +Enumerates incoming half edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:213 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity:: │ │ │ │ +vertices_end > > ConstVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1164 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +FaceFaceCCWIter ConstFaceFaceCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:380 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_E_I_t_e_r │ │ │ │ +ConstFaceEdgeIter CFEIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:510 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +PolyConnectivity() │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:523 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:283 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r │ │ │ │ +FaceEdgeCWIter ConstFaceEdgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:376 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_H_C_W_I_t_e_r │ │ │ │ +ConstVertexIHalfedgeCWIter CVIHCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:496 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_H_I_t_e_r │ │ │ │ +ConstFaceHalfedgeIter CFHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:507 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_V_C_W_I_t_e_r │ │ │ │ +ConstFaceVertexCWIter CFVCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:505 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_F_I_t_e_r │ │ │ │ +VertexFaceIter VFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:472 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1284 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r │ │ │ │ +HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:434 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_O_H_C_C_W_I_t_e_r │ │ │ │ +ConstVertexOHalfedgeCCWIter CVOHCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:494 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_I_t_e_r │ │ │ │ +HalfedgeIter HIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:451 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +VertexEdgeIter ConstVertexEdgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:291 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter │ │ │ │ +Enumerate incident half edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:321 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, │ │ │ │ +FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity:: │ │ │ │ +cfe_end > > ConstFaceEdgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1275 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > │ │ │ │ +VertexOHalfedgeIter │ │ │ │ +Enumerates outgoing half edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:194 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r │ │ │ │ +HalfedgeLoopIter ConstHalfedgeLoopIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:432 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_H_a_n_d_l_e │ │ │ │ +HalfedgeHandle HHandle │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:446 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___t_r_i_a_n_g_l_e_s │ │ │ │ +static bool is_triangles() │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:526 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_F_C_W_I_t_e_r │ │ │ │ +ConstFaceFaceCWIter CFFCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:514 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1280 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_H_I_t_e_r │ │ │ │ +VertexIHalfedgeIter VIHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:466 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +EdgeVertexIter ConstEdgeVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:425 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +VertexFaceIter ConstVertexFaceIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:288 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_t_e_r │ │ │ │ +VertexIter VIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:450 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity:: │ │ │ │ +cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1285 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity:: │ │ │ │ +cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1296 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ +VertexIter ConstVertexIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:144 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter │ │ │ │ +Enumerates incident edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:253 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +FaceVertexIter ConstFaceVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:369 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, │ │ │ │ +FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity:: │ │ │ │ +cfe_cwend > > ConstFaceEdgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1289 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:287 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_E_C_W_I_t_e_r │ │ │ │ +ConstVertexEdgeCWIter CVECWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:499 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r │ │ │ │ +VertexFaceCWIter ConstVertexFaceCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:289 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, │ │ │ │ +VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity:: │ │ │ │ +cve_end > > ConstVertexEdgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1271 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_V_I_t_e_r │ │ │ │ +ConstEdgeVertexIter CEVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:516 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r │ │ │ │ +EdgeFaceIter ConstEdgeFaceIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:427 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_E_C_W_W_I_t_e_r │ │ │ │ +FaceEdgeCCWIter FECWWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:483 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter │ │ │ │ +Enumerate the halfedges of an edge. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:410 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_I_t_e_r │ │ │ │ +FaceHalfedgeIter FHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:478 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_H_I_t_e_r │ │ │ │ +EdgeHalfedgeIter EHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:486 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_l_e_m_e_n_t_s │ │ │ │ +ElementRange< HandleType >::RangeSkipping elements() const │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary(EdgeHandle _eh) const │ │ │ │ +Is the edge a boundary edge? │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1579 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +const Edge & deref(EdgeHandle _h) const │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1780 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n │ │ │ │ +FaceIter faces_sbegin() │ │ │ │ +Begin iterator for faces. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:375 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_~_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +virtual ~PolyConnectivity() │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:524 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > │ │ │ │ +VertexOHalfedgeCCWIter │ │ │ │ +Enumerates outgoing half edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:200 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter │ │ │ │ +Enumerates incident faces in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:233 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_E_C_W_I_t_e_r │ │ │ │ +VertexEdgeCWIter VECWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:470 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_F_a_c_e_H_a_n_d_l_e │ │ │ │ +static const FaceHandle InvalidFaceHandle │ │ │ │ +Invalid handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:126 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:141 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_E_C_C_W_I_t_e_r │ │ │ │ +ConstVertexEdgeCCWIter CVECCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:500 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +EdgeHalfedgeIter ConstEdgeHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:426 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_V_I_t_e_r │ │ │ │ +EdgeVertexIter EVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:485 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_V_C_C_W_I_t_e_r │ │ │ │ +ConstVertexVertexCCWIter CVVCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:491 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_C_W_W_I_t_e_r │ │ │ │ +FaceHalfedgeCCWIter FHCWWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:480 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary(VertexHandle _vh) const │ │ │ │ +Is vertex _vh a boundary vertex ? │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1596 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter │ │ │ │ +Identical to FaceHalfedgeIter. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:277 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:362 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +FaceEdgeCCWIter ConstFaceEdgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:377 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_V_C_W_I_t_e_r │ │ │ │ +ConstVertexVertexCWIter CVVCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:490 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter │ │ │ │ +Identical to FaceHalfedgeIter. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:272 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > │ │ │ │ +ConstEdgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1184 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_F_I_t_e_r │ │ │ │ +ConstEdgeFaceIter CEFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:518 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, │ │ │ │ +FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity:: │ │ │ │ +cfe_ccwend > > ConstFaceEdgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1300 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:284 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity:: │ │ │ │ +halfedges_end > > ConstHalfedgeRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1179 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_O_H_C_W_I_t_e_r │ │ │ │ +ConstVertexOHalfedgeCWIter CVOHCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:493 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +FaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:372 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_O_H_C_W_I_t_e_r │ │ │ │ +VertexOHalfedgeCWIter VOHCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:464 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter │ │ │ │ +Enumerate incident vertices in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:310 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_V_C_W_I_t_e_r │ │ │ │ +FaceVertexCWIter FVCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:476 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +Face & deref(FaceHandle _h) │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1783 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_F_I_t_e_r │ │ │ │ +EdgeFaceIter EFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:487 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +static const VertexHandle InvalidVertexHandle │ │ │ │ +Invalid handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n │ │ │ │ +VertexIter vertices_begin() │ │ │ │ +Begin iterator for vertices. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:308 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_I_t_e_r │ │ │ │ +ConstFaceIter CFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:458 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity:: │ │ │ │ +cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1286 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:234 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +HalfedgeIter ConstHalfedgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > │ │ │ │ +VertexIHalfedgeCCWIter │ │ │ │ +Enumerates incoming half edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:219 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +FaceVertexCCWIter ConstFaceVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:371 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1270 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_E_d_g_e_H_a_n_d_l_e │ │ │ │ +static const EdgeHandle InvalidEdgeHandle │ │ │ │ +Invalid handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1278 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity:: │ │ │ │ +vertices_end > > ConstVertexRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +Halfedge & deref(HalfedgeHandle _h) │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1779 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:254 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_E_I_t_e_r │ │ │ │ +FaceEdgeIter FEIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:481 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +FaceEdgeIter ConstFaceEdgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:375 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_E_I_t_e_r │ │ │ │ +ConstVertexEdgeIter CVEIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:498 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:322 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > │ │ │ │ +VertexIHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:214 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d │ │ │ │ +FaceIter faces_end() │ │ │ │ +End iterator for faces. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +void assign_connectivity(const PolyConnectivity &_other) │ │ │ │ +assign_connectivity() method. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:531 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_O_H_C_C_W_I_t_e_r │ │ │ │ +VertexOHalfedgeCCWIter VOHCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:465 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, │ │ │ │ +VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity:: │ │ │ │ +cvf_end > > ConstVertexFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1272 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_H_a_n_d_l_e │ │ │ │ +EdgeHandle EHandle │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:447 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_a_n_d_l_e │ │ │ │ +FaceHandle FHandle │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:448 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1294 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:311 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_E_C_W_I_t_e_r │ │ │ │ +ConstFaceEdgeCWIter CFECWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:511 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_F_I_t_e_r │ │ │ │ +ConstFaceFaceIter CFFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:513 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +VertexFaceCCWIter ConstVertexFaceCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:290 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_H_I_t_e_r │ │ │ │ +ConstEdgeHalfedgeIter CEHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:517 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +VertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:282 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_H_I_C_W_t_e_r │ │ │ │ +VertexIHalfedgeCWIter VIHICWter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:467 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_E_I_t_e_r │ │ │ │ +VertexEdgeIter VEIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:469 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ +FaceIter ConstFaceIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:147 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_O_H_I_t_e_r │ │ │ │ +VertexOHalfedgeIter VOHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:463 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:286 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r │ │ │ │ +VertexEdgeCWIter ConstVertexEdgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:292 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:175 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_F_C_W_I_t_e_r │ │ │ │ +ConstVertexFaceCWIter CVFCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:502 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, │ │ │ │ +EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity:: │ │ │ │ +cef_end > > ConstEdgeFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1279 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ +Check if the halfedge is at the boundary. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1568 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity:: │ │ │ │ +halfedges_end > > ConstHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter │ │ │ │ +Enumerate incident half edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:327 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +VertexVertexCWIter ConstVertexVertexCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:280 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +VertexEdgeCCWIter ConstVertexEdgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:293 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +VertexVertexIter ConstVertexVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:279 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_F_C_W_I_t_e_r │ │ │ │ +VertexFaceCWIter VFCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:473 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter │ │ │ │ +Enumerate adjacent faces in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:361 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +FaceHalfedgeCWIter ConstFaceHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:373 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1274 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter │ │ │ │ +Enumerate faces incident to an edge. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:423 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, │ │ │ │ +EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity:: │ │ │ │ +cev_end > > ConstEdgeVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1277 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:273 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +const Vertex & deref(VertexHandle _h) const │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1776 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter │ │ │ │ +Enumerate adjacent faces in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:367 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter │ │ │ │ +Enumerate incident edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:341 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d │ │ │ │ +VertexIter vertices_end() │ │ │ │ +End iterator for vertices. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:314 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter │ │ │ │ +Enumerate incident edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:347 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +Vertex & deref(VertexHandle _h) │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1777 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter │ │ │ │ +Enumerate vertices incident to an edge. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:397 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter │ │ │ │ +Enumerates incident faces in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:239 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, │ │ │ │ +FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity:: │ │ │ │ +cff_end > > ConstFaceFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1276 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_H_C_W_I_t_e_r │ │ │ │ +ConstFaceHalfedgeCWIter CFHCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:508 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ +const Face & deref(FaceHandle _h) const │ │ │ │ +Get item from handle. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1782 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n │ │ │ │ +FaceIter faces_begin() │ │ │ │ +Begin iterator for faces. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:344 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1291 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_V_I_t_e_r │ │ │ │ +FaceVertexIter FVIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:475 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_F_I_t_e_r │ │ │ │ +FaceFaceIter FFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:484 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_C_W_I_t_e_r │ │ │ │ +FaceHalfedgeCWIter FHCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:479 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:342 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_F_C_C_W_I_t_e_r │ │ │ │ +ConstFaceFaceCCWIter CFFCCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:515 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity:: │ │ │ │ +cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1297 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_H_I_C_C_W_t_e_r │ │ │ │ +VertexIHalfedgeCCWIter VIHICCWter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:468 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > │ │ │ │ +> ConstFaceRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1199 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_H_I_t_e_r │ │ │ │ +ConstVertexIHalfedgeIter CVIHIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:495 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1298 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_E_C_C_W_I_t_e_r │ │ │ │ +VertexEdgeCCWIter VECCWIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:471 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +FaceVertexCWIter ConstFaceVertexCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:370 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_I_t_e_r │ │ │ │ +FaceIter FIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:453 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > │ │ │ │ +VertexOHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:195 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_F_I_t_e_r │ │ │ │ +ConstVertexFaceIter CVFIter │ │ │ │ +Alias typedef. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:501 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:163 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:184 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:203 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:223 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:243 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:262 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:300 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:331 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:351 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:387 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:400 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:413 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1203 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ +allows easier access t... │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:170 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:197 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:228 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00674_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/Status.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/ArrayKernelT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
Status.hh
│ │ │ +
ArrayKernelT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,160 +136,304 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ +
42#define OPENMESH_ARRAY_KERNEL_C
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS Status
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#ifndef OPENMESH_ATTRIBUTE_STATUS_HH
│ │ │ -
53#define OPENMESH_ATTRIBUTE_STATUS_HH
│ │ │ +
44//== INCLUDES =================================================================
│ │ │ +
45
│ │ │ +
46#include <OpenMesh/Core/Mesh/ArrayKernel.hh>
│ │ │ +
47
│ │ │ +
48//== NAMESPACES ===============================================================
│ │ │ +
49
│ │ │ +
50namespace OpenMesh
│ │ │ +
51{
│ │ │ +
52
│ │ │ +
53//== IMPLEMENTATION ==========================================================
│ │ │
54
│ │ │ -
55
│ │ │ -
56//== INCLUDES =================================================================
│ │ │ -
57
│ │ │ -
58#include <OpenMesh/Core/System/config.h>
│ │ │ -
59
│ │ │ -
60
│ │ │ -
61//== NAMESPACES ===============================================================
│ │ │ -
62
│ │ │ +
55template<typename std_API_Container_VHandlePointer,
│ │ │ +
56 typename std_API_Container_HHandlePointer,
│ │ │ +
57 typename std_API_Container_FHandlePointer>
│ │ │ +
│ │ │ +
58void ArrayKernel::garbage_collection(std_API_Container_VHandlePointer& vh_to_update,
│ │ │ +
59 std_API_Container_HHandlePointer& hh_to_update,
│ │ │ +
60 std_API_Container_FHandlePointer& fh_to_update,
│ │ │ +
61 bool _v, bool _e, bool _f)
│ │ │ +
62{
│ │ │
63
│ │ │ -
64namespace OpenMesh {
│ │ │ -
65namespace Attributes {
│ │ │ -
66
│ │ │ -
67
│ │ │ -
68//== CLASS DEFINITION ========================================================
│ │ │ -
69
│ │ │ -
70
│ │ │ -
│ │ │ - │ │ │ -
75
│ │ │ -
76 DELETED = 1,
│ │ │ -
77 LOCKED = 2,
│ │ │ - │ │ │ -
79 HIDDEN = 8,
│ │ │ -
80 FEATURE = 16,
│ │ │ -
81 TAGGED = 32,
│ │ │ -
82 TAGGED2 = 64,
│ │ │ - │ │ │ -
84 UNUSED = 256
│ │ │ -
85};
│ │ │ -
│ │ │ -
86
│ │ │ -
87
│ │ │ -
│ │ │ - │ │ │ -
95{
│ │ │ -
96public:
│ │ │ +
64#ifdef DEBUG
│ │ │ +
65 #ifndef OM_GARBAGE_NO_STATUS_WARNING
│ │ │ +
66 if ( !this->has_vertex_status() )
│ │ │ +
67 omerr() << "garbage_collection: No vertex status available. You can request it: mesh.request_vertex_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning." << std::endl;
│ │ │ +
68 if ( !this->has_edge_status() )
│ │ │ +
69 omerr() << "garbage_collection: No edge status available. You can request it: mesh.request_edge_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning." << std::endl;
│ │ │ +
70 if ( !this->has_face_status() )
│ │ │ +
71 omerr() << "garbage_collection: No face status available. You can request it: mesh.request_face_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning." << std::endl;
│ │ │ +
72 #endif
│ │ │ +
73#endif
│ │ │ +
74
│ │ │ +
75 const bool track_vhandles = ( !vh_to_update.empty() );
│ │ │ +
76 const bool track_hhandles = ( !hh_to_update.empty() );
│ │ │ +
77 const bool track_fhandles = ( !fh_to_update.empty() );
│ │ │ +
78
│ │ │ +
79 int i, i0, i1;
│ │ │ +
80
│ │ │ +
81 int nV = int(n_vertices());
│ │ │ +
82 int nE = int(n_edges());
│ │ │ +
83 int nH = int(2*n_edges());
│ │ │ +
84 int nF = (int(n_faces()));
│ │ │ +
85
│ │ │ +
86 std::vector<VertexHandle> vh_map;
│ │ │ +
87 std::vector<HalfedgeHandle> hh_map;
│ │ │ +
88 std::vector<FaceHandle> fh_map;
│ │ │ +
89
│ │ │ +
90 std::map <int, int> vertex_inverse_map;
│ │ │ +
91 std::map <int, int> halfedge_inverse_map;
│ │ │ +
92 std::map <int, int> face_inverse_map;
│ │ │ +
93
│ │ │ +
94 // setup handle mapping:
│ │ │ +
95 vh_map.reserve(nV);
│ │ │ +
96 for (i=0; i<nV; ++i) vh_map.push_back(VertexHandle(i));
│ │ │
97
│ │ │ -
98 typedef unsigned int value_type;
│ │ │ -
99
│ │ │ -
100 StatusInfo() : status_(0) {}
│ │ │ -
101
│ │ │ -
103 bool deleted() const { return is_bit_set(DELETED); }
│ │ │ -
105 void set_deleted(bool _b) { change_bit(DELETED, _b); }
│ │ │ -
106
│ │ │ -
107
│ │ │ -
109 bool locked() const { return is_bit_set(LOCKED); }
│ │ │ -
111 void set_locked(bool _b) { change_bit(LOCKED, _b); }
│ │ │ -
112
│ │ │ -
113
│ │ │ -
115 bool selected() const { return is_bit_set(SELECTED); }
│ │ │ -
117 void set_selected(bool _b) { change_bit(SELECTED, _b); }
│ │ │ -
118
│ │ │ -
119
│ │ │ -
121 bool hidden() const { return is_bit_set(HIDDEN); }
│ │ │ -
123 void set_hidden(bool _b) { change_bit(HIDDEN, _b); }
│ │ │ -
124
│ │ │ -
125
│ │ │ -
127 bool feature() const { return is_bit_set(FEATURE); }
│ │ │ -
129 void set_feature(bool _b) { change_bit(FEATURE, _b); }
│ │ │ -
130
│ │ │ -
131
│ │ │ -
133 bool tagged() const { return is_bit_set(TAGGED); }
│ │ │ -
135 void set_tagged(bool _b) { change_bit(TAGGED, _b); }
│ │ │ -
136
│ │ │ -
137
│ │ │ -
139 bool tagged2() const { return is_bit_set(TAGGED2); }
│ │ │ -
141 void set_tagged2(bool _b) { change_bit(TAGGED2, _b); }
│ │ │ -
142
│ │ │ -
143
│ │ │ - │ │ │ - │ │ │ -
148
│ │ │ -
149
│ │ │ -
151 unsigned int bits() const { return status_; }
│ │ │ -
153 void set_bits(unsigned int _bits) { status_ = _bits; }
│ │ │ -
154
│ │ │ +
98 hh_map.reserve(nH);
│ │ │ +
99 for (i=0; i<nH; ++i) hh_map.push_back(HalfedgeHandle(i));
│ │ │ +
100
│ │ │ +
101 fh_map.reserve(nF);
│ │ │ +
102 for (i=0; i<nF; ++i) fh_map.push_back(FaceHandle(i));
│ │ │ +
103
│ │ │ +
104 // remove deleted vertices
│ │ │ +
105 if (_v && n_vertices() > 0 && this->has_vertex_status() )
│ │ │ +
106 {
│ │ │ +
107 i0=0; i1=nV-1;
│ │ │ +
108
│ │ │ +
109 while (1)
│ │ │ +
110 {
│ │ │ +
111 // find 1st deleted and last un-deleted
│ │ │ +
112 while (!status(VertexHandle(i0)).deleted() && i0 < i1) ++i0;
│ │ │ +
113 while ( status(VertexHandle(i1)).deleted() && i0 < i1) --i1;
│ │ │ +
114 if (i0 >= i1) break;
│ │ │ +
115
│ │ │ +
116 // If we keep track of the vertex handles for updates,
│ │ │ +
117 // we need to have the opposite direction
│ │ │ +
118 if ( track_vhandles ) {
│ │ │ +
119 vertex_inverse_map[i1] = i0;
│ │ │ +
120 vertex_inverse_map[i0] = -1;
│ │ │ +
121 }
│ │ │ +
122
│ │ │ +
123 // swap
│ │ │ +
124 std::swap(vertices_[i0], vertices_[i1]);
│ │ │ +
125 std::swap(vh_map[i0], vh_map[i1]);
│ │ │ +
126 vprops_swap(i0, i1);
│ │ │ +
127 };
│ │ │ +
128
│ │ │ +
129 vertices_.resize(status(VertexHandle(i0)).deleted() ? i0 : i0+1);
│ │ │ + │ │ │ +
131 }
│ │ │ +
132
│ │ │ +
133
│ │ │ +
134 // remove deleted edges
│ │ │ +
135 if (_e && n_edges() > 0 && this->has_edge_status() )
│ │ │ +
136 {
│ │ │ +
137 i0=0; i1=nE-1;
│ │ │ +
138
│ │ │ +
139 while (1)
│ │ │ +
140 {
│ │ │ +
141 // find 1st deleted and last un-deleted
│ │ │ +
142 while (!status(EdgeHandle(i0)).deleted() && i0 < i1) ++i0;
│ │ │ +
143 while ( status(EdgeHandle(i1)).deleted() && i0 < i1) --i1;
│ │ │ +
144 if (i0 >= i1) break;
│ │ │ +
145
│ │ │ +
146 // If we keep track of the vertex handles for updates,
│ │ │ +
147 // we need to have the opposite direction
│ │ │ +
148 if ( track_hhandles ) {
│ │ │ +
149 halfedge_inverse_map[2*i1] = 2 * i0;
│ │ │ +
150 halfedge_inverse_map[2*i0] = -1;
│ │ │ +
151
│ │ │ +
152 halfedge_inverse_map[2*i1 + 1] = 2 * i0 + 1;
│ │ │ +
153 halfedge_inverse_map[2*i0 + 1] = -1;
│ │ │ +
154 }
│ │ │
155
│ │ │ -
157 bool is_bit_set(unsigned int _s) const { return (status_ & _s) > 0; }
│ │ │ -
159 void set_bit(unsigned int _s) { status_ |= _s; }
│ │ │ -
161 void unset_bit(unsigned int _s) { status_ &= ~_s; }
│ │ │ -
│ │ │ -
163 void change_bit(unsigned int _s, bool _b) {
│ │ │ -
164 if (_b) status_ |= _s; else status_ &= ~_s; }
│ │ │ -
│ │ │ -
165
│ │ │ -
166
│ │ │ -
167private:
│ │ │ -
168
│ │ │ -
169 value_type status_;
│ │ │ -
170};
│ │ │ +
156 // swap
│ │ │ +
157 std::swap(edges_[i0], edges_[i1]);
│ │ │ +
158 std::swap(hh_map[2*i0], hh_map[2*i1]);
│ │ │ +
159 std::swap(hh_map[2*i0+1], hh_map[2*i1+1]);
│ │ │ +
160 eprops_swap(i0, i1);
│ │ │ +
161 hprops_swap(2*i0, 2*i1);
│ │ │ +
162 hprops_swap(2*i0+1, 2*i1+1);
│ │ │ +
163 };
│ │ │ +
164
│ │ │ +
165 edges_.resize(status(EdgeHandle(i0)).deleted() ? i0 : i0+1);
│ │ │ + │ │ │ + │ │ │ +
168 }
│ │ │ +
169
│ │ │ +
170
│ │ │ +
171 // remove deleted faces
│ │ │ +
172 if (_f && n_faces() > 0 && this->has_face_status() )
│ │ │ +
173 {
│ │ │ +
174 i0=0; i1=nF-1;
│ │ │ +
175
│ │ │ +
176 while (1)
│ │ │ +
177 {
│ │ │ +
178 // find 1st deleted and last un-deleted
│ │ │ +
179 while (!status(FaceHandle(i0)).deleted() && i0 < i1) ++i0;
│ │ │ +
180 while ( status(FaceHandle(i1)).deleted() && i0 < i1) --i1;
│ │ │ +
181 if (i0 >= i1) break;
│ │ │ +
182
│ │ │ +
183 // If we keep track of the face handles for updates,
│ │ │ +
184 // we need to have the opposite direction
│ │ │ +
185 if ( track_fhandles ) {
│ │ │ +
186 face_inverse_map[i1] = i0;
│ │ │ +
187 face_inverse_map[i0] = -1;
│ │ │ +
188 }
│ │ │ +
189
│ │ │ +
190 // swap
│ │ │ +
191 std::swap(faces_[i0], faces_[i1]);
│ │ │ +
192 std::swap(fh_map[i0], fh_map[i1]);
│ │ │ +
193 fprops_swap(i0, i1);
│ │ │ +
194 };
│ │ │ +
195
│ │ │ +
196 faces_.resize(status(FaceHandle(i0)).deleted() ? i0 : i0+1);
│ │ │ + │ │ │ +
198 }
│ │ │ +
199
│ │ │ +
200
│ │ │ +
201 // update handles of vertices
│ │ │ +
202 if (_e)
│ │ │ +
203 {
│ │ │ +
204 KernelVertexIter v_it(vertices_begin()), v_end(vertices_end());
│ │ │ +
205 VertexHandle vh;
│ │ │ +
206
│ │ │ +
207 for (; v_it!=v_end; ++v_it)
│ │ │ +
208 {
│ │ │ +
209 vh = handle(*v_it);
│ │ │ +
210 if (!is_isolated(vh))
│ │ │ +
211 {
│ │ │ +
212 set_halfedge_handle(vh, hh_map[halfedge_handle(vh).idx()]);
│ │ │ +
213 }
│ │ │ +
214 }
│ │ │ +
215 }
│ │ │ +
216
│ │ │ + │ │ │ +
218 // update handles of halfedges
│ │ │ +
219 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it)
│ │ │ +
220 {//in the first pass update the (half)edges vertices
│ │ │ +
221 hh = halfedge_handle(handle(*e_it), 0);
│ │ │ +
222 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]);
│ │ │ +
223 hh = halfedge_handle(handle(*e_it), 1);
│ │ │ +
224 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]);
│ │ │ +
225 }
│ │ │ +
226 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it)
│ │ │ +
227 {//in the second pass update the connectivity of the (half)edges
│ │ │ +
228 hh = halfedge_handle(handle(*e_it), 0);
│ │ │ +
229 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]);
│ │ │ +
230 if (!is_boundary(hh))
│ │ │ +
231 {
│ │ │ +
232 set_face_handle(hh, fh_map[face_handle(hh).idx()]);
│ │ │ +
233 }
│ │ │ +
234 hh = halfedge_handle(handle(*e_it), 1);
│ │ │ +
235 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]);
│ │ │ +
236 if (!is_boundary(hh))
│ │ │ +
237 {
│ │ │ +
238 set_face_handle(hh, fh_map[face_handle(hh).idx()]);
│ │ │ +
239 }
│ │ │ +
240 }
│ │ │ +
241
│ │ │ +
242 // update handles of faces
│ │ │ +
243 if (_e)
│ │ │ +
244 {
│ │ │ +
245 KernelFaceIter f_it(faces_begin()), f_end(faces_end());
│ │ │ +
246 FaceHandle fh;
│ │ │ +
247
│ │ │ +
248 for (; f_it!=f_end; ++f_it)
│ │ │ +
249 {
│ │ │ +
250 fh = handle(*f_it);
│ │ │ +
251 set_halfedge_handle(fh, hh_map[halfedge_handle(fh).idx()]);
│ │ │ +
252 }
│ │ │ +
253 }
│ │ │ +
254
│ │ │ +
255 const int vertexCount = int(vertices_.size());
│ │ │ +
256 const int halfedgeCount = int(edges_.size() * 2);
│ │ │ +
257 const int faceCount = int(faces_.size());
│ │ │ +
258
│ │ │ +
259 // Update the vertex handles in the vertex handle vector
│ │ │ +
260 typename std_API_Container_VHandlePointer::iterator v_it(vh_to_update.begin()), v_it_end(vh_to_update.end());
│ │ │ +
261 for(; v_it != v_it_end; ++v_it)
│ │ │ +
262 {
│ │ │ +
263
│ │ │ +
264 // Only changed vertices need to be considered
│ │ │ +
265 if ( (*v_it)->idx() != vh_map[(*v_it)->idx()].idx() ) {
│ │ │ +
266 *(*v_it) = VertexHandle(vertex_inverse_map[(*v_it)->idx()]);
│ │ │ +
267
│ │ │ +
268 // Vertices above the vertex count have to be already mapped, or they are invalid now!
│ │ │ +
269 } else if ( ((*v_it)->idx() >= vertexCount) && (vertex_inverse_map.find((*v_it)->idx()) == vertex_inverse_map.end()) ) {
│ │ │ +
270 (*v_it)->invalidate();
│ │ │ +
271 }
│ │ │ +
272
│ │ │ +
273 }
│ │ │ +
274
│ │ │ +
275 // Update the halfedge handles in the halfedge handle vector
│ │ │ +
276 typename std_API_Container_HHandlePointer::iterator hh_it(hh_to_update.begin()), hh_it_end(hh_to_update.end());
│ │ │ +
277 for(; hh_it != hh_it_end; ++hh_it)
│ │ │ +
278 {
│ │ │ +
279 // Only changed faces need to be considered
│ │ │ +
280 if ( (*hh_it)->idx() != hh_map[(*hh_it)->idx()].idx() ) {
│ │ │ +
281 *(*hh_it) = HalfedgeHandle(halfedge_inverse_map[(*hh_it)->idx()]);
│ │ │ +
282
│ │ │ +
283 // Vertices above the face count have to be already mapped, or they are invalid now!
│ │ │ +
284 } else if ( ((*hh_it)->idx() >= halfedgeCount) && (halfedge_inverse_map.find((*hh_it)->idx()) == halfedge_inverse_map.end()) ) {
│ │ │ +
285 (*hh_it)->invalidate();
│ │ │ +
286 }
│ │ │ +
287
│ │ │ +
288 }
│ │ │ +
289
│ │ │ +
290 // Update the face handles in the face handle vector
│ │ │ +
291 typename std_API_Container_FHandlePointer::iterator fh_it(fh_to_update.begin()), fh_it_end(fh_to_update.end());
│ │ │ +
292 for(; fh_it != fh_it_end; ++fh_it)
│ │ │ +
293 {
│ │ │ +
294
│ │ │ +
295 // Only changed faces need to be considered
│ │ │ +
296 if ( (*fh_it)->idx() != fh_map[(*fh_it)->idx()].idx() ) {
│ │ │ +
297 *(*fh_it) = FaceHandle(face_inverse_map[(*fh_it)->idx()]);
│ │ │ +
298
│ │ │ +
299 // Vertices above the face count have to be already mapped, or they are invalid now!
│ │ │ +
300 } else if ( ((*fh_it)->idx() >= faceCount) && (face_inverse_map.find((*fh_it)->idx()) == face_inverse_map.end()) ) {
│ │ │ +
301 (*fh_it)->invalidate();
│ │ │ +
302 }
│ │ │ +
303
│ │ │ +
304 }
│ │ │ +
305}
│ │ │
│ │ │ -
171
│ │ │ -
172
│ │ │ -
173//=============================================================================
│ │ │ -
174} // namespace Attributes
│ │ │ -
175} // namespace OpenMesh
│ │ │ -
176//=============================================================================
│ │ │ -
177#endif // OPENMESH_ATTRIBUTE_STATUS_HH defined
│ │ │ -
178//=============================================================================
│ │ │ +
306
│ │ │ +
307}
│ │ │ +
308
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
StatusBits
Status bits used by the Status class.
Definition Status.hh:74
│ │ │ -
@ TAGGED2
Alternate bit for tagging an item.
Definition Status.hh:82
│ │ │ -
@ LOCKED
Item is locked.
Definition Status.hh:77
│ │ │ -
@ FIXEDNONMANIFOLD
Item was non-two-manifold and had to be fixed.
Definition Status.hh:83
│ │ │ -
@ DELETED
Item has been deleted.
Definition Status.hh:76
│ │ │ -
@ SELECTED
Item is selected.
Definition Status.hh:78
│ │ │ -
@ UNUSED
Unused.
Definition Status.hh:84
│ │ │ -
@ HIDDEN
Item is hidden.
Definition Status.hh:79
│ │ │ -
@ TAGGED
Item is tagged.
Definition Status.hh:81
│ │ │ -
@ FEATURE
Item is a feature or belongs to a feature.
Definition Status.hh:80
│ │ │ -
Add status information to a base class.
Definition Status.hh:95
│ │ │ -
void set_fixed_nonmanifold(bool _b)
set fixed non-manifold
Definition Status.hh:147
│ │ │ -
void set_hidden(bool _b)
set hidden
Definition Status.hh:123
│ │ │ +
size_t n_vertices() const override
You should not use this function directly.
Definition ArrayKernel.hh:345
│ │ │ +
size_t n_edges() const override
You should not use this function directly.
Definition ArrayKernel.hh:347
│ │ │ +
bool is_boundary(HalfedgeHandle _heh) const
Is halfedge _heh a boundary halfedge (is its face handle invalid) ?
Definition ArrayKernel.hh:400
│ │ │ +
const StatusInfo & status(VertexHandle _vh) const
Status Query API.
Definition ArrayKernel.hh:503
│ │ │ +
size_t n_faces() const override
You should not use this function directly.
Definition ArrayKernel.hh:348
│ │ │ +
void garbage_collection(bool _v=true, bool _e=true, bool _f=true)
garbage collection
Definition ArrayKernel.cc:166
│ │ │ +
size_t n_halfedges() const override
You should not use this function directly.
Definition ArrayKernel.hh:346
│ │ │ +
void eprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:737
│ │ │ +
void vprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:719
│ │ │ +
void hprops_resize(size_t _n) const
You should not use this function directly.
Definition BaseKernel.hh:724
│ │ │ +
void hprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:728
│ │ │ +
void fprops_resize(size_t _n) const
You should not use this function directly.
Definition BaseKernel.hh:742
│ │ │ +
void eprops_resize(size_t _n) const
You should not use this function directly.
Definition BaseKernel.hh:733
│ │ │ +
void fprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:746
│ │ │ +
void vprops_resize(size_t _n) const
Resizes all vertex property vectors to the specified size.
Definition BaseKernel.hh:703
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │
bool deleted() const
is deleted ?
Definition Status.hh:103
│ │ │ -
void set_selected(bool _b)
set selected
Definition Status.hh:117
│ │ │ -
void set_tagged2(bool _b)
set tagged
Definition Status.hh:141
│ │ │ -
bool tagged() const
is tagged ?
Definition Status.hh:133
│ │ │ -
bool is_bit_set(unsigned int _s) const
is a certain bit set ?
Definition Status.hh:157
│ │ │ -
void set_bits(unsigned int _bits)
set whole status at once
Definition Status.hh:153
│ │ │ -
bool locked() const
is locked ?
Definition Status.hh:109
│ │ │ -
void set_locked(bool _b)
set locked
Definition Status.hh:111
│ │ │ -
void set_deleted(bool _b)
set deleted
Definition Status.hh:105
│ │ │ -
void set_feature(bool _b)
set feature
Definition Status.hh:129
│ │ │ -
void set_bit(unsigned int _s)
set a certain bit
Definition Status.hh:159
│ │ │ -
void set_tagged(bool _b)
set tagged
Definition Status.hh:135
│ │ │ -
void change_bit(unsigned int _s, bool _b)
set or unset a certain bit
Definition Status.hh:163
│ │ │ -
bool feature() const
is feature ?
Definition Status.hh:127
│ │ │ -
bool tagged2() const
is tagged2 ? This is just one more tag info.
Definition Status.hh:139
│ │ │ -
bool fixed_nonmanifold() const
is fixed non-manifold ?
Definition Status.hh:145
│ │ │ -
unsigned int bits() const
return whole status
Definition Status.hh:151
│ │ │ -
bool selected() const
is selected ?
Definition Status.hh:115
│ │ │ -
void unset_bit(unsigned int _s)
unset a certain bit
Definition Status.hh:161
│ │ │ -
bool hidden() const
is hidden ?
Definition Status.hh:121
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -Status.hh │ │ │ │ +ArrayKernelT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,259 +45,376 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ +42#define OPENMESH_ARRAY_KERNEL_C │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS Status │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef OPENMESH_ATTRIBUTE_STATUS_HH │ │ │ │ -53#define OPENMESH_ATTRIBUTE_STATUS_HH │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//== INCLUDES │ │ │ │ +44//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ -57 │ │ │ │ -58#include │ │ │ │ -59 │ │ │ │ -60 │ │ │ │ -61//== NAMESPACES │ │ │ │ +45 │ │ │ │ +46#include │ │ │ │ +47 │ │ │ │ +48//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -62 │ │ │ │ +49 │ │ │ │ +50namespace _O_p_e_n_M_e_s_h │ │ │ │ +51{ │ │ │ │ +52 │ │ │ │ +53//== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ +54 │ │ │ │ +55template │ │ │ │ +_5_8void _A_r_r_a_y_K_e_r_n_e_l_:_:_g_a_r_b_a_g_e___c_o_l_l_e_c_t_i_o_n(std_API_Container_VHandlePointer& │ │ │ │ +vh_to_update, │ │ │ │ +59 std_API_Container_HHandlePointer& hh_to_update, │ │ │ │ +60 std_API_Container_FHandlePointer& fh_to_update, │ │ │ │ +61 bool _v, bool _e, bool _f) │ │ │ │ +62{ │ │ │ │ 63 │ │ │ │ -64namespace _O_p_e_n_M_e_s_h { │ │ │ │ -65namespace Attributes { │ │ │ │ -66 │ │ │ │ -67 │ │ │ │ -68//== CLASS DEFINITION │ │ │ │ -======================================================== │ │ │ │ -69 │ │ │ │ -70 │ │ │ │ -_7_4enum _S_t_a_t_u_s_B_i_t_s { │ │ │ │ -75 │ │ │ │ -_7_6 _D_E_L_E_T_E_D = 1, │ │ │ │ -_7_7 _L_O_C_K_E_D = 2, │ │ │ │ -_7_8 _S_E_L_E_C_T_E_D = 4, │ │ │ │ -_7_9 _H_I_D_D_E_N = 8, │ │ │ │ -_8_0 _F_E_A_T_U_R_E = 16, │ │ │ │ -_8_1 _T_A_G_G_E_D = 32, │ │ │ │ -_8_2 _T_A_G_G_E_D_2 = 64, │ │ │ │ -_8_3 _F_I_X_E_D_N_O_N_M_A_N_I_F_O_L_D = 128, │ │ │ │ -84 _U_N_U_S_E_D = 256 │ │ │ │ -_8_5}; │ │ │ │ -86 │ │ │ │ -87 │ │ │ │ -_9_4class _S_t_a_t_u_s_I_n_f_o │ │ │ │ -95{ │ │ │ │ -96public: │ │ │ │ +64#ifdef DEBUG │ │ │ │ +65 #ifndef OM_GARBAGE_NO_STATUS_WARNING │ │ │ │ +66 if ( !this->has_vertex_status() ) │ │ │ │ +67 omerr() << "garbage_collection: No vertex status available. You can request │ │ │ │ +it: mesh.request_vertex_status() or define OM_GARBAGE_NO_STATUS_WARNING to │ │ │ │ +silence this warning." << std::endl; │ │ │ │ +68 if ( !this->has_edge_status() ) │ │ │ │ +69 omerr() << "garbage_collection: No edge status available. You can request │ │ │ │ +it: mesh.request_edge_status() or define OM_GARBAGE_NO_STATUS_WARNING to │ │ │ │ +silence this warning." << std::endl; │ │ │ │ +70 if ( !this->has_face_status() ) │ │ │ │ +71 omerr() << "garbage_collection: No face status available. You can request │ │ │ │ +it: mesh.request_face_status() or define OM_GARBAGE_NO_STATUS_WARNING to │ │ │ │ +silence this warning." << std::endl; │ │ │ │ +72 #endif │ │ │ │ +73#endif │ │ │ │ +74 │ │ │ │ +75 const bool track_vhandles = ( !vh_to_update.empty() ); │ │ │ │ +76 const bool track_hhandles = ( !hh_to_update.empty() ); │ │ │ │ +77 const bool track_fhandles = ( !fh_to_update.empty() ); │ │ │ │ +78 │ │ │ │ +79 int i, i0, i1; │ │ │ │ +80 │ │ │ │ +81 int nV = int(_n___v_e_r_t_i_c_e_s()); │ │ │ │ +82 int nE = int(_n___e_d_g_e_s()); │ │ │ │ +83 int nH = int(2*_n___e_d_g_e_s()); │ │ │ │ +84 int nF = (int(_n___f_a_c_e_s())); │ │ │ │ +85 │ │ │ │ +86 std::vector vh_map; │ │ │ │ +87 std::vector hh_map; │ │ │ │ +88 std::vector fh_map; │ │ │ │ +89 │ │ │ │ +90 std::map vertex_inverse_map; │ │ │ │ +91 std::map halfedge_inverse_map; │ │ │ │ +92 std::map face_inverse_map; │ │ │ │ +93 │ │ │ │ +94 // setup handle mapping: │ │ │ │ +95 vh_map.reserve(nV); │ │ │ │ +96 for (i=0; i 0 && this->has_vertex_status() ) │ │ │ │ +106 { │ │ │ │ +107 i0=0; i1=nV-1; │ │ │ │ +108 │ │ │ │ +109 while (1) │ │ │ │ +110 { │ │ │ │ +111 // find 1st deleted and last un-deleted │ │ │ │ +112 while (!_s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e(i0))._d_e_l_e_t_e_d() && i0 < i1) ++i0; │ │ │ │ +113 while ( _s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e(i1))._d_e_l_e_t_e_d() && i0 < i1) --i1; │ │ │ │ +114 if (i0 >= i1) break; │ │ │ │ +115 │ │ │ │ +116 // If we keep track of the vertex handles for updates, │ │ │ │ +117 // we need to have the opposite direction │ │ │ │ +118 if ( track_vhandles ) { │ │ │ │ +119 vertex_inverse_map[i1] = i0; │ │ │ │ +120 vertex_inverse_map[i0] = -1; │ │ │ │ +121 } │ │ │ │ +122 │ │ │ │ +123 // swap │ │ │ │ +124 std::swap(vertices_[i0], vertices_[i1]); │ │ │ │ +125 std::swap(vh_map[i0], vh_map[i1]); │ │ │ │ +126 _v_p_r_o_p_s___s_w_a_p(i0, i1); │ │ │ │ +127 }; │ │ │ │ +128 │ │ │ │ +129 vertices_.resize(_s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e(i0)).deleted() ? i0 : i0+1); │ │ │ │ +130 _v_p_r_o_p_s___r_e_s_i_z_e(_n___v_e_r_t_i_c_e_s()); │ │ │ │ +131 } │ │ │ │ +132 │ │ │ │ +133 │ │ │ │ +134 // remove deleted edges │ │ │ │ +135 if (_e && _n___e_d_g_e_s() > 0 && this->has_edge_status() ) │ │ │ │ +136 { │ │ │ │ +137 i0=0; i1=nE-1; │ │ │ │ +138 │ │ │ │ +139 while (1) │ │ │ │ +140 { │ │ │ │ +141 // find 1st deleted and last un-deleted │ │ │ │ +142 while (!_s_t_a_t_u_s(_E_d_g_e_H_a_n_d_l_e(i0)).deleted() && i0 < i1) ++i0; │ │ │ │ +143 while ( _s_t_a_t_u_s(_E_d_g_e_H_a_n_d_l_e(i1)).deleted() && i0 < i1) --i1; │ │ │ │ +144 if (i0 >= i1) break; │ │ │ │ +145 │ │ │ │ +146 // If we keep track of the vertex handles for updates, │ │ │ │ +147 // we need to have the opposite direction │ │ │ │ +148 if ( track_hhandles ) { │ │ │ │ +149 halfedge_inverse_map[2*i1] = 2 * i0; │ │ │ │ +150 halfedge_inverse_map[2*i0] = -1; │ │ │ │ +151 │ │ │ │ +152 halfedge_inverse_map[2*i1 + 1] = 2 * i0 + 1; │ │ │ │ +153 halfedge_inverse_map[2*i0 + 1] = -1; │ │ │ │ +154 } │ │ │ │ 155 │ │ │ │ -_1_5_7 bool _i_s___b_i_t___s_e_t(unsigned int _s) const { return (status_ & _s) > 0; } │ │ │ │ -_1_5_9 void _s_e_t___b_i_t(unsigned int _s) { status_ |= _s; } │ │ │ │ -_1_6_1 void _u_n_s_e_t___b_i_t(unsigned int _s) { status_ &= ~_s; } │ │ │ │ -_1_6_3 void _c_h_a_n_g_e___b_i_t(unsigned int _s, bool _b) { │ │ │ │ -164 if (_b) status_ |= _s; else status_ &= ~_s; } │ │ │ │ -165 │ │ │ │ -166 │ │ │ │ -167private: │ │ │ │ -168 │ │ │ │ -169 value_type status_; │ │ │ │ -170}; │ │ │ │ -171 │ │ │ │ -172 │ │ │ │ -173// │ │ │ │ -============================================================================= │ │ │ │ -174} // namespace Attributes │ │ │ │ -175} // namespace OpenMesh │ │ │ │ -176// │ │ │ │ -============================================================================= │ │ │ │ -177#endif // OPENMESH_ATTRIBUTE_STATUS_HH defined │ │ │ │ -178// │ │ │ │ -============================================================================= │ │ │ │ +156 // swap │ │ │ │ +157 std::swap(edges_[i0], edges_[i1]); │ │ │ │ +158 std::swap(hh_map[2*i0], hh_map[2*i1]); │ │ │ │ +159 std::swap(hh_map[2*i0+1], hh_map[2*i1+1]); │ │ │ │ +160 _e_p_r_o_p_s___s_w_a_p(i0, i1); │ │ │ │ +161 _h_p_r_o_p_s___s_w_a_p(2*i0, 2*i1); │ │ │ │ +162 _h_p_r_o_p_s___s_w_a_p(2*i0+1, 2*i1+1); │ │ │ │ +163 }; │ │ │ │ +164 │ │ │ │ +165 edges_.resize(_s_t_a_t_u_s(_E_d_g_e_H_a_n_d_l_e(i0)).deleted() ? i0 : i0+1); │ │ │ │ +166 _e_p_r_o_p_s___r_e_s_i_z_e(_n___e_d_g_e_s()); │ │ │ │ +167 _h_p_r_o_p_s___r_e_s_i_z_e(_n___h_a_l_f_e_d_g_e_s()); │ │ │ │ +168 } │ │ │ │ +169 │ │ │ │ +170 │ │ │ │ +171 // remove deleted faces │ │ │ │ +172 if (_f && _n___f_a_c_e_s() > 0 && this->has_face_status() ) │ │ │ │ +173 { │ │ │ │ +174 i0=0; i1=nF-1; │ │ │ │ +175 │ │ │ │ +176 while (1) │ │ │ │ +177 { │ │ │ │ +178 // find 1st deleted and last un-deleted │ │ │ │ +179 while (!_s_t_a_t_u_s(_F_a_c_e_H_a_n_d_l_e(i0)).deleted() && i0 < i1) ++i0; │ │ │ │ +180 while ( _s_t_a_t_u_s(_F_a_c_e_H_a_n_d_l_e(i1)).deleted() && i0 < i1) --i1; │ │ │ │ +181 if (i0 >= i1) break; │ │ │ │ +182 │ │ │ │ +183 // If we keep track of the face handles for updates, │ │ │ │ +184 // we need to have the opposite direction │ │ │ │ +185 if ( track_fhandles ) { │ │ │ │ +186 face_inverse_map[i1] = i0; │ │ │ │ +187 face_inverse_map[i0] = -1; │ │ │ │ +188 } │ │ │ │ +189 │ │ │ │ +190 // swap │ │ │ │ +191 std::swap(faces_[i0], faces_[i1]); │ │ │ │ +192 std::swap(fh_map[i0], fh_map[i1]); │ │ │ │ +193 _f_p_r_o_p_s___s_w_a_p(i0, i1); │ │ │ │ +194 }; │ │ │ │ +195 │ │ │ │ +196 faces_.resize(_s_t_a_t_u_s(_F_a_c_e_H_a_n_d_l_e(i0)).deleted() ? i0 : i0+1); │ │ │ │ +197 _f_p_r_o_p_s___r_e_s_i_z_e(_n___f_a_c_e_s()); │ │ │ │ +198 } │ │ │ │ +199 │ │ │ │ +200 │ │ │ │ +201 // update handles of vertices │ │ │ │ +202 if (_e) │ │ │ │ +203 { │ │ │ │ +204 KernelVertexIter v_it(vertices_begin()), v_end(vertices_end()); │ │ │ │ +205 _V_e_r_t_e_x_H_a_n_d_l_e vh; │ │ │ │ +206 │ │ │ │ +207 for (; v_it!=v_end; ++v_it) │ │ │ │ +208 { │ │ │ │ +209 vh = handle(*v_it); │ │ │ │ +210 if (!is_isolated(vh)) │ │ │ │ +211 { │ │ │ │ +212 set_halfedge_handle(vh, hh_map[halfedge_handle(vh).idx()]); │ │ │ │ +213 } │ │ │ │ +214 } │ │ │ │ +215 } │ │ │ │ +216 │ │ │ │ +217 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hh; │ │ │ │ +218 // update handles of halfedges │ │ │ │ +219 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it) │ │ │ │ +220 {//in the first pass update the (half)edges vertices │ │ │ │ +221 hh = halfedge_handle(handle(*e_it), 0); │ │ │ │ +222 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]); │ │ │ │ +223 hh = halfedge_handle(handle(*e_it), 1); │ │ │ │ +224 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]); │ │ │ │ +225 } │ │ │ │ +226 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it) │ │ │ │ +227 {//in the second pass update the connectivity of the (half)edges │ │ │ │ +228 hh = halfedge_handle(handle(*e_it), 0); │ │ │ │ +229 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]); │ │ │ │ +230 if (!_i_s___b_o_u_n_d_a_r_y(hh)) │ │ │ │ +231 { │ │ │ │ +232 set_face_handle(hh, fh_map[face_handle(hh).idx()]); │ │ │ │ +233 } │ │ │ │ +234 hh = halfedge_handle(handle(*e_it), 1); │ │ │ │ +235 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]); │ │ │ │ +236 if (!_i_s___b_o_u_n_d_a_r_y(hh)) │ │ │ │ +237 { │ │ │ │ +238 set_face_handle(hh, fh_map[face_handle(hh).idx()]); │ │ │ │ +239 } │ │ │ │ +240 } │ │ │ │ +241 │ │ │ │ +242 // update handles of faces │ │ │ │ +243 if (_e) │ │ │ │ +244 { │ │ │ │ +245 KernelFaceIter f_it(faces_begin()), f_end(faces_end()); │ │ │ │ +246 _F_a_c_e_H_a_n_d_l_e fh; │ │ │ │ +247 │ │ │ │ +248 for (; f_it!=f_end; ++f_it) │ │ │ │ +249 { │ │ │ │ +250 fh = handle(*f_it); │ │ │ │ +251 set_halfedge_handle(fh, hh_map[halfedge_handle(fh).idx()]); │ │ │ │ +252 } │ │ │ │ +253 } │ │ │ │ +254 │ │ │ │ +255 const int vertexCount = int(vertices_.size()); │ │ │ │ +256 const int halfedgeCount = int(edges_.size() * 2); │ │ │ │ +257 const int faceCount = int(faces_.size()); │ │ │ │ +258 │ │ │ │ +259 // Update the vertex handles in the vertex handle vector │ │ │ │ +260 typename std_API_Container_VHandlePointer::iterator v_it(vh_to_update.begin │ │ │ │ +()), v_it_end(vh_to_update.end()); │ │ │ │ +261 for(; v_it != v_it_end; ++v_it) │ │ │ │ +262 { │ │ │ │ +263 │ │ │ │ +264 // Only changed vertices need to be considered │ │ │ │ +265 if ( (*v_it)->idx() != vh_map[(*v_it)->idx()].idx() ) { │ │ │ │ +266 *(*v_it) = _V_e_r_t_e_x_H_a_n_d_l_e(vertex_inverse_map[(*v_it)->idx()]); │ │ │ │ +267 │ │ │ │ +268 // Vertices above the vertex count have to be already mapped, or they are │ │ │ │ +invalid now! │ │ │ │ +269 } else if ( ((*v_it)->idx() >= vertexCount) && (vertex_inverse_map.find( │ │ │ │ +(*v_it)->idx()) == vertex_inverse_map.end()) ) { │ │ │ │ +270 (*v_it)->invalidate(); │ │ │ │ +271 } │ │ │ │ +272 │ │ │ │ +273 } │ │ │ │ +274 │ │ │ │ +275 // Update the halfedge handles in the halfedge handle vector │ │ │ │ +276 typename std_API_Container_HHandlePointer::iterator hh_it │ │ │ │ +(hh_to_update.begin()), hh_it_end(hh_to_update.end()); │ │ │ │ +277 for(; hh_it != hh_it_end; ++hh_it) │ │ │ │ +278 { │ │ │ │ +279 // Only changed faces need to be considered │ │ │ │ +280 if ( (*hh_it)->idx() != hh_map[(*hh_it)->idx()].idx() ) { │ │ │ │ +281 *(*hh_it) = _H_a_l_f_e_d_g_e_H_a_n_d_l_e(halfedge_inverse_map[(*hh_it)->idx()]); │ │ │ │ +282 │ │ │ │ +283 // Vertices above the face count have to be already mapped, or they are │ │ │ │ +invalid now! │ │ │ │ +284 } else if ( ((*hh_it)->idx() >= halfedgeCount) && │ │ │ │ +(halfedge_inverse_map.find((*hh_it)->idx()) == halfedge_inverse_map.end()) ) { │ │ │ │ +285 (*hh_it)->invalidate(); │ │ │ │ +286 } │ │ │ │ +287 │ │ │ │ +288 } │ │ │ │ +289 │ │ │ │ +290 // Update the face handles in the face handle vector │ │ │ │ +291 typename std_API_Container_FHandlePointer::iterator fh_it │ │ │ │ +(fh_to_update.begin()), fh_it_end(fh_to_update.end()); │ │ │ │ +292 for(; fh_it != fh_it_end; ++fh_it) │ │ │ │ +293 { │ │ │ │ +294 │ │ │ │ +295 // Only changed faces need to be considered │ │ │ │ +296 if ( (*fh_it)->idx() != fh_map[(*fh_it)->idx()].idx() ) { │ │ │ │ +297 *(*fh_it) = _F_a_c_e_H_a_n_d_l_e(face_inverse_map[(*fh_it)->idx()]); │ │ │ │ +298 │ │ │ │ +299 // Vertices above the face count have to be already mapped, or they are │ │ │ │ +invalid now! │ │ │ │ +300 } else if ( ((*fh_it)->idx() >= faceCount) && (face_inverse_map.find( │ │ │ │ +(*fh_it)->idx()) == face_inverse_map.end()) ) { │ │ │ │ +301 (*fh_it)->invalidate(); │ │ │ │ +302 } │ │ │ │ +303 │ │ │ │ +304 } │ │ │ │ +305} │ │ │ │ +306 │ │ │ │ +307} │ │ │ │ +308 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_B_i_t_s │ │ │ │ -StatusBits │ │ │ │ -Status bits used by the Status class. │ │ │ │ -DDeeffiinniittiioonn Status.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_A_G_G_E_D_2 │ │ │ │ -@ TAGGED2 │ │ │ │ -Alternate bit for tagging an item. │ │ │ │ -DDeeffiinniittiioonn Status.hh:82 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_L_O_C_K_E_D │ │ │ │ -@ LOCKED │ │ │ │ -Item is locked. │ │ │ │ -DDeeffiinniittiioonn Status.hh:77 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_F_I_X_E_D_N_O_N_M_A_N_I_F_O_L_D │ │ │ │ -@ FIXEDNONMANIFOLD │ │ │ │ -Item was non-two-manifold and had to be fixed. │ │ │ │ -DDeeffiinniittiioonn Status.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_D_E_L_E_T_E_D │ │ │ │ -@ DELETED │ │ │ │ -Item has been deleted. │ │ │ │ -DDeeffiinniittiioonn Status.hh:76 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_E_L_E_C_T_E_D │ │ │ │ -@ SELECTED │ │ │ │ -Item is selected. │ │ │ │ -DDeeffiinniittiioonn Status.hh:78 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_U_N_U_S_E_D │ │ │ │ -@ UNUSED │ │ │ │ -Unused. │ │ │ │ -DDeeffiinniittiioonn Status.hh:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_H_I_D_D_E_N │ │ │ │ -@ HIDDEN │ │ │ │ -Item is hidden. │ │ │ │ -DDeeffiinniittiioonn Status.hh:79 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_T_A_G_G_E_D │ │ │ │ -@ TAGGED │ │ │ │ -Item is tagged. │ │ │ │ -DDeeffiinniittiioonn Status.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_F_E_A_T_U_R_E │ │ │ │ -@ FEATURE │ │ │ │ -Item is a feature or belongs to a feature. │ │ │ │ -DDeeffiinniittiioonn Status.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ -Add status information to a base class. │ │ │ │ -DDeeffiinniittiioonn Status.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___f_i_x_e_d___n_o_n_m_a_n_i_f_o_l_d │ │ │ │ -void set_fixed_nonmanifold(bool _b) │ │ │ │ -set fixed non-manifold │ │ │ │ -DDeeffiinniittiioonn Status.hh:147 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___h_i_d_d_e_n │ │ │ │ -void set_hidden(bool _b) │ │ │ │ -set hidden │ │ │ │ -DDeeffiinniittiioonn Status.hh:123 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___v_e_r_t_i_c_e_s │ │ │ │ +size_t n_vertices() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:345 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___e_d_g_e_s │ │ │ │ +size_t n_edges() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:347 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ +Is halfedge _heh a boundary halfedge (is its face handle invalid) ? │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:400 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_s_t_a_t_u_s │ │ │ │ +const StatusInfo & status(VertexHandle _vh) const │ │ │ │ +Status Query API. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:503 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___f_a_c_e_s │ │ │ │ +size_t n_faces() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:348 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_g_a_r_b_a_g_e___c_o_l_l_e_c_t_i_o_n │ │ │ │ +void garbage_collection(bool _v=true, bool _e=true, bool _f=true) │ │ │ │ +garbage collection │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.cc:166 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___h_a_l_f_e_d_g_e_s │ │ │ │ +size_t n_halfedges() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:346 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_e_p_r_o_p_s___s_w_a_p │ │ │ │ +void eprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:737 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_v_p_r_o_p_s___s_w_a_p │ │ │ │ +void vprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:719 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_h_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ +void hprops_resize(size_t _n) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:724 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_h_p_r_o_p_s___s_w_a_p │ │ │ │ +void hprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:728 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_f_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ +void fprops_resize(size_t _n) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:742 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_e_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ +void eprops_resize(size_t _n) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:733 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_f_p_r_o_p_s___s_w_a_p │ │ │ │ +void fprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:746 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_v_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ +void vprops_resize(size_t _n) const │ │ │ │ +Resizes all vertex property vectors to the specified size. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:703 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_d_e_l_e_t_e_d │ │ │ │ bool deleted() const │ │ │ │ is deleted ? │ │ │ │ DDeeffiinniittiioonn Status.hh:103 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___s_e_l_e_c_t_e_d │ │ │ │ -void set_selected(bool _b) │ │ │ │ -set selected │ │ │ │ -DDeeffiinniittiioonn Status.hh:117 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___t_a_g_g_e_d_2 │ │ │ │ -void set_tagged2(bool _b) │ │ │ │ -set tagged │ │ │ │ -DDeeffiinniittiioonn Status.hh:141 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_t_a_g_g_e_d │ │ │ │ -bool tagged() const │ │ │ │ -is tagged ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:133 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_i_s___b_i_t___s_e_t │ │ │ │ -bool is_bit_set(unsigned int _s) const │ │ │ │ -is a certain bit set ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:157 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___b_i_t_s │ │ │ │ -void set_bits(unsigned int _bits) │ │ │ │ -set whole status at once │ │ │ │ -DDeeffiinniittiioonn Status.hh:153 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_l_o_c_k_e_d │ │ │ │ -bool locked() const │ │ │ │ -is locked ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:109 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___l_o_c_k_e_d │ │ │ │ -void set_locked(bool _b) │ │ │ │ -set locked │ │ │ │ -DDeeffiinniittiioonn Status.hh:111 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___d_e_l_e_t_e_d │ │ │ │ -void set_deleted(bool _b) │ │ │ │ -set deleted │ │ │ │ -DDeeffiinniittiioonn Status.hh:105 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___f_e_a_t_u_r_e │ │ │ │ -void set_feature(bool _b) │ │ │ │ -set feature │ │ │ │ -DDeeffiinniittiioonn Status.hh:129 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___b_i_t │ │ │ │ -void set_bit(unsigned int _s) │ │ │ │ -set a certain bit │ │ │ │ -DDeeffiinniittiioonn Status.hh:159 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___t_a_g_g_e_d │ │ │ │ -void set_tagged(bool _b) │ │ │ │ -set tagged │ │ │ │ -DDeeffiinniittiioonn Status.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_c_h_a_n_g_e___b_i_t │ │ │ │ -void change_bit(unsigned int _s, bool _b) │ │ │ │ -set or unset a certain bit │ │ │ │ -DDeeffiinniittiioonn Status.hh:163 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_f_e_a_t_u_r_e │ │ │ │ -bool feature() const │ │ │ │ -is feature ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:127 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_t_a_g_g_e_d_2 │ │ │ │ -bool tagged2() const │ │ │ │ -is tagged2 ? This is just one more tag info. │ │ │ │ -DDeeffiinniittiioonn Status.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_f_i_x_e_d___n_o_n_m_a_n_i_f_o_l_d │ │ │ │ -bool fixed_nonmanifold() const │ │ │ │ -is fixed non-manifold ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:145 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_b_i_t_s │ │ │ │ -unsigned int bits() const │ │ │ │ -return whole status │ │ │ │ -DDeeffiinniittiioonn Status.hh:151 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_l_e_c_t_e_d │ │ │ │ -bool selected() const │ │ │ │ -is selected ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:115 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_u_n_s_e_t___b_i_t │ │ │ │ -void unset_bit(unsigned int _s) │ │ │ │ -unset a certain bit │ │ │ │ -DDeeffiinniittiioonn Status.hh:161 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_h_i_d_d_e_n │ │ │ │ -bool hidden() const │ │ │ │ -is hidden ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:121 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00677_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/PolyMeshT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
PolyMeshT.hh
│ │ │ +
PolyConnectivity_inline_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,597 +136,1945 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS PolyMeshT
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ +
42#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ +
43#error Do not include this directly, include instead PolyConnectivity.hh
│ │ │ +
44#endif // OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ +
45
│ │ │ +
46#include <OpenMesh/Core/Mesh/PolyConnectivity.hh> // To help some IDEs
│ │ │ +
47#include <OpenMesh/Core/Mesh/IteratorsT.hh>
│ │ │ +
48#include <OpenMesh/Core/Mesh/CirculatorsT.hh>
│ │ │ +
49
│ │ │ +
50namespace OpenMesh {
│ │ │
51
│ │ │ -
52#ifndef OPENMESH_POLYMESHT_HH
│ │ │ -
53#define OPENMESH_POLYMESHT_HH
│ │ │ +
52
│ │ │ + │ │ │
54
│ │ │ -
55
│ │ │ -
56//== INCLUDES =================================================================
│ │ │ -
57
│ │ │ -
58
│ │ │ -
59#include <OpenMesh/Core/System/config.h>
│ │ │ -
60#include <OpenMesh/Core/Geometry/MathDefs.hh>
│ │ │ -
61#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ -
62#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>
│ │ │ -
63#include <OpenMesh/Core/Mesh/Tags.hh>
│ │ │ -
64#include <vector>
│ │ │ -
65
│ │ │ -
66
│ │ │ -
67//== NAMESPACES ===============================================================
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
60
│ │ │ +
61inline SmartHalfedgeHandle PolyConnectivity::s_halfedge_handle(SmartEdgeHandle _eh, unsigned int _i) { return make_smart(ArrayKernel::s_halfedge_handle(EdgeHandle(_eh), _i), _eh.mesh()); }
│ │ │ +
62inline SmartEdgeHandle PolyConnectivity::s_edge_handle(SmartHalfedgeHandle _heh) { return make_smart(ArrayKernel::s_edge_handle(HalfedgeHandle(_heh)), _heh.mesh()); }
│ │ │ +
63
│ │ │ +
64inline SmartHalfedgeHandle PolyConnectivity::halfedge_handle(SmartEdgeHandle _eh, unsigned int _i) const { return make_smart(halfedge_handle(EdgeHandle(_eh), _i), *this); }
│ │ │ + │ │ │ + │ │ │ + │ │ │
68
│ │ │ -
69
│ │ │ -
70namespace OpenMesh {
│ │ │ -
71
│ │ │ -
72//== CLASS DEFINITION =========================================================
│ │ │ + │ │ │ +
70
│ │ │ + │ │ │ +
72
│ │ │
73
│ │ │ -
74
│ │ │ -
89template <class Kernel>
│ │ │ -
│ │ │ -
90class PolyMeshT : public Kernel
│ │ │ -
91{
│ │ │ -
92public:
│ │ │ -
93
│ │ │ - │ │ │ -
96 //--- item types ---
│ │ │ -
97
│ │ │ +
75template <typename RangeTraitT>
│ │ │ +
│ │ │ +
76class EntityRange : public SmartRangeT<EntityRange<RangeTraitT>, typename RangeTraitT::ITER_TYPE::SmartHandle> {
│ │ │ +
77 public:
│ │ │ +
78 typedef typename RangeTraitT::ITER_TYPE iterator;
│ │ │ +
79 typedef typename RangeTraitT::ITER_TYPE const_iterator;
│ │ │ +
80
│ │ │ +
81 explicit EntityRange(typename RangeTraitT::CONTAINER_TYPE &container) : container_(container) {}
│ │ │ +
82 typename RangeTraitT::ITER_TYPE begin() const { return RangeTraitT::begin(container_); }
│ │ │ +
83 typename RangeTraitT::ITER_TYPE end() const { return RangeTraitT::end(container_); }
│ │ │ +
84
│ │ │ +
85 private:
│ │ │ +
86 typename RangeTraitT::CONTAINER_TYPE &container_;
│ │ │ +
87};
│ │ │ +
│ │ │ +
88
│ │ │ +
90template <typename CirculatorRangeTraitT>
│ │ │ +
91//class CirculatorRange : public SmartRangeT<CirculatorRange<CirculatorRangeTraitT>, decltype (make_smart(std::declval<typename CirculatorRangeTraitT::TO_ENTITYE_TYPE>(), std::declval<PolyConnectivity>()))>{
│ │ │ +
│ │ │ +
92class CirculatorRange : public SmartRangeT<CirculatorRange<CirculatorRangeTraitT>, typename SmartHandle<typename CirculatorRangeTraitT::TO_ENTITYE_TYPE>::type>{
│ │ │ +
93 public:
│ │ │ +
94 typedef typename CirculatorRangeTraitT::ITER_TYPE ITER_TYPE;
│ │ │ +
95 typedef typename CirculatorRangeTraitT::CENTER_ENTITY_TYPE CENTER_ENTITY_TYPE;
│ │ │ +
96 typedef typename CirculatorRangeTraitT::CONTAINER_TYPE CONTAINER_TYPE;
│ │ │ +
97 typedef ITER_TYPE iterator;
│ │ │ +
98 typedef ITER_TYPE const_iterator;
│ │ │
99
│ │ │ -
100 static constexpr bool is_polymesh() { return true; }
│ │ │ -
101 static constexpr bool is_trimesh() { return false; }
│ │ │ -
102 using ConnectivityTag = PolyConnectivityTag;
│ │ │ -
103 enum { IsPolyMesh = 1 };
│ │ │ -
104 enum { IsTriMesh = 0 };
│ │ │ -
106
│ │ │ + │ │ │ +
101 const CONTAINER_TYPE &container,
│ │ │ +
102 CENTER_ENTITY_TYPE center) :
│ │ │ +
103 container_(container), heh_()
│ │ │ +
104 {
│ │ │ +
105 auto it = CirculatorRangeTraitT::begin(container_, center);
│ │ │ +
106 heh_ = it.heh_;
│ │ │ +
107 }
│ │ │
108
│ │ │ -
109
│ │ │ -
110 typedef typename Kernel::Scalar Scalar;
│ │ │ -
112 typedef typename Kernel::Point Point;
│ │ │ -
114 typedef typename Kernel::Normal Normal;
│ │ │ -
116 typedef typename Kernel::Color Color;
│ │ │ -
118 typedef typename Kernel::TexCoord1D TexCoord1D;
│ │ │ -
120 typedef typename Kernel::TexCoord2D TexCoord2D;
│ │ │ -
122 typedef typename Kernel::TexCoord3D TexCoord3D;
│ │ │ -
124 typedef typename Kernel::Vertex Vertex;
│ │ │ -
126 typedef typename Kernel::Halfedge Halfedge;
│ │ │ -
128 typedef typename Kernel::Edge Edge;
│ │ │ -
130 typedef typename Kernel::Face Face;
│ │ │ -
132
│ │ │ -
133 //--- handle types ---
│ │ │ -
134
│ │ │ -
136 typedef typename Kernel::VertexHandle VertexHandle;
│ │ │ -
137 typedef typename Kernel::HalfedgeHandle HalfedgeHandle;
│ │ │ -
138 typedef typename Kernel::EdgeHandle EdgeHandle;
│ │ │ -
139 typedef typename Kernel::FaceHandle FaceHandle;
│ │ │ + │ │ │ +
110 const CONTAINER_TYPE &container,
│ │ │ +
111 HalfedgeHandle heh, int) :
│ │ │ +
112 container_(container), heh_(heh) {}
│ │ │ +
113
│ │ │ +
114 ITER_TYPE begin() const { return CirculatorRangeTraitT::begin(container_, heh_, 1); }
│ │ │ +
115 ITER_TYPE end() const { return CirculatorRangeTraitT::end(container_, heh_, 1); }
│ │ │ +
116
│ │ │ +
117 private:
│ │ │ +
118 const CONTAINER_TYPE &container_;
│ │ │ +
119 HalfedgeHandle heh_;
│ │ │ +
120};
│ │ │ +
│ │ │ +
121
│ │ │ +
122
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
131
│ │ │ +
132template <> inline PolyConnectivity::ConstVertexRangeSkipping PolyConnectivity::elements<VertexHandle>() const { return vertices(); }
│ │ │ +
133template <> inline PolyConnectivity::ConstVertexRange PolyConnectivity::all_elements<VertexHandle>() const { return all_vertices(); }
│ │ │ +
134template <> inline PolyConnectivity::ConstHalfedgeRangeSkipping PolyConnectivity::elements<HalfedgeHandle>() const { return halfedges(); }
│ │ │ +
135template <> inline PolyConnectivity::ConstHalfedgeRange PolyConnectivity::all_elements<HalfedgeHandle>() const { return all_halfedges(); }
│ │ │ +
136template <> inline PolyConnectivity::ConstEdgeRangeSkipping PolyConnectivity::elements<EdgeHandle>() const { return edges(); }
│ │ │ +
137template <> inline PolyConnectivity::ConstEdgeRange PolyConnectivity::all_elements<EdgeHandle>() const { return all_edges(); }
│ │ │ +
138template <> inline PolyConnectivity::ConstFaceRangeSkipping PolyConnectivity::elements<FaceHandle>() const { return faces(); }
│ │ │ +
139template <> inline PolyConnectivity::ConstFaceRange PolyConnectivity::all_elements<FaceHandle>() const { return all_faces(); }
│ │ │
140
│ │ │
141
│ │ │ -
142
│ │ │ -
143 typedef typename Kernel::VertexIter VertexIter;
│ │ │ -
144 typedef typename Kernel::HalfedgeIter HalfedgeIter;
│ │ │ -
145 typedef typename Kernel::EdgeIter EdgeIter;
│ │ │ -
146 typedef typename Kernel::FaceIter FaceIter;
│ │ │ -
147
│ │ │ -
148 typedef typename Kernel::ConstVertexIter ConstVertexIter;
│ │ │ -
149 typedef typename Kernel::ConstHalfedgeIter ConstHalfedgeIter;
│ │ │ -
150 typedef typename Kernel::ConstEdgeIter ConstEdgeIter;
│ │ │ -
151 typedef typename Kernel::ConstFaceIter ConstFaceIter;
│ │ │ +
│ │ │ + │ │ │ +
143 return ConstVertexVertexRange(*this, _vh);
│ │ │ +
144}
│ │ │ +
│ │ │ +
145
│ │ │ +
│ │ │ + │ │ │ +
147 return ConstVertexIHalfedgeRange(*this, _vh);
│ │ │ +
148}
│ │ │ +
│ │ │ +
149
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
152}
│ │ │ +
│ │ │
153
│ │ │ -
154 //--- circulators ---
│ │ │ -
155
│ │ │ -
162 typedef typename Kernel::VertexVertexIter VertexVertexIter;
│ │ │ -
163 typedef typename Kernel::VertexOHalfedgeIter VertexOHalfedgeIter;
│ │ │ -
164 typedef typename Kernel::VertexIHalfedgeIter VertexIHalfedgeIter;
│ │ │ -
165 typedef typename Kernel::VertexEdgeIter VertexEdgeIter;
│ │ │ -
166 typedef typename Kernel::VertexFaceIter VertexFaceIter;
│ │ │ -
167 typedef typename Kernel::FaceVertexIter FaceVertexIter;
│ │ │ -
168 typedef typename Kernel::FaceHalfedgeIter FaceHalfedgeIter;
│ │ │ -
169 typedef typename Kernel::FaceEdgeIter FaceEdgeIter;
│ │ │ -
170 typedef typename Kernel::FaceFaceIter FaceFaceIter;
│ │ │ -
171
│ │ │ -
172 typedef typename Kernel::ConstVertexVertexIter ConstVertexVertexIter;
│ │ │ -
173 typedef typename Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter;
│ │ │ -
174 typedef typename Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter;
│ │ │ -
175 typedef typename Kernel::ConstVertexEdgeIter ConstVertexEdgeIter;
│ │ │ -
176 typedef typename Kernel::ConstVertexFaceIter ConstVertexFaceIter;
│ │ │ -
177 typedef typename Kernel::ConstFaceVertexIter ConstFaceVertexIter;
│ │ │ -
178 typedef typename Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter;
│ │ │ -
179 typedef typename Kernel::ConstFaceEdgeIter ConstFaceEdgeIter;
│ │ │ -
180 typedef typename Kernel::ConstFaceFaceIter ConstFaceFaceIter;
│ │ │ -
182
│ │ │ -
183
│ │ │ -
184 // --- constructor/destructor
│ │ │ - │ │ │ -
186 template<typename T>
│ │ │ -
187 explicit PolyMeshT(const T& t) : Kernel(t) {}
│ │ │ -
188 virtual ~PolyMeshT() {}
│ │ │ +
│ │ │ + │ │ │ +
155 return ConstVertexOHalfedgeRange(*this, _vh);
│ │ │ +
156}
│ │ │ +
│ │ │ +
157
│ │ │ +
│ │ │ + │ │ │ +
159 return ConstVertexOHalfedgeRange(*this, _heh, 1);
│ │ │ +
160}
│ │ │ +
│ │ │ +
161
│ │ │ +
│ │ │ + │ │ │ +
163 return ConstVertexEdgeRange(*this, _vh);
│ │ │ +
164}
│ │ │ +
│ │ │ +
165
│ │ │ +
│ │ │ + │ │ │ +
167 return ConstVertexFaceRange(*this, _vh);
│ │ │ +
168}
│ │ │ +
│ │ │ +
169
│ │ │ +
│ │ │ + │ │ │ +
171 return ConstFaceVertexRange(*this, _fh);
│ │ │ +
172}
│ │ │ +
│ │ │ +
173
│ │ │ +
│ │ │ + │ │ │ +
175 return ConstFaceHalfedgeRange(*this, _fh);
│ │ │ +
176}
│ │ │ +
│ │ │ +
177
│ │ │ +
│ │ │ + │ │ │ +
179 return ConstFaceEdgeRange(*this, _fh);
│ │ │ +
180}
│ │ │ +
│ │ │ +
181
│ │ │ +
│ │ │ + │ │ │ +
183 return ConstFaceFaceRange(*this, _fh);
│ │ │ +
184}
│ │ │ +
│ │ │ +
185
│ │ │ +
│ │ │ + │ │ │ +
187 return ConstEdgeVertexRange(*this, _eh);
│ │ │ +
188}
│ │ │ +
│ │ │
189
│ │ │ -
194 // --- creation ---
│ │ │ -
195
│ │ │ -
│ │ │ - │ │ │ -
202 { return make_smart(Kernel::new_vertex(), this); }
│ │ │ -
│ │ │ -
203
│ │ │ -
│ │ │ - │ │ │ -
211 {
│ │ │ -
212 VertexHandle vh(Kernel::new_vertex());
│ │ │ -
213 this->set_point(vh, _p);
│ │ │ -
214 return make_smart(vh, this);
│ │ │ -
215 }
│ │ │ -
│ │ │ -
216
│ │ │ -
│ │ │ - │ │ │ -
229 {
│ │ │ -
230 VertexHandle vh(Kernel::new_vertex_dirty());
│ │ │ -
231 this->set_point(vh, _p);
│ │ │ -
232 return make_smart(vh, this);
│ │ │ -
233 }
│ │ │ +
│ │ │ + │ │ │ +
191 return ConstEdgeHalfedgeRange(*this, _eh);
│ │ │ +
192}
│ │ │ +
│ │ │ +
193
│ │ │ +
│ │ │ + │ │ │ +
195 return ConstEdgeHalfedgeRange(*this, _heh, 1);
│ │ │ +
196}
│ │ │ +
│ │ │ +
197
│ │ │ +
│ │ │ + │ │ │ +
199 return ConstEdgeFaceRange(*this, _eh);
│ │ │ +
200}
│ │ │ +
│ │ │ +
201
│ │ │ +
│ │ │ + │ │ │ +
203 return ConstHalfedgeLoopRange(*this, _heh);
│ │ │ +
204}
│ │ │ +
│ │ │ +
205
│ │ │ +
206
│ │ │ +
│ │ │ + │ │ │ +
208 return ConstVertexVertexCWRange(*this, _vh);
│ │ │ +
209}
│ │ │ +
│ │ │ +
210
│ │ │ +
│ │ │ + │ │ │ +
212 return ConstVertexIHalfedgeCWRange(*this, _vh);
│ │ │ +
213}
│ │ │ +
│ │ │ +
214
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
217}
│ │ │ +
│ │ │ +
218
│ │ │ +
│ │ │ + │ │ │ +
220 return ConstVertexOHalfedgeCWRange(*this, _vh);
│ │ │ +
221}
│ │ │ +
│ │ │ +
222
│ │ │ +
│ │ │ + │ │ │ +
224 return ConstVertexOHalfedgeCWRange(*this, _heh, 1);
│ │ │ +
225}
│ │ │ +
│ │ │ +
226
│ │ │ +
│ │ │ + │ │ │ +
228 return ConstVertexEdgeCWRange(*this, _vh);
│ │ │ +
229}
│ │ │ +
│ │ │ +
230
│ │ │ +
│ │ │ + │ │ │ +
232 return ConstVertexFaceCWRange(*this, _vh);
│ │ │ +
233}
│ │ │
│ │ │
234
│ │ │ -
│ │ │ - │ │ │ -
239 { return new_vertex(_p); }
│ │ │ -
│ │ │ -
240
│ │ │ -
│ │ │ - │ │ │ -
243 { return make_smart(new_vertex_dirty(_p), this); }
│ │ │ +
│ │ │ + │ │ │ +
236 return ConstFaceVertexCWRange(*this, _fh);
│ │ │ +
237}
│ │ │ +
│ │ │ +
238
│ │ │ +
│ │ │ + │ │ │ +
240 return ConstFaceHalfedgeCWRange(*this, _fh);
│ │ │ +
241}
│ │ │ +
│ │ │ +
242
│ │ │ +
│ │ │ + │ │ │ +
244 return ConstFaceEdgeCWRange(*this, _fh);
│ │ │ +
245}
│ │ │
│ │ │ -
244
│ │ │ -
245 // --- normal vectors ---
│ │ │
246
│ │ │ +
│ │ │ + │ │ │ +
248 return ConstFaceFaceCWRange(*this, _fh);
│ │ │ +
249}
│ │ │ +
│ │ │
250
│ │ │ -
258 void update_normals();
│ │ │ -
259
│ │ │ +
│ │ │ + │ │ │ +
252 return ConstHalfedgeLoopCWRange(*this, _heh);
│ │ │ +
253}
│ │ │ +
│ │ │ +
254
│ │ │ +
255
│ │ │ +
256
│ │ │ +
│ │ │ + │ │ │ +
258 return ConstVertexVertexCCWRange(*this, _vh);
│ │ │ +
259}
│ │ │ +
│ │ │ +
260
│ │ │
│ │ │ - │ │ │ -
262 { this->set_normal(_fh, calc_face_normal(_fh)); }
│ │ │ + │ │ │ +
262 return ConstVertexIHalfedgeCCWRange(*this, _vh);
│ │ │ +
263}
│ │ │ +
│ │ │ +
264
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
267}
│ │ │ +
│ │ │ +
268
│ │ │ +
│ │ │ + │ │ │ +
270 return ConstVertexOHalfedgeCCWRange(*this, _vh);
│ │ │ +
271}
│ │ │ +
│ │ │ +
272
│ │ │ +
│ │ │ + │ │ │ +
274 return ConstVertexOHalfedgeCCWRange(*this, _heh, 1);
│ │ │ +
275}
│ │ │ +
│ │ │ +
276
│ │ │ +
│ │ │ + │ │ │ +
278 return ConstVertexEdgeCCWRange(*this, _vh);
│ │ │ +
279}
│ │ │
│ │ │ -
263
│ │ │ -
269 void update_face_normals();
│ │ │ -
270
│ │ │ -
272 virtual Normal calc_face_normal(FaceHandle _fh) const;
│ │ │ -
273
│ │ │ -
275 Normal calc_face_normal(const Point& _p0, const Point& _p1,
│ │ │ -
276 const Point& _p2) const;
│ │ │ -
277
│ │ │ -
279 Normal calc_normal(FaceHandle _fh) const;
│ │ │
280
│ │ │ -
│ │ │ -
282 void calc_face_centroid(FaceHandle _fh, Point& _pt) const {
│ │ │ -
283 _pt = calc_face_centroid(_fh);
│ │ │ -
284 }
│ │ │ +
│ │ │ + │ │ │ +
282 return ConstVertexFaceCCWRange(*this, _vh);
│ │ │ +
283}
│ │ │ +
│ │ │ +
284
│ │ │ +
│ │ │ + │ │ │ +
286 return ConstFaceVertexCCWRange(*this, _fh);
│ │ │ +
287}
│ │ │
│ │ │ -
285
│ │ │ - │ │ │
288
│ │ │ -
290 Point calc_centroid(FaceHandle _fh) const;
│ │ │ -
291
│ │ │ -
293 Point calc_centroid(EdgeHandle _eh) const;
│ │ │ -
294
│ │ │ - │ │ │ -
297
│ │ │ - │ │ │ +
│ │ │ + │ │ │ +
290 return ConstFaceHalfedgeCCWRange(*this, _fh);
│ │ │ +
291}
│ │ │ +
│ │ │ +
292
│ │ │ +
│ │ │ + │ │ │ +
294 return ConstFaceEdgeCCWRange(*this, _fh);
│ │ │ +
295}
│ │ │ +
│ │ │ +
296
│ │ │ +
│ │ │ + │ │ │ +
298 return ConstFaceFaceCCWRange(*this, _fh);
│ │ │ +
299}
│ │ │ +
│ │ │
300
│ │ │ -
302 Point calc_centroid(MeshHandle _mh) const;
│ │ │ -
303
│ │ │ -
│ │ │ -
305 void update_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8)
│ │ │ -
306 { this->set_normal(_heh, calc_halfedge_normal(_heh,_feature_angle)); }
│ │ │ +
301
│ │ │ +
│ │ │ + │ │ │ +
303 return ConstHalfedgeLoopCCWRange(*this, _heh);
│ │ │ +
304}
│ │ │
│ │ │ +
305
│ │ │ +
306
│ │ │
307
│ │ │ -
317 void update_halfedge_normals(const double _feature_angle = 0.8);
│ │ │ -
318
│ │ │ -
331 virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle = 0.8) const;
│ │ │ -
332
│ │ │ -
334 Normal calc_normal(HalfedgeHandle, const double _feature_angle = 0.8) const;
│ │ │ -
335
│ │ │ -
338 bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const;
│ │ │ -
339
│ │ │ +
│ │ │ + │ │ │ +
309{ return VertexIter(*this, VertexHandle(0)); }
│ │ │ +
│ │ │ +
310
│ │ │ +
│ │ │ + │ │ │ +
312{ return ConstVertexIter(*this, VertexHandle(0)); }
│ │ │ +
│ │ │ +
313
│ │ │ +
│ │ │ + │ │ │ +
315{ return VertexIter(*this, VertexHandle( int(n_vertices() ) )); }
│ │ │ +
│ │ │ +
316
│ │ │ +
│ │ │ + │ │ │ +
318{ return ConstVertexIter(*this, VertexHandle( int(n_vertices()) )); }
│ │ │ +
│ │ │ +
319
│ │ │ +
│ │ │ + │ │ │ +
321{ return HalfedgeIter(*this, HalfedgeHandle(0)); }
│ │ │ +
│ │ │ +
322
│ │ │ +
│ │ │ + │ │ │ +
324{ return ConstHalfedgeIter(*this, HalfedgeHandle(0)); }
│ │ │ +
│ │ │ +
325
│ │ │ +
│ │ │ + │ │ │ +
327{ return HalfedgeIter(*this, HalfedgeHandle(int(n_halfedges()))); }
│ │ │ +
│ │ │ +
328
│ │ │ +
│ │ │ + │ │ │ +
330{ return ConstHalfedgeIter(*this, HalfedgeHandle(int(n_halfedges()))); }
│ │ │ +
│ │ │ +
331
│ │ │ +
│ │ │ + │ │ │ +
333{ return EdgeIter(*this, EdgeHandle(0)); }
│ │ │ +
│ │ │ +
334
│ │ │ +
│ │ │ + │ │ │ +
336{ return ConstEdgeIter(*this, EdgeHandle(0)); }
│ │ │ +
│ │ │ +
337
│ │ │ +
│ │ │ + │ │ │ +
339{ return EdgeIter(*this, EdgeHandle(int(n_edges()))); }
│ │ │ +
│ │ │ +
340
│ │ │
│ │ │ - │ │ │ -
342 { this->set_normal(_vh, calc_vertex_normal(_vh)); }
│ │ │ + │ │ │ +
342{ return ConstEdgeIter(*this, EdgeHandle(int(n_edges()))); }
│ │ │
│ │ │
343
│ │ │ - │ │ │ -
354
│ │ │ - │ │ │ +
│ │ │ + │ │ │ +
345{ return FaceIter(*this, FaceHandle(0)); }
│ │ │ +
│ │ │ +
346
│ │ │ +
│ │ │ + │ │ │ +
348{ return ConstFaceIter(*this, FaceHandle(0)); }
│ │ │ +
│ │ │ +
349
│ │ │ +
│ │ │ + │ │ │ +
351{ return FaceIter(*this, FaceHandle(int(n_faces()))); }
│ │ │ +
│ │ │ +
352
│ │ │ +
353
│ │ │ +
│ │ │ + │ │ │ +
355{ return ConstFaceIter(*this, FaceHandle(int(n_faces()))); }
│ │ │ +
│ │ │ +
356
│ │ │ +
│ │ │ + │ │ │ +
358{ return VertexIter(*this, VertexHandle(0), true); }
│ │ │ +
│ │ │ +
359
│ │ │ +
│ │ │ + │ │ │ +
361{ return ConstVertexIter(*this, VertexHandle(0), true); }
│ │ │ +
│ │ │ +
362
│ │ │ +
│ │ │ + │ │ │ +
364{ return HalfedgeIter(*this, HalfedgeHandle(0), true); }
│ │ │ +
│ │ │ +
365
│ │ │ +
│ │ │ + │ │ │ +
367{ return ConstHalfedgeIter(*this, HalfedgeHandle(0), true); }
│ │ │ +
│ │ │
368
│ │ │ -
376 void calc_vertex_normal_fast(VertexHandle _vh, Normal& _n) const;
│ │ │ - │ │ │ -
378 void calc_vertex_normal_loop(VertexHandle _vh, Normal& _n) const;
│ │ │ -
379
│ │ │ - │ │ │ -
382
│ │ │ -
384
│ │ │ -
385 // --- Geometry API - still in development ---
│ │ │ +
│ │ │ + │ │ │ +
370{ return EdgeIter(*this, EdgeHandle(0), true); }
│ │ │ +
│ │ │ +
371
│ │ │ +
│ │ │ + │ │ │ +
373{ return ConstEdgeIter(*this, EdgeHandle(0), true); }
│ │ │ +
│ │ │ +
374
│ │ │ +
│ │ │ + │ │ │ +
376{ return FaceIter(*this, FaceHandle(0), true); }
│ │ │ +
│ │ │ +
377
│ │ │ +
│ │ │ + │ │ │ +
379{ return ConstFaceIter(*this, FaceHandle(0), true); }
│ │ │ +
│ │ │ +
380
│ │ │ +
│ │ │ + │ │ │ +
382{ return VertexVertexIter(*this, _vh); }
│ │ │ +
│ │ │ +
383
│ │ │ +
│ │ │ + │ │ │ +
385{ return VertexVertexCWIter(*this, _vh); }
│ │ │ +
│ │ │
386
│ │ │ -
│ │ │ -
389 void calc_edge_vector(EdgeHandle _eh, Normal& _edge_vec) const
│ │ │ -
390 {
│ │ │ -
391 _edge_vec = calc_edge_vector(_eh);
│ │ │ -
392 }
│ │ │ +
│ │ │ + │ │ │ +
388{ return VertexVertexCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
389
│ │ │ +
│ │ │ + │ │ │ +
391{ return VertexIHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
392
│ │ │ +
│ │ │ + │ │ │ +
394{ return VertexIHalfedgeCWIter(*this, _vh); }
│ │ │
│ │ │ -
393
│ │ │ +
395
│ │ │
│ │ │ - │ │ │ -
397 {
│ │ │ -
398 return calc_edge_vector(this->halfedge_handle(_eh,0));
│ │ │ -
399 }
│ │ │ -
│ │ │ -
400
│ │ │ -
│ │ │ -
403 void calc_edge_vector(HalfedgeHandle _heh, Normal& _edge_vec) const
│ │ │ -
404 {
│ │ │ -
405 _edge_vec = calc_edge_vector(_heh);
│ │ │ -
406 }
│ │ │ + │ │ │ +
397{ return VertexIHalfedgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
398
│ │ │ +
│ │ │ + │ │ │ +
400{ return VertexOHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
401
│ │ │ +
│ │ │ + │ │ │ +
403{ return VertexOHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
404
│ │ │ +
│ │ │ + │ │ │ +
406{ return VertexOHalfedgeCCWIter(*this, _vh); }
│ │ │
│ │ │
407
│ │ │ -
│ │ │ - │ │ │ -
411 {
│ │ │ -
412 return this->point(this->to_vertex_handle(_heh)) -
│ │ │ -
413 this->point(this->from_vertex_handle(_heh));
│ │ │ -
414 }
│ │ │ +
│ │ │ + │ │ │ +
409{ return VertexEdgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
410
│ │ │ +
│ │ │ + │ │ │ +
412{ return VertexEdgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
413
│ │ │ +
│ │ │ + │ │ │ +
415{ return VertexEdgeCCWIter(*this, _vh); }
│ │ │
│ │ │ -
415
│ │ │ -
416 // Calculates the length of the edge _eh
│ │ │ +
416
│ │ │
│ │ │ - │ │ │ -
418 { return calc_edge_length(this->halfedge_handle(_eh,0)); }
│ │ │ + │ │ │ +
418{ return VertexFaceIter(*this, _vh); }
│ │ │
│ │ │
419
│ │ │ -
│ │ │ - │ │ │ -
423 { return (Scalar)sqrt(calc_edge_sqr_length(_heh)); }
│ │ │ -
│ │ │ -
424
│ │ │ -
│ │ │ - │ │ │ -
426 { return calc_edge_sqr_length(this->halfedge_handle(_eh,0)); }
│ │ │ -
│ │ │ -
427
│ │ │ -
│ │ │ - │ │ │ -
429 {
│ │ │ -
430 Normal edge_vec;
│ │ │ -
431 calc_edge_vector(_heh, edge_vec);
│ │ │ -
432 return sqrnorm(edge_vec);
│ │ │ -
433 }
│ │ │ +
│ │ │ + │ │ │ +
421{ return VertexFaceCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
422
│ │ │ +
│ │ │ + │ │ │ +
424{ return VertexFaceCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
425
│ │ │ +
│ │ │ + │ │ │ +
427{ return ConstVertexVertexIter(*this, _vh); }
│ │ │ +
│ │ │ +
428
│ │ │ +
│ │ │ + │ │ │ +
430{ return ConstVertexVertexCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
431
│ │ │ +
│ │ │ + │ │ │ +
433{ return ConstVertexVertexCCWIter(*this, _vh); }
│ │ │
│ │ │
434
│ │ │ -
│ │ │ - │ │ │ -
438 {
│ │ │ -
439 VertexHandle vh0 = this->from_vertex_handle(_heh);
│ │ │ -
440 VertexHandle vh1 = this->to_vertex_handle(_heh);
│ │ │ -
441 return 0.5 * (this->point(vh0) + this->point(vh1));
│ │ │ -
442 }
│ │ │ +
│ │ │ + │ │ │ +
436{ return ConstVertexIHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
437
│ │ │ +
│ │ │ + │ │ │ +
439{ return ConstVertexIHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
440
│ │ │ +
│ │ │ + │ │ │ +
442{ return ConstVertexIHalfedgeCCWIter(*this, _vh); }
│ │ │
│ │ │
443
│ │ │ -
│ │ │ - │ │ │ -
447 {
│ │ │ -
448 return calc_edge_midpoint(this->halfedge_handle(_eh, 0));
│ │ │ -
449 }
│ │ │ -
│ │ │ -
450
│ │ │ -
452 Normal calc_normal(EdgeHandle _eh) const;
│ │ │ -
453
│ │ │ -
│ │ │ -
458 void calc_sector_vectors(HalfedgeHandle _in_heh, Normal& _vec0, Normal& _vec1) const
│ │ │ -
459 {
│ │ │ -
460 calc_edge_vector(this->next_halfedge_handle(_in_heh), _vec0);//p2 - p1
│ │ │ -
461 calc_edge_vector(this->opposite_halfedge_handle(_in_heh), _vec1);//p0 - p1
│ │ │ -
462 }
│ │ │ -
│ │ │ -
463
│ │ │ -
│ │ │ - │ │ │ -
470 {
│ │ │ -
471 Normal v0, v1;
│ │ │ -
472 calc_sector_vectors(_in_heh, v0, v1);
│ │ │ -
473 Scalar denom = norm(v0)*norm(v1);
│ │ │ -
474 if ( denom == Scalar(0))
│ │ │ -
475 {
│ │ │ -
476 return 0;
│ │ │ -
477 }
│ │ │ -
478 Scalar cos_a = dot(v0 , v1) / denom;
│ │ │ -
479 if (this->is_boundary(_in_heh))
│ │ │ -
480 {//determine if the boundary sector is concave or convex
│ │ │ -
481 FaceHandle fh(this->face_handle(this->opposite_halfedge_handle(_in_heh)));
│ │ │ -
482 Normal f_n(calc_face_normal(fh));//this normal is (for convex fh) OK
│ │ │ -
483 Scalar sign_a = dot(cross(v0, v1), f_n);
│ │ │ -
484 return angle(cos_a, sign_a);
│ │ │ -
485 }
│ │ │ -
486 else
│ │ │ -
487 {
│ │ │ -
488 return acos(sane_aarg(cos_a));
│ │ │ -
489 }
│ │ │ -
490 }
│ │ │ +
│ │ │ + │ │ │ +
445{ return ConstVertexOHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
446
│ │ │ +
│ │ │ + │ │ │ +
448{ return ConstVertexOHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
449
│ │ │ +
│ │ │ + │ │ │ +
451{ return ConstVertexOHalfedgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
452
│ │ │ +
│ │ │ + │ │ │ +
454{ return ConstVertexEdgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
455
│ │ │ +
│ │ │ + │ │ │ +
457{ return ConstVertexEdgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
458
│ │ │ +
│ │ │ + │ │ │ +
460{ return ConstVertexEdgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
461
│ │ │ +
│ │ │ + │ │ │ +
463{ return ConstVertexFaceIter(*this, _vh); }
│ │ │ +
│ │ │ +
464
│ │ │ +
│ │ │ + │ │ │ +
466{ return ConstVertexFaceCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
467
│ │ │ +
│ │ │ + │ │ │ +
469{ return ConstVertexFaceCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
470
│ │ │ +
│ │ │ + │ │ │ +
472{ return FaceVertexIter(*this, _fh); }
│ │ │ +
│ │ │ +
473
│ │ │ +
│ │ │ + │ │ │ +
475{ return FaceVertexCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
476
│ │ │ +
│ │ │ + │ │ │ +
478{ return FaceVertexCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
479
│ │ │ +
│ │ │ + │ │ │ +
481{ return FaceHalfedgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
482
│ │ │ +
│ │ │ + │ │ │ +
484{ return FaceHalfedgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
485
│ │ │ +
│ │ │ + │ │ │ +
487{ return FaceHalfedgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
488
│ │ │ +
│ │ │ + │ │ │ +
490{ return FaceEdgeIter(*this, _fh); }
│ │ │
│ │ │
491
│ │ │ -
492 // calculate the cos and the sin of angle <(_in_heh,next_halfedge(_in_heh))
│ │ │ -
493 /*
│ │ │ -
494 void calc_sector_angle_cos_sin(HalfedgeHandle _in_heh, Scalar& _cos_a, Scalar& _sin_a) const
│ │ │ -
495 {
│ │ │ -
496 Normal in_vec, out_vec;
│ │ │ -
497 calc_edge_vector(_in_heh, in_vec);
│ │ │ -
498 calc_edge_vector(next_halfedge_handle(_in_heh), out_vec);
│ │ │ -
499 Scalar denom = norm(in_vec)*norm(out_vec);
│ │ │ -
500 if (is_zero(denom))
│ │ │ -
501 {
│ │ │ -
502 _cos_a = 1;
│ │ │ -
503 _sin_a = 0;
│ │ │ -
504 }
│ │ │ -
505 else
│ │ │ -
506 {
│ │ │ -
507 _cos_a = dot(in_vec, out_vec)/denom;
│ │ │ -
508 _sin_a = norm(cross(in_vec, out_vec))/denom;
│ │ │ -
509 }
│ │ │ -
510 }
│ │ │ -
511 */
│ │ │ -
│ │ │ -
514 void calc_sector_normal(HalfedgeHandle _in_heh, Normal& _sector_normal) const
│ │ │ -
515 {
│ │ │ -
516 Normal vec0, vec1;
│ │ │ -
517 calc_sector_vectors(_in_heh, vec0, vec1);
│ │ │ -
518 _sector_normal = cross(vec0, vec1);//(p2-p1)^(p0-p1)
│ │ │ -
519 }
│ │ │ -
│ │ │ -
520
│ │ │ -
│ │ │ - │ │ │ -
525 {
│ │ │ -
526 Normal sector_normal;
│ │ │ -
527 calc_sector_normal(_in_heh, sector_normal);
│ │ │ -
528 return norm(sector_normal)/2;
│ │ │ -
529 }
│ │ │ +
│ │ │ + │ │ │ +
493{ return FaceEdgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
494
│ │ │ +
│ │ │ + │ │ │ +
496{ return FaceEdgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
497
│ │ │ +
│ │ │ + │ │ │ +
499{ return FaceFaceIter(*this, _fh); }
│ │ │ +
│ │ │ +
500
│ │ │ +
│ │ │ + │ │ │ +
502{ return FaceFaceCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
503
│ │ │ +
│ │ │ + │ │ │ +
505{ return FaceFaceCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
506
│ │ │ +
│ │ │ + │ │ │ +
508{ return ConstFaceVertexIter(*this, _fh); }
│ │ │ +
│ │ │ +
509
│ │ │ +
│ │ │ + │ │ │ +
511{ return ConstFaceVertexCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
512
│ │ │ +
│ │ │ + │ │ │ +
514{ return ConstFaceVertexCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
515
│ │ │ +
│ │ │ + │ │ │ +
517{ return ConstFaceHalfedgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
518
│ │ │ +
│ │ │ + │ │ │ +
520{ return ConstFaceHalfedgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
521
│ │ │ +
│ │ │ + │ │ │ +
523{ return ConstFaceHalfedgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
524
│ │ │ +
│ │ │ + │ │ │ +
526{ return ConstFaceEdgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
527
│ │ │ +
│ │ │ + │ │ │ +
529{ return ConstFaceEdgeCWIter(*this, _fh); }
│ │ │
│ │ │
530
│ │ │ -
│ │ │ - │ │ │ -
534 {
│ │ │ -
535 // Make sure that we have face normals on the mesh
│ │ │ -
536 assert(Kernel::has_face_normals());
│ │ │ -
537
│ │ │ -
538 if (this->is_boundary(this->edge_handle(_heh)))
│ │ │ -
539 {//the dihedral angle at a boundary edge is 0
│ │ │ -
540 return 0;
│ │ │ -
541 }
│ │ │ -
542 const Normal& n0 = this->normal(this->face_handle(_heh));
│ │ │ -
543 const Normal& n1 = this->normal(this->face_handle(this->opposite_halfedge_handle(_heh)));
│ │ │ -
544 Normal he;
│ │ │ -
545 calc_edge_vector(_heh, he);
│ │ │ -
546 Scalar da_cos = dot(n0, n1);
│ │ │ -
547 //should be normalized, but we need only the sign
│ │ │ -
548 Scalar da_sin_sign = dot(cross(n0, n1), he);
│ │ │ -
549 return angle(da_cos, da_sin_sign);
│ │ │ -
550 }
│ │ │ +
│ │ │ + │ │ │ +
532{ return ConstFaceEdgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
533
│ │ │ +
│ │ │ + │ │ │ +
535{ return ConstFaceFaceIter(*this, _fh); }
│ │ │ +
│ │ │ +
536
│ │ │ +
│ │ │ + │ │ │ +
538{ return ConstFaceFaceCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
539
│ │ │ +
│ │ │ + │ │ │ +
541{ return ConstFaceFaceCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
542
│ │ │ +
│ │ │ + │ │ │ +
544{ return EdgeVertexIter(*this, _eh); }
│ │ │ +
│ │ │ +
545
│ │ │ +
│ │ │ + │ │ │ +
547{ return EdgeHalfedgeIter(*this, _eh); }
│ │ │ +
│ │ │ +
548
│ │ │ +
│ │ │ + │ │ │ +
550{ return EdgeFaceIter(*this, _eh); }
│ │ │
│ │ │
551
│ │ │ -
│ │ │ - │ │ │ -
555 { return calc_dihedral_angle_fast(this->halfedge_handle(_eh,0)); }
│ │ │ +
│ │ │ + │ │ │ +
553{ return ConstEdgeVertexIter(*this, _eh); }
│ │ │ +
│ │ │ +
554
│ │ │ +
│ │ │ + │ │ │ +
556{ return ConstEdgeHalfedgeIter(*this, _eh); }
│ │ │
│ │ │ -
556
│ │ │ -
557 // calculates the dihedral angle on the halfedge _heh
│ │ │ +
557
│ │ │
│ │ │ - │ │ │ -
559 {
│ │ │ -
560 if (this->is_boundary(this->edge_handle(_heh)))
│ │ │ -
561 {//the dihedral angle at a boundary edge is 0
│ │ │ -
562 return 0;
│ │ │ -
563 }
│ │ │ -
564 Normal n0, n1, he;
│ │ │ -
565 calc_sector_normal(_heh, n0);
│ │ │ -
566 calc_sector_normal(this->opposite_halfedge_handle(_heh), n1);
│ │ │ -
567 calc_edge_vector(_heh, he);
│ │ │ -
568 Scalar denom = norm(n0)*norm(n1);
│ │ │ -
569 if (denom == Scalar(0))
│ │ │ -
570 {
│ │ │ -
571 return 0;
│ │ │ -
572 }
│ │ │ -
573 Scalar da_cos = dot(n0, n1)/denom;
│ │ │ -
574 //should be normalized, but we need only the sign
│ │ │ -
575 Scalar da_sin_sign = dot(cross(n0, n1), he);
│ │ │ -
576 return angle(da_cos, da_sin_sign);
│ │ │ -
577 }
│ │ │ + │ │ │ +
559{ return ConstEdgeFaceIter(*this, _eh); }
│ │ │
│ │ │ -
578
│ │ │ -
579 // calculates the dihedral angle on the edge _eh
│ │ │ +
560
│ │ │ +
561
│ │ │ +
│ │ │ + │ │ │ +
563{ return VertexVertexIter(*this, _vh); }
│ │ │ +
│ │ │ +
564
│ │ │ +
│ │ │ + │ │ │ +
566{ return VertexVertexCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
567
│ │ │ +
│ │ │ + │ │ │ +
569{ return VertexVertexCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
570
│ │ │ +
│ │ │ + │ │ │ +
572{ return VertexIHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
573
│ │ │ +
│ │ │ + │ │ │ +
575{ return VertexIHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
576
│ │ │ +
│ │ │ + │ │ │ +
578{ return VertexIHalfedgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
579
│ │ │
│ │ │ - │ │ │ -
581 { return calc_dihedral_angle(this->halfedge_handle(_eh,0)); }
│ │ │ + │ │ │ +
581{ return VertexOHalfedgeIter(*this, _vh); }
│ │ │
│ │ │
582
│ │ │ -
585 unsigned int find_feature_edges(Scalar _angle_tresh = OpenMesh::deg_to_rad(44.0));
│ │ │ -
586 // --- misc ---
│ │ │ -
587
│ │ │ +
│ │ │ + │ │ │ +
584{ return VertexOHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
585
│ │ │ +
│ │ │ + │ │ │ +
587{ return VertexOHalfedgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
588
│ │ │
│ │ │ -
589 inline void split(FaceHandle _fh, const Point& _p)
│ │ │ -
590 { Kernel::split(_fh, add_vertex(_p)); }
│ │ │ + │ │ │ +
590{ return VertexEdgeIter(*this, _vh); }
│ │ │
│ │ │
591
│ │ │
│ │ │ -
592 inline void split(FaceHandle _fh, VertexHandle _vh)
│ │ │ -
593 { Kernel::split(_fh, _vh); }
│ │ │ + │ │ │ +
593{ return VertexEdgeCWIter(*this, _vh); }
│ │ │
│ │ │
594
│ │ │
│ │ │ -
595 inline void split(EdgeHandle _eh, const Point& _p)
│ │ │ -
596 { Kernel::split_edge(_eh, add_vertex(_p)); }
│ │ │ + │ │ │ +
596{ return VertexEdgeCCWIter(*this, _vh); }
│ │ │
│ │ │
597
│ │ │
│ │ │ -
598 inline void split(EdgeHandle _eh, VertexHandle _vh)
│ │ │ -
599 { Kernel::split_edge(_eh, _vh); }
│ │ │ + │ │ │ +
599{ return VertexFaceIter(*this, _vh); }
│ │ │ +
│ │ │ +
600
│ │ │ +
│ │ │ + │ │ │ +
602{ return VertexFaceCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
603
│ │ │ +
│ │ │ + │ │ │ +
605{ return VertexFaceCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
606
│ │ │ +
607
│ │ │ +
│ │ │ + │ │ │ +
609{ return ConstVertexVertexIter(*this, _vh); }
│ │ │ +
│ │ │ +
610
│ │ │ +
│ │ │ + │ │ │ +
612{ return ConstVertexVertexCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
613
│ │ │ +
│ │ │ + │ │ │ +
615{ return ConstVertexVertexCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
616
│ │ │ +
│ │ │ + │ │ │ +
618{ return ConstVertexIHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
619
│ │ │ +
│ │ │ + │ │ │ +
621{ return ConstVertexIHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
622
│ │ │ +
│ │ │ + │ │ │ +
624{ return ConstVertexIHalfedgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
625
│ │ │ +
│ │ │ + │ │ │ +
627{ return ConstVertexOHalfedgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
628
│ │ │ +
│ │ │ + │ │ │ +
630{ return ConstVertexOHalfedgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
631
│ │ │ +
│ │ │ + │ │ │ +
633{ return ConstVertexOHalfedgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
634
│ │ │ +
│ │ │ + │ │ │ +
636{ return ConstVertexEdgeIter(*this, _vh); }
│ │ │ +
│ │ │ +
637
│ │ │ +
│ │ │ + │ │ │ +
639{ return ConstVertexEdgeCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
640
│ │ │ +
│ │ │ + │ │ │ +
642{ return ConstVertexEdgeCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
643
│ │ │ +
│ │ │ + │ │ │ +
645{ return ConstVertexFaceIter(*this, _vh); }
│ │ │ +
│ │ │ +
646
│ │ │ +
│ │ │ + │ │ │ +
648{ return ConstVertexFaceCWIter(*this, _vh); }
│ │ │
│ │ │ -
600
│ │ │ -
601private:
│ │ │ -
602 struct PointIs3DTag {};
│ │ │ -
603 struct PointIsNot3DTag {};
│ │ │ -
604 Normal calc_face_normal_impl(FaceHandle, PointIs3DTag) const;
│ │ │ -
605 Normal calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const;
│ │ │ -
606 Normal calc_face_normal_impl(const Point&, const Point&, const Point&, PointIs3DTag) const;
│ │ │ -
607 Normal calc_face_normal_impl(const Point&, const Point&, const Point&, PointIsNot3DTag) const;
│ │ │ -
608};
│ │ │ -
│ │ │ -
609
│ │ │ -
635template<typename LHS, typename KERNEL>
│ │ │ -
│ │ │ - │ │ │ -
637 return MeshCast<LHS, PolyMeshT<KERNEL>&>::cast(rhs);
│ │ │ -
638}
│ │ │ -
│ │ │ -
639
│ │ │ -
640template<typename LHS, typename KERNEL>
│ │ │ -
641LHS mesh_cast(PolyMeshT<KERNEL> *rhs) {
│ │ │ -
642 return MeshCast<LHS, PolyMeshT<KERNEL>*>::cast(rhs);
│ │ │ -
643}
│ │ │ -
644
│ │ │ -
645template<typename LHS, typename KERNEL>
│ │ │ -
646const LHS mesh_cast(const PolyMeshT<KERNEL> &rhs) {
│ │ │ -
647 return MeshCast<LHS, const PolyMeshT<KERNEL>&>::cast(rhs);
│ │ │ -
648}
│ │ │
649
│ │ │ -
650template<typename LHS, typename KERNEL>
│ │ │ -
651const LHS mesh_cast(const PolyMeshT<KERNEL> *rhs) {
│ │ │ -
652 return MeshCast<LHS, const PolyMeshT<KERNEL>*>::cast(rhs);
│ │ │ -
653}
│ │ │ -
654
│ │ │ -
655//=============================================================================
│ │ │ -
656} // namespace OpenMesh
│ │ │ -
657//=============================================================================
│ │ │ -
658#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C)
│ │ │ -
659# define OPENMESH_POLYMESH_TEMPLATES
│ │ │ -
660# include "PolyMeshT_impl.hh"
│ │ │ -
661#endif
│ │ │ -
662//=============================================================================
│ │ │ -
663#endif // OPENMESH_POLYMESHT_HH defined
│ │ │ -
664//=============================================================================
│ │ │ +
│ │ │ + │ │ │ +
651{ return ConstVertexFaceCCWIter(*this, _vh); }
│ │ │ +
│ │ │ +
652
│ │ │ +
653
│ │ │ +
│ │ │ + │ │ │ +
655{ return FaceVertexIter(*this, _fh); }
│ │ │ +
│ │ │ +
656
│ │ │ +
│ │ │ + │ │ │ +
658{ return FaceVertexCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
659
│ │ │ +
│ │ │ + │ │ │ +
661{ return FaceVertexCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
662
│ │ │ +
│ │ │ + │ │ │ +
664{ return FaceHalfedgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
665
│ │ │ +
│ │ │ + │ │ │ +
667{ return FaceHalfedgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
668
│ │ │ +
│ │ │ + │ │ │ +
670{ return FaceHalfedgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
671
│ │ │ +
│ │ │ + │ │ │ +
673{ return FaceEdgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
674
│ │ │ +
│ │ │ + │ │ │ +
676{ return FaceEdgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
677
│ │ │ +
│ │ │ + │ │ │ +
679{ return FaceEdgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
680
│ │ │ +
│ │ │ + │ │ │ +
682{ return FaceFaceIter(*this, _fh); }
│ │ │ +
│ │ │ +
683
│ │ │ +
│ │ │ + │ │ │ +
685{ return FaceFaceCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
686
│ │ │ +
│ │ │ + │ │ │ +
688{ return FaceFaceCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
689
│ │ │ +
│ │ │ + │ │ │ +
691{ return HalfedgeLoopIter(*this, _heh); }
│ │ │ +
│ │ │ +
692
│ │ │ +
│ │ │ + │ │ │ +
694{ return HalfedgeLoopCWIter(*this, _heh); }
│ │ │ +
│ │ │ +
695
│ │ │ +
│ │ │ + │ │ │ +
697{ return HalfedgeLoopCCWIter(*this, _heh); }
│ │ │ +
│ │ │ +
698
│ │ │ +
699
│ │ │ +
│ │ │ + │ │ │ +
701{ return ConstFaceVertexIter(*this, _fh); }
│ │ │ +
│ │ │ +
702
│ │ │ +
│ │ │ + │ │ │ +
704{ return ConstFaceVertexCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
705
│ │ │ +
│ │ │ + │ │ │ +
707{ return ConstFaceVertexCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
708
│ │ │ +
│ │ │ + │ │ │ +
710{ return ConstFaceHalfedgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
711
│ │ │ +
│ │ │ + │ │ │ +
713{ return ConstFaceHalfedgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
714
│ │ │ +
│ │ │ + │ │ │ +
716{ return ConstFaceHalfedgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
717
│ │ │ +
│ │ │ + │ │ │ +
719{ return ConstFaceEdgeIter(*this, _fh); }
│ │ │ +
│ │ │ +
720
│ │ │ +
│ │ │ + │ │ │ +
722{ return ConstFaceEdgeCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
723
│ │ │ +
│ │ │ + │ │ │ +
725{ return ConstFaceEdgeCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
726
│ │ │ +
│ │ │ + │ │ │ +
728{ return ConstFaceFaceIter(*this, _fh); }
│ │ │ +
│ │ │ +
729
│ │ │ +
│ │ │ + │ │ │ +
731{ return ConstFaceFaceCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
732
│ │ │ +
│ │ │ + │ │ │ +
734{ return ConstFaceFaceCCWIter(*this, _fh); }
│ │ │ +
│ │ │ +
735
│ │ │ +
│ │ │ + │ │ │ +
737{ return ConstHalfedgeLoopIter(*this, _heh); }
│ │ │ +
│ │ │ +
738
│ │ │ +
│ │ │ + │ │ │ +
740{ return ConstHalfedgeLoopCWIter(*this, _heh); }
│ │ │ +
│ │ │ +
741
│ │ │ +
│ │ │ + │ │ │ +
743{ return ConstHalfedgeLoopCCWIter(*this, _heh); }
│ │ │ +
│ │ │ +
744
│ │ │ +
745
│ │ │ +
│ │ │ + │ │ │ +
747{ return EdgeVertexIter(*this, _eh); }
│ │ │ +
│ │ │ +
748
│ │ │ +
│ │ │ + │ │ │ +
750{ return EdgeHalfedgeIter(*this, _eh); }
│ │ │ +
│ │ │ +
751
│ │ │ +
│ │ │ + │ │ │ +
753{ return EdgeFaceIter(*this, _eh); }
│ │ │ +
│ │ │ +
754
│ │ │ +
755
│ │ │ +
│ │ │ + │ │ │ +
757{ return ConstEdgeVertexIter(*this, _eh); }
│ │ │ +
│ │ │ +
758
│ │ │ +
│ │ │ + │ │ │ +
760{ return ConstEdgeHalfedgeIter(*this, _eh); }
│ │ │ +
│ │ │ +
761
│ │ │ +
│ │ │ + │ │ │ +
763{ return ConstEdgeFaceIter(*this, _eh); }
│ │ │ +
│ │ │ +
764
│ │ │ +
765
│ │ │ +
766// 'end' circulators
│ │ │ +
767
│ │ │ +
│ │ │ + │ │ │ +
769{ return VertexVertexIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
770
│ │ │ +
│ │ │ + │ │ │ +
772{ return VertexVertexCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
773
│ │ │ +
│ │ │ + │ │ │ +
775{ return VertexVertexCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
776
│ │ │ +
│ │ │ + │ │ │ +
778{ return VertexIHalfedgeIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
779
│ │ │ +
│ │ │ + │ │ │ +
781{ return VertexIHalfedgeCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
782
│ │ │ +
│ │ │ + │ │ │ +
784{ return VertexIHalfedgeCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
785
│ │ │ +
│ │ │ + │ │ │ +
787{ return VertexOHalfedgeIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
788
│ │ │ +
│ │ │ + │ │ │ +
790{ return VertexOHalfedgeCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
791
│ │ │ +
│ │ │ + │ │ │ +
793{ return VertexOHalfedgeCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
794
│ │ │ +
│ │ │ + │ │ │ +
796{ return VertexEdgeIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
797
│ │ │ +
│ │ │ + │ │ │ +
799{ return VertexEdgeCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
800
│ │ │ +
│ │ │ + │ │ │ +
802{ return VertexEdgeCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
803
│ │ │ +
│ │ │ + │ │ │ +
805{ return VertexFaceIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
806
│ │ │ +
│ │ │ + │ │ │ +
808{ return VertexFaceCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
809
│ │ │ +
│ │ │ + │ │ │ +
811{ return VertexFaceCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
812
│ │ │ +
813
│ │ │ +
│ │ │ + │ │ │ +
815{ return ConstVertexVertexIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
816
│ │ │ +
│ │ │ + │ │ │ +
818{ return ConstVertexVertexCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
819
│ │ │ +
│ │ │ + │ │ │ +
821{ return ConstVertexVertexCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
822
│ │ │ +
│ │ │ + │ │ │ +
824{ return ConstVertexIHalfedgeIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
825
│ │ │ +
│ │ │ + │ │ │ +
827{ return ConstVertexIHalfedgeCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
828
│ │ │ +
│ │ │ + │ │ │ +
830{ return ConstVertexIHalfedgeCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
831
│ │ │ +
│ │ │ + │ │ │ +
833{ return ConstVertexOHalfedgeIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
834
│ │ │ +
│ │ │ + │ │ │ +
836{ return ConstVertexOHalfedgeCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
837
│ │ │ +
│ │ │ + │ │ │ +
839{ return ConstVertexOHalfedgeCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
840
│ │ │ +
│ │ │ + │ │ │ +
842{ return ConstVertexEdgeIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
843
│ │ │ +
│ │ │ + │ │ │ +
845{ return ConstVertexEdgeCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
846
│ │ │ +
│ │ │ + │ │ │ +
848{ return ConstVertexEdgeCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
849
│ │ │ +
│ │ │ + │ │ │ +
851{ return ConstVertexFaceIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
852
│ │ │ +
│ │ │ + │ │ │ +
854{ return ConstVertexFaceCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
855
│ │ │ +
│ │ │ + │ │ │ +
857{ return ConstVertexFaceCCWIter(*this, _vh, true); }
│ │ │ +
│ │ │ +
858
│ │ │ +
859
│ │ │ +
│ │ │ + │ │ │ +
861{ return FaceVertexIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
862
│ │ │ +
│ │ │ + │ │ │ +
864{ return FaceVertexCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
865
│ │ │ +
│ │ │ + │ │ │ +
867{ return FaceVertexCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
868
│ │ │ +
│ │ │ + │ │ │ +
870{ return FaceHalfedgeIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
871
│ │ │ +
│ │ │ + │ │ │ +
873{ return FaceHalfedgeCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
874
│ │ │ +
│ │ │ + │ │ │ +
876{ return FaceHalfedgeCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
877
│ │ │ +
│ │ │ + │ │ │ +
879{ return FaceEdgeIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
880
│ │ │ +
│ │ │ + │ │ │ +
882{ return FaceEdgeCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
883
│ │ │ +
│ │ │ + │ │ │ +
885{ return FaceEdgeCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
886
│ │ │ +
│ │ │ + │ │ │ +
888{ return FaceFaceIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
889
│ │ │ +
│ │ │ + │ │ │ +
891{ return FaceFaceCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
892
│ │ │ +
│ │ │ + │ │ │ +
894{ return FaceFaceCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
895
│ │ │ +
│ │ │ + │ │ │ +
897{ return HalfedgeLoopIter(*this, _heh, true); }
│ │ │ +
│ │ │ +
898
│ │ │ +
│ │ │ + │ │ │ +
900{ return HalfedgeLoopCWIter(*this, _heh, true); }
│ │ │ +
│ │ │ +
901
│ │ │ +
│ │ │ + │ │ │ +
903{ return HalfedgeLoopCCWIter(*this, _heh, true); }
│ │ │ +
│ │ │ +
904
│ │ │ +
905
│ │ │ +
│ │ │ + │ │ │ +
907{ return ConstFaceVertexIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
908
│ │ │ +
│ │ │ + │ │ │ +
910{ return ConstFaceVertexCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
911
│ │ │ +
│ │ │ + │ │ │ +
913{ return ConstFaceVertexCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
914
│ │ │ +
│ │ │ + │ │ │ +
916{ return ConstFaceHalfedgeIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
917
│ │ │ +
│ │ │ + │ │ │ +
919{ return ConstFaceHalfedgeCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
920
│ │ │ +
│ │ │ + │ │ │ +
922{ return ConstFaceHalfedgeCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
923
│ │ │ +
│ │ │ + │ │ │ +
925{ return ConstFaceEdgeIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
926
│ │ │ +
│ │ │ + │ │ │ +
928{ return ConstFaceEdgeCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
929
│ │ │ +
│ │ │ + │ │ │ +
931{ return ConstFaceEdgeCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
932
│ │ │ +
│ │ │ + │ │ │ +
934{ return ConstFaceFaceIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
935
│ │ │ +
│ │ │ + │ │ │ +
937{ return ConstFaceFaceCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
938
│ │ │ +
│ │ │ + │ │ │ +
940{ return ConstFaceFaceCCWIter(*this, _fh, true); }
│ │ │ +
│ │ │ +
941
│ │ │ +
│ │ │ + │ │ │ +
943{ return ConstHalfedgeLoopIter(*this, _heh, true); }
│ │ │ +
│ │ │ +
944
│ │ │ +
│ │ │ + │ │ │ +
946{ return ConstHalfedgeLoopCWIter(*this, _heh, true); }
│ │ │ +
│ │ │ +
947
│ │ │ +
│ │ │ + │ │ │ +
949{ return ConstHalfedgeLoopCCWIter(*this, _heh, true); }
│ │ │ +
│ │ │ +
950
│ │ │ +
951
│ │ │ +
│ │ │ + │ │ │ +
953{ return EdgeVertexIter(*this, _eh, true); }
│ │ │ +
│ │ │ +
954
│ │ │ +
│ │ │ + │ │ │ +
956{ return EdgeHalfedgeIter(*this, _eh, true); }
│ │ │ +
│ │ │ +
957
│ │ │ +
│ │ │ + │ │ │ +
959{ return EdgeFaceIter(*this, _eh, true); }
│ │ │ +
│ │ │ +
960
│ │ │ +
961
│ │ │ +
│ │ │ + │ │ │ +
963{ return ConstEdgeVertexIter(*this, _eh, true); }
│ │ │ +
│ │ │ +
964
│ │ │ +
│ │ │ + │ │ │ +
966{ return ConstEdgeHalfedgeIter(*this, _eh, true); }
│ │ │ +
│ │ │ +
967
│ │ │ +
│ │ │ + │ │ │ +
969{ return ConstEdgeFaceIter(*this, _eh, true); }
│ │ │ +
│ │ │ +
970
│ │ │ +
971
│ │ │ +
972inline PolyConnectivity::ConstVertexFaceRange SmartVertexHandle::faces() const { assert(mesh() != nullptr); return mesh()->vf_range (*this); }
│ │ │ +
973inline PolyConnectivity::ConstVertexFaceCWRange SmartVertexHandle::faces_cw() const { assert(mesh() != nullptr); return mesh()->vf_cw_range (*this); }
│ │ │ +
974inline PolyConnectivity::ConstVertexFaceCCWRange SmartVertexHandle::faces_ccw() const { assert(mesh() != nullptr); return mesh()->vf_ccw_range(*this); }
│ │ │ +
975
│ │ │ +
976inline PolyConnectivity::ConstVertexEdgeRange SmartVertexHandle::edges() const { assert(mesh() != nullptr); return mesh()->ve_range (*this); }
│ │ │ +
977inline PolyConnectivity::ConstVertexEdgeCWRange SmartVertexHandle::edges_cw() const { assert(mesh() != nullptr); return mesh()->ve_cw_range (*this); }
│ │ │ +
978inline PolyConnectivity::ConstVertexEdgeCCWRange SmartVertexHandle::edges_ccw() const { assert(mesh() != nullptr); return mesh()->ve_ccw_range(*this); }
│ │ │ +
979
│ │ │ +
980inline PolyConnectivity::ConstVertexVertexRange SmartVertexHandle::vertices() const { assert(mesh() != nullptr); return mesh()->vv_range (*this); }
│ │ │ +
981inline PolyConnectivity::ConstVertexVertexCWRange SmartVertexHandle::vertices_cw() const { assert(mesh() != nullptr); return mesh()->vv_cw_range (*this); }
│ │ │ + │ │ │ +
983
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
987
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
991
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
995
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
999
│ │ │ +
1000
│ │ │ +
1001inline PolyConnectivity::ConstHalfedgeLoopRange SmartHalfedgeHandle::loop() const { assert(mesh() != nullptr); return mesh()->hl_range (*this); }
│ │ │ +
1002inline PolyConnectivity::ConstHalfedgeLoopCWRange SmartHalfedgeHandle::loop_cw() const { assert(mesh() != nullptr); return mesh()->hl_cw_range (*this); }
│ │ │ + │ │ │ +
1004
│ │ │ +
1005
│ │ │ +
1006inline PolyConnectivity::ConstFaceVertexRange SmartFaceHandle::vertices() const { assert(mesh() != nullptr); return mesh()->fv_range (*this); }
│ │ │ +
1007inline PolyConnectivity::ConstFaceVertexCWRange SmartFaceHandle::vertices_cw() const { assert(mesh() != nullptr); return mesh()->fv_cw_range (*this); }
│ │ │ + │ │ │ +
1009
│ │ │ +
1010inline PolyConnectivity::ConstFaceHalfedgeRange SmartFaceHandle::halfedges() const { assert(mesh() != nullptr); return mesh()->fh_range (*this); }
│ │ │ +
1011inline PolyConnectivity::ConstFaceHalfedgeCWRange SmartFaceHandle::halfedges_cw() const { assert(mesh() != nullptr); return mesh()->fh_cw_range (*this); }
│ │ │ + │ │ │ +
1013
│ │ │ +
1014inline PolyConnectivity::ConstFaceEdgeRange SmartFaceHandle::edges() const { assert(mesh() != nullptr); return mesh()->fe_range (*this); }
│ │ │ +
1015inline PolyConnectivity::ConstFaceEdgeCWRange SmartFaceHandle::edges_cw() const { assert(mesh() != nullptr); return mesh()->fe_cw_range (*this); }
│ │ │ +
1016inline PolyConnectivity::ConstFaceEdgeCCWRange SmartFaceHandle::edges_ccw() const { assert(mesh() != nullptr); return mesh()->fe_ccw_range(*this); }
│ │ │ +
1017
│ │ │ +
1018inline PolyConnectivity::ConstFaceFaceRange SmartFaceHandle::faces() const { assert(mesh() != nullptr); return mesh()->ff_range (*this); }
│ │ │ +
1019inline PolyConnectivity::ConstFaceFaceCWRange SmartFaceHandle::faces_cw() const { assert(mesh() != nullptr); return mesh()->ff_cw_range (*this); }
│ │ │ +
1020inline PolyConnectivity::ConstFaceFaceCCWRange SmartFaceHandle::faces_ccw() const { assert(mesh() != nullptr); return mesh()->ff_ccw_range(*this); }
│ │ │ +
1021
│ │ │ +
1022
│ │ │ +
1023inline PolyConnectivity::ConstEdgeVertexRange SmartEdgeHandle::vertices() const { assert(mesh() != nullptr); return mesh()->ev_range (*this); }
│ │ │ +
1024
│ │ │ +
1025inline PolyConnectivity::ConstEdgeHalfedgeRange SmartEdgeHandle::halfedges() const { assert(mesh() != nullptr); return mesh()->eh_range (*this); }
│ │ │ +
1026
│ │ │ +
1027inline PolyConnectivity::ConstEdgeHalfedgeRange SmartEdgeHandle::halfedges(HalfedgeHandle _heh) const { assert(mesh() != nullptr); return mesh()->eh_range (_heh); }
│ │ │ +
1028
│ │ │ +
1029inline PolyConnectivity::ConstEdgeFaceRange SmartEdgeHandle::faces() const { assert(mesh() != nullptr); return mesh()->ef_range (*this); }
│ │ │ +
1030
│ │ │ +
1031}//namespace OpenMesh
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ -
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ -
T angle(T _cos_angle, T _sin_angle)
returns the angle determined by its cos and the sign of its sin result is positive if the angle is in...
Definition MathDefs.hh:140
│ │ │ -
LHS mesh_cast(PolyMeshT< KERNEL > &rhs)
Cast a mesh with different but identical traits into each other.
Definition PolyMeshT.hh:636
│ │ │ -
T sane_aarg(T _aarg)
Trigonometry/angles - related.
Definition MathDefs.hh:122
│ │ │ -
Cast a mesh with different but identical traits into each other.
Definition FinalMeshItemsT.hh:178
│ │ │ +
size_t n_vertices() const override
You should not use this function directly.
Definition ArrayKernel.hh:345
│ │ │ +
size_t n_edges() const override
You should not use this function directly.
Definition ArrayKernel.hh:347
│ │ │ +
VertexHandle new_vertex()
Add a new vertex.
Definition ArrayKernel.hh:216
│ │ │ +
size_t n_faces() const override
You should not use this function directly.
Definition ArrayKernel.hh:348
│ │ │ +
size_t n_halfedges() const override
You should not use this function directly.
Definition ArrayKernel.hh:346
│ │ │ +
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ +
Definition CirculatorsT.hh:305
│ │ │ + │ │ │
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │
Handle for a edge entity.
Definition Handles.hh:135
│ │ │
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │ -
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ -
Kernel::Vertex Vertex
Vertex type.
Definition PolyMeshT.hh:124
│ │ │ -
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition PolyMeshT.hh:169
│ │ │ -
void calc_face_centroid(FaceHandle _fh, Point &_pt) const
calculates the average of the vertices defining _fh
Definition PolyMeshT.hh:282
│ │ │ -
Kernel::ConstFaceIter ConstFaceIter
Scalar type.
Definition PolyMeshT.hh:151
│ │ │ -
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ -
Kernel::ConstVertexVertexIter ConstVertexVertexIter
Circulator.
Definition PolyMeshT.hh:172
│ │ │ -
void calc_edge_vector(HalfedgeHandle _heh, Normal &_edge_vec) const
Calculates the edge vector as the difference of the the points defined by to_vertex_handle() and from...
Definition PolyMeshT.hh:403
│ │ │ -
SmartVertexHandle new_vertex(const Point _p)
Adds a new vertex initialized to a custom position.
Definition PolyMeshT.hh:210
│ │ │ -
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:178
│ │ │ -
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ -
Kernel::VertexFaceIter VertexFaceIter
Circulator.
Definition PolyMeshT.hh:166
│ │ │ -
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition PolyMeshT.hh:177
│ │ │ -
Kernel::Halfedge Halfedge
Halfedge type.
Definition PolyMeshT.hh:126
│ │ │ -
void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const
Different methods for calculation of the normal at _vh:
Definition PolyMeshT_impl.hh:497
│ │ │ -
void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:507
│ │ │ -
PolyMeshT()
Circulator.
Definition PolyMeshT.hh:185
│ │ │ -
Scalar calc_dihedral_angle(EdgeHandle _eh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:580
│ │ │ -
static constexpr bool is_polymesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition PolyMeshT.hh:100
│ │ │ -
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │ -
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ -
Kernel::FaceVertexIter FaceVertexIter
Circulator.
Definition PolyMeshT.hh:167
│ │ │ -
Point calc_edge_midpoint(EdgeHandle _eh) const
Calculates the midpoint of the edge _eh, defined by the positions of the two incident vertices.
Definition PolyMeshT.hh:446
│ │ │ -
SmartVertexHandle new_vertex()
Uses default copy and assignment operator.
Definition PolyMeshT.hh:201
│ │ │ -
Kernel::VertexIHalfedgeIter VertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:164
│ │ │ -
void split(FaceHandle _fh, VertexHandle _vh)
Compute normals for all primitives.
Definition PolyMeshT.hh:592
│ │ │ -
PolyMeshT(const T &t)
Circulator.
Definition PolyMeshT.hh:187
│ │ │ -
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition PolyMeshT.hh:120
│ │ │ -
Scalar calc_sector_area(HalfedgeHandle _in_heh) const
calculates the area of the face sector defined by the angle <(_in_heh,next_halfedge(_in_heh)) NOTE: s...
Definition PolyMeshT.hh:524
│ │ │ -
void update_face_normals()
Update normal vectors for all faces.
Definition PolyMeshT_impl.hh:335
│ │ │ -
void update_halfedge_normals(const double _feature_angle=0.8)
Update normal vectors for all halfedges.
Definition PolyMeshT_impl.hh:350
│ │ │ -
unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0))
tags an edge as a feature if its dihedral angle is larger than _angle_tresh returns the number of the...
Definition PolyMeshT_impl.hh:74
│ │ │ -
virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) const
Calculate halfedge normal for one specific halfedge.
Definition PolyMeshT_impl.hh:365
│ │ │ -
Scalar calc_sector_angle(HalfedgeHandle _in_heh) const
calculates the sector angle.
Definition PolyMeshT.hh:469
│ │ │ -
Kernel::ConstFaceEdgeIter ConstFaceEdgeIter
Circulator.
Definition PolyMeshT.hh:179
│ │ │ -
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition PolyMeshT.hh:122
│ │ │ -
void update_normals()
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:317
│ │ │ -
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition PolyMeshT.hh:176
│ │ │ -
Kernel::VertexOHalfedgeIter VertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:163
│ │ │ -
Point calc_centroid(FaceHandle _fh) const
Computes and returns the average of the vertices defining _fh (same as calc_face_centroid)
Definition PolyMeshT_impl.hh:267
│ │ │ -
Kernel::VertexEdgeIter VertexEdgeIter
Circulator.
Definition PolyMeshT.hh:165
│ │ │ -
Scalar calc_dihedral_angle(HalfedgeHandle _heh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:558
│ │ │ -
Kernel::Face Face
Face type.
Definition PolyMeshT.hh:130
│ │ │ -
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:174
│ │ │ -
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition PolyMeshT_impl.hh:97
│ │ │ -
Scalar calc_edge_length(EdgeHandle _eh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:417
│ │ │ -
Kernel::ConstHalfedgeIter ConstHalfedgeIter
Scalar type.
Definition PolyMeshT.hh:149
│ │ │ -
void update_normal(VertexHandle _vh)
Update normal for vertex _vh.
Definition PolyMeshT.hh:341
│ │ │ -
void calc_sector_vectors(HalfedgeHandle _in_heh, Normal &_vec0, Normal &_vec1) const
defines a consistent representation of a sector geometry: the halfedge _in_heh defines the sector ori...
Definition PolyMeshT.hh:458
│ │ │ -
SmartVertexHandle add_vertex_dirty(const Point _p)
Alias for new_vertex_dirty().
Definition PolyMeshT.hh:242
│ │ │ -
Kernel::FaceFaceIter FaceFaceIter
Circulator.
Definition PolyMeshT.hh:170
│ │ │ -
bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
identifies feature edges w.r.t.
Definition PolyMeshT_impl.hh:452
│ │ │ -
Normal calc_edge_vector(EdgeHandle _eh) const
Calculates the edge vector as the vector defined by the halfedge with id #0 (see below)
Definition PolyMeshT.hh:396
│ │ │ -
virtual ~PolyMeshT()
Circulator.
Definition PolyMeshT.hh:188
│ │ │ -
Kernel::ConstVertexEdgeIter ConstVertexEdgeIter
Circulator.
Definition PolyMeshT.hh:175
│ │ │ -
Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:428
│ │ │ -
SmartVertexHandle add_vertex(const Point _p)
Alias for new_vertex(const Point&).
Definition PolyMeshT.hh:238
│ │ │ -
void calc_edge_vector(EdgeHandle _eh, Normal &_edge_vec) const
Calculates the edge vector as the vector defined by the halfedge with id #0 (see below)
Definition PolyMeshT.hh:389
│ │ │ -
Kernel::Edge Edge
Edge type.
Definition PolyMeshT.hh:128
│ │ │ -
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ -
void update_normal(FaceHandle _fh)
Update normal for face _fh.
Definition PolyMeshT.hh:261
│ │ │ -
Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const
calculates the dihedral angle on the edge _eh
Definition PolyMeshT.hh:554
│ │ │ -
void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:538
│ │ │ -
void split(EdgeHandle _eh, const Point &_p)
Compute normals for all primitives.
Definition PolyMeshT.hh:595
│ │ │ -
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ -
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ -
void update_normal(HalfedgeHandle _heh, const double _feature_angle=0.8)
Update normal for halfedge _heh.
Definition PolyMeshT.hh:305
│ │ │ -
Kernel::ConstEdgeIter ConstEdgeIter
Scalar type.
Definition PolyMeshT.hh:150
│ │ │ -
Kernel::ConstVertexIter ConstVertexIter
Scalar type.
Definition PolyMeshT.hh:148
│ │ │ -
void update_vertex_normals()
Update normal vectors for all vertices.
Definition PolyMeshT_impl.hh:572
│ │ │ -
void calc_sector_normal(HalfedgeHandle _in_heh, Normal &_sector_normal) const
calculates the normal (non-normalized) of the face sector defined by the angle <(_in_heh,...
Definition PolyMeshT.hh:514
│ │ │ -
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:173
│ │ │ -
Normal calc_edge_vector(HalfedgeHandle _heh) const
Calculates the edge vector as the difference of the the points defined by to_vertex_handle() and from...
Definition PolyMeshT.hh:410
│ │ │ -
Scalar calc_edge_sqr_length(EdgeHandle _eh) const
Compute normals for all primitives.
Definition PolyMeshT.hh:425
│ │ │ -
Point calc_edge_midpoint(HalfedgeHandle _heh) const
Calculates the midpoint of the halfedge _heh, defined by the positions of the two incident vertices.
Definition PolyMeshT.hh:437
│ │ │ -
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition PolyMeshT.hh:162
│ │ │ -
void split(EdgeHandle _eh, VertexHandle _vh)
Compute normals for all primitives.
Definition PolyMeshT.hh:598
│ │ │ -
Kernel::HalfedgeIter HalfedgeIter
Scalar type.
Definition PolyMeshT.hh:144
│ │ │ -
Scalar calc_edge_length(HalfedgeHandle _heh) const
Calculates the length of the edge _heh.
Definition PolyMeshT.hh:422
│ │ │ -
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:168
│ │ │ -
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ -
PolyMeshT< Kernel > This
Self type. Used to specify iterators/circulators.
Definition PolyMeshT.hh:95
│ │ │ -
Kernel::ConstFaceFaceIter ConstFaceFaceIter
Circulator.
Definition PolyMeshT.hh:180
│ │ │ -
void split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-n split)
Definition PolyMeshT.hh:589
│ │ │ -
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │ -
Kernel::TexCoord1D TexCoord1D
TexCoord1D type.
Definition PolyMeshT.hh:118
│ │ │ -
Normal calc_normal(FaceHandle _fh) const
same as calc_face_normal
Definition PolyMeshT_impl.hh:187
│ │ │ -
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ -
SmartVertexHandle new_vertex_dirty(const Point _p)
Same as new_vertex(const Point&) but never shrinks, only enlarges the vertex property vectors.
Definition PolyMeshT.hh:228
│ │ │ -
Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const
calculates the dihedral angle on the halfedge _heh
Definition PolyMeshT.hh:533
│ │ │ -
Normal calc_vertex_normal(VertexHandle _vh) const
Calculate vertex normal for one specific vertex.
Definition PolyMeshT_impl.hh:483
│ │ │ +
Definition IteratorsT.hh:82
│ │ │ +
Generic class for vertex/halfedge/edge/face ranges.
Definition PolyConnectivity_inline_impl.hh:76
│ │ │ +
ConstFaceHalfedgeCWRange fh_cw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:239
│ │ │ +
ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const
const vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:611
│ │ │ +
FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh)
face - halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:483
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange
Definition PolyConnectivity.hh:1268
│ │ │ +
EdgeIter edges_end()
End iterator for edges.
Definition PolyConnectivity_inline_impl.hh:338
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity::cfv_end > > ConstFaceVertexRange
Definition PolyConnectivity.hh:1273
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange
Definition PolyConnectivity.hh:1288
│ │ │ +
VertexVertexIter vv_begin(VertexHandle _vh)
vertex - vertex circulator
Definition PolyConnectivity_inline_impl.hh:562
│ │ │ +
EdgeIter ConstEdgeIter
Linear iterator.
Definition PolyConnectivity.hh:146
│ │ │ +
ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:939
│ │ │ +
VertexVertexCCWIter vv_ccwiter(VertexHandle _vh)
vertex - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:387
│ │ │ +
VertexVertexIter vv_end(VertexHandle _vh)
vertex - vertex circulator
Definition PolyConnectivity_inline_impl.hh:768
│ │ │ +
Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter
Enumerates incident edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:258
│ │ │ +
FaceEdgeCWIter fe_cwiter(FaceHandle _fh)
face - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:492
│ │ │ +
HalfedgeLoopCWIter ConstHalfedgeLoopCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:433
│ │ │ +
FaceFaceCCWIter ff_ccwiter(FaceHandle _fh)
face - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:504
│ │ │ +
EdgeVertexIter ev_begin(EdgeHandle _eh)
edge - vertex circulator
Definition PolyConnectivity_inline_impl.hh:746
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity::cff_cwend > > ConstFaceFaceCWRange
Definition PolyConnectivity.hh:1290
│ │ │ +
HalfedgeIter halfedges_end()
End iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:326
│ │ │ +
VertexFaceIter vf_begin(VertexHandle _vh)
vertex - face circulator
Definition PolyConnectivity_inline_impl.hh:598
│ │ │ +
ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const
const face - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:927
│ │ │ +
ConstFaceFaceIter cff_end(FaceHandle _fh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:933
│ │ │ +
ConstEdgeFaceRange ef_range(EdgeHandle _eh) const
Definition PolyConnectivity_inline_impl.hh:198
│ │ │ +
FaceFaceCWIter ff_cwiter(FaceHandle _fh)
face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:501
│ │ │ +
VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh)
vertex - incoming halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:783
│ │ │ +
ConstHalfedgeLoopRange hl_range(HalfedgeHandle _heh) const
Definition PolyConnectivity_inline_impl.hh:202
│ │ │ +
VertexFaceCWIter vf_cwbegin(VertexHandle _vh)
vertex - face circulator cw
Definition PolyConnectivity_inline_impl.hh:601
│ │ │ +
Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, &ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter
Linear iterator.
Definition PolyConnectivity.hh:140
│ │ │ +
FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh)
face - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:678
│ │ │ +
ConstVertexVertexCWRange vv_cw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:207
│ │ │ +
ConstVertexVertexIter cvv_iter(VertexHandle _vh) const
const vertex circulator
Definition PolyConnectivity_inline_impl.hh:426
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange
Definition PolyConnectivity.hh:1299
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange
Definition PolyConnectivity.hh:1293
│ │ │ +
FaceHalfedgeCWIter fh_cwend(FaceHandle _fh)
face - halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:872
│ │ │ +
VertexIHalfedgeIter ConstVertexIHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:285
│ │ │ +
ConstFaceEdgeIter cfe_end(FaceHandle _fh) const
const face - edge circulator
Definition PolyConnectivity_inline_impl.hh:924
│ │ │ +
VertexEdgeCWIter ve_cwbegin(VertexHandle _vh)
vertex - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:592
│ │ │ +
ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const
const vertex - incoming halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:441
│ │ │ +
FaceFaceIter ConstFaceFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:378
│ │ │ +
Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter
Enumerates 1-ring vertices in a counter clockwise fashion.
Definition PolyConnectivity.hh:180
│ │ │ +
VertexIter vertices_sbegin()
Begin iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:357
│ │ │ +
FaceHalfedgeIter fh_end(FaceHandle _fh)
face - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:869
│ │ │ +
VertexFaceCWIter vf_cwiter(VertexHandle _vh)
vertex - face circulator cw
Definition PolyConnectivity_inline_impl.hh:420
│ │ │ +
ConstEdgeFaceIter cef_begin(EdgeHandle _eh) const
const edge - face circulator
Definition PolyConnectivity_inline_impl.hh:762
│ │ │ +
HalfedgeIter halfedges_sbegin()
Begin iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:363
│ │ │ +
ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const
const face - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:915
│ │ │ +
ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:936
│ │ │ +
Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter
Enumerate incident vertices in a clockwise fashion.
Definition PolyConnectivity.hh:316
│ │ │ +
FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh)
face - halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:669
│ │ │ +
HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh)
halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:696
│ │ │ +
HalfedgeIter halfedges_begin()
Begin iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:320
│ │ │ +
SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:57
│ │ │ +
ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const
const face - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:516
│ │ │ +
FaceFaceCWIter ConstFaceFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:379
│ │ │ +
ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const
const face - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:733
│ │ │ +
ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const
const face - halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:519
│ │ │ +
FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:374
│ │ │ +
EdgeIter edges_sbegin()
Begin iterator for edges.
Definition PolyConnectivity_inline_impl.hh:369
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange
Definition PolyConnectivity.hh:1282
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange
Definition PolyConnectivity.hh:1295
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > > ConstEdgeRangeSkipping
Definition PolyConnectivity.hh:1189
│ │ │ +
VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh)
vertex - incoming halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:780
│ │ │ +
EdgeIter edges_begin()
Begin iterator for edges.
Definition PolyConnectivity_inline_impl.hh:332
│ │ │ +
FaceVertexCWIter fv_cwiter(FaceHandle _fh)
face - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:474
│ │ │ +
ConstFaceFaceRange ff_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:182
│ │ │ +
ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const
const vertex - incoming halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:826
│ │ │ +
static SmartEdgeHandle s_edge_handle(SmartHalfedgeHandle _heh)
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:62
│ │ │ +
ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const
const vertex - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:641
│ │ │ +
ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const
const vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:817
│ │ │ +
ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:154
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange
Definition PolyConnectivity.hh:1302
│ │ │ +
FaceVertexIter fv_begin(FaceHandle _fh)
face - vertex circulator
Definition PolyConnectivity_inline_impl.hh:654
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange
Definition PolyConnectivity.hh:1287
│ │ │ +
VertexEdgeCWIter ve_cwend(VertexHandle _vh)
vertex - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:798
│ │ │ +
FaceVertexCCWIter fv_ccwiter(FaceHandle _fh)
face - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:477
│ │ │ +
ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const
const vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:614
│ │ │ +
EdgeVertexIter ev_iter(EdgeHandle _eh)
edge - vertex circulator
Definition PolyConnectivity_inline_impl.hh:543
│ │ │ +
ConstEdgeVertexIter cev_begin(EdgeHandle _eh) const
const edge - vertex circulator
Definition PolyConnectivity_inline_impl.hh:756
│ │ │ +
HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh)
halfedge circulator
Definition PolyConnectivity_inline_impl.hh:693
│ │ │ +
FaceFaceCWIter ff_cwend(FaceHandle _fh)
face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:890
│ │ │ +
VertexVertexCCWIter ConstVertexVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:281
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange
Definition PolyConnectivity.hh:1269
│ │ │ +
FaceFaceIter ff_iter(FaceHandle _fh)
face - face circulator
Definition PolyConnectivity_inline_impl.hh:498
│ │ │ +
ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:942
│ │ │ +
FaceVertexCWIter fv_cwend(FaceHandle _fh)
face - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:863
│ │ │ +
ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const
const face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:945
│ │ │ +
Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, &ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter
Linear iterator.
Definition PolyConnectivity.hh:139
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > ConstFaceRange
Definition PolyConnectivity.hh:1194
│ │ │ +
VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh)
vertex - outgoing halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:402
│ │ │ +
ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const
const face - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:948
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity::cff_ccwend > > ConstFaceFaceCCWRange
Definition PolyConnectivity.hh:1301
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange
Definition PolyConnectivity.hh:1283
│ │ │ +
ConstHalfedgeLoopCCWRange hl_ccw_range(HalfedgeHandle _heh) const
Definition PolyConnectivity_inline_impl.hh:302
│ │ │ +
ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const
const face - halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:715
│ │ │ +
HalfedgeLoopIter hl_begin(HalfedgeHandle _heh)
halfedge circulator
Definition PolyConnectivity_inline_impl.hh:690
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > VertexIHalfedgeIter
Enumerates incoming half edges in a clockwise fashion.
Definition PolyConnectivity.hh:213
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity::vertices_end > > ConstVertexRange
Definition PolyConnectivity.hh:1164
│ │ │ +
FaceFaceCCWIter ConstFaceFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:380
│ │ │ +
VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:283
│ │ │ +
FaceEdgeCWIter ConstFaceEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:376
│ │ │ +
ConstFaceEdgeRange fe_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:178
│ │ │ +
VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh)
vertex - outgoing halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:405
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:174
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange
Definition PolyConnectivity.hh:1284
│ │ │ +
ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const
const face - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:528
│ │ │ +
HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:434
│ │ │ +
SmartHalfedgeHandle prev_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:56
│ │ │ +
ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const
const vertex - face circulator cw
Definition PolyConnectivity_inline_impl.hh:465
│ │ │ +
FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh)
face - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:660
│ │ │ +
ConstFaceVertexIter cfv_iter(FaceHandle _fh) const
const face - vertex circulator
Definition PolyConnectivity_inline_impl.hh:507
│ │ │ +
VertexOHalfedgeIter voh_begin(VertexHandle _vh)
vertex - outgoing halfedge circulator
Definition PolyConnectivity_inline_impl.hh:580
│ │ │ +
VertexEdgeIter ConstVertexEdgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:291
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter
Enumerate incident half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:321
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity::cfe_end > > ConstFaceEdgeRange
Definition PolyConnectivity.hh:1275
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > VertexOHalfedgeIter
Enumerates outgoing half edges in a clockwise fashion.
Definition PolyConnectivity.hh:194
│ │ │ +
ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const
const face - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:930
│ │ │ +
ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const
const face - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:709
│ │ │ +
ConstFaceFaceCWRange ff_cw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:247
│ │ │ +
HalfedgeLoopIter ConstHalfedgeLoopIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:432
│ │ │ +
ConstVertexIHalfedgeCWRange vih_cw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:211
│ │ │ +
ConstFaceFaceIter cff_iter(FaceHandle _fh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:534
│ │ │ +
ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const
const vertex - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:650
│ │ │ +
ConstEdgeHalfedgeIter ceh_end(EdgeHandle _eh) const
const edge - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:965
│ │ │ +
ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const
const face - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:513
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange
Definition PolyConnectivity.hh:1280
│ │ │ +
ConstVertexEdgeCCWRange ve_ccw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:277
│ │ │ +
EdgeVertexIter ConstEdgeVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:425
│ │ │ +
ConstEdgeHalfedgeIter ceh_begin(EdgeHandle _eh) const
const edge - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:759
│ │ │ +
ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const
const vertex - outgoing halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:450
│ │ │ +
VertexFaceIter ConstVertexFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:288
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange
Definition PolyConnectivity.hh:1285
│ │ │ +
EdgeFaceIter ef_begin(EdgeHandle _eh)
edge - face circulator
Definition PolyConnectivity_inline_impl.hh:752
│ │ │ +
ConstHalfedgeRange all_halfedges() const
Definition PolyConnectivity_inline_impl.hh:126
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange
Definition PolyConnectivity.hh:1296
│ │ │ +
VertexVertexCWIter vv_cwbegin(VertexHandle _vh)
vertex - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:565
│ │ │ +
VertexIter ConstVertexIter
Linear iterator.
Definition PolyConnectivity.hh:144
│ │ │ +
ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const
const vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:432
│ │ │ +
Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, &ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter
Linear iterator.
Definition PolyConnectivity.hh:142
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter
Enumerates incident edges in a clockwise fashion.
Definition PolyConnectivity.hh:253
│ │ │ +
FaceVertexIter ConstFaceVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:369
│ │ │ +
VertexVertexIter vv_iter(VertexHandle _vh)
vertex - vertex circulator
Definition PolyConnectivity_inline_impl.hh:381
│ │ │ +
ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const
const vertex - outgoing halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:629
│ │ │ +
ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const
const vertex - incoming halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:623
│ │ │ +
ConstEdgeRangeSkipping edges() const
Definition PolyConnectivity_inline_impl.hh:127
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity::cfe_cwend > > ConstFaceEdgeCWRange
Definition PolyConnectivity.hh:1289
│ │ │ +
EdgeVertexIter ev_end(EdgeHandle _eh)
edge - vertex circulator
Definition PolyConnectivity_inline_impl.hh:952
│ │ │ +
VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:287
│ │ │ +
VertexFaceCWIter ConstVertexFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:289
│ │ │ +
ConstVertexFaceCWRange vf_cw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:231
│ │ │ +
VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh)
vertex - incoming halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:574
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity::cve_end > > ConstVertexEdgeRange
Definition PolyConnectivity.hh:1271
│ │ │ +
ConstEdgeFaceIter cef_end(EdgeHandle _eh) const
const edge - face circulator
Definition PolyConnectivity_inline_impl.hh:968
│ │ │ +
VertexIHalfedgeIter vih_end(VertexHandle _vh)
vertex - incoming halfedge circulator
Definition PolyConnectivity_inline_impl.hh:777
│ │ │ +
ConstVertexEdgeRange ve_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:162
│ │ │ +
EdgeFaceIter ConstEdgeFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:427
│ │ │ +
ConstVertexOHalfedgeCWRange voh_cw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:219
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter
Enumerate the halfedges of an edge.
Definition PolyConnectivity.hh:410
│ │ │ +
ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const
const face - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:724
│ │ │ +
ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const
const vertex - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:468
│ │ │ +
ConstFaceEdgeCCWRange fe_ccw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:293
│ │ │ +
VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh)
vertex - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:414
│ │ │ +
ConstEdgeRange all_edges() const
Definition PolyConnectivity_inline_impl.hh:128
│ │ │ +
VertexEdgeCCWIter ve_ccwend(VertexHandle _vh)
vertex - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:801
│ │ │ +
static SmartHalfedgeHandle s_halfedge_handle(SmartEdgeHandle _eh, unsigned int _i=0)
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:61
│ │ │ +
VertexEdgeIter ve_end(VertexHandle _vh)
vertex - edge circulator
Definition PolyConnectivity_inline_impl.hh:795
│ │ │ +
ConstFaceEdgeCWRange fe_cw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:243
│ │ │ +
ConstHalfedgeLoopCWRange hl_cw_range(HalfedgeHandle _heh) const
Definition PolyConnectivity_inline_impl.hh:251
│ │ │ +
FaceIter faces_sbegin()
Begin iterator for faces.
Definition PolyConnectivity_inline_impl.hh:375
│ │ │ +
Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > VertexOHalfedgeCCWIter
Enumerates outgoing half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:200
│ │ │ +
FaceVertexIter fv_end(FaceHandle _fh)
face - vertex circulator
Definition PolyConnectivity_inline_impl.hh:860
│ │ │ +
VertexFaceCCWIter vf_ccwend(VertexHandle _vh)
vertex - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:810
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter
Enumerates incident faces in a clockwise fashion.
Definition PolyConnectivity.hh:233
│ │ │ +
Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, &ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter
Linear iterator.
Definition PolyConnectivity.hh:141
│ │ │ +
ConstEdgeVertexRange ev_range(EdgeHandle _eh) const
Definition PolyConnectivity_inline_impl.hh:186
│ │ │ +
ConstVertexIHalfedgeCCWRange vih_ccw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:261
│ │ │ +
ConstFaceVertexIter cfv_begin(FaceHandle _fh) const
const face - vertex circulator
Definition PolyConnectivity_inline_impl.hh:700
│ │ │ +
SmartHalfedgeHandle next_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:55
│ │ │ +
EdgeHalfedgeIter ConstEdgeHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:426
│ │ │ +
ConstVertexEdgeIter cve_iter(VertexHandle _vh) const
const vertex - edge circulator
Definition PolyConnectivity_inline_impl.hh:453
│ │ │ +
ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const
const face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:537
│ │ │ +
VertexFaceCWIter vf_cwend(VertexHandle _vh)
vertex - face circulator cw
Definition PolyConnectivity_inline_impl.hh:807
│ │ │ +
ConstEdgeVertexIter cev_end(EdgeHandle _eh) const
const edge - vertex circulator
Definition PolyConnectivity_inline_impl.hh:962
│ │ │ +
ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const
const face - edge circulator
Definition PolyConnectivity_inline_impl.hh:525
│ │ │ +
ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const
const face - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:912
│ │ │ +
FaceEdgeCWIter fe_cwbegin(FaceHandle _fh)
face - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:675
│ │ │ +
VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh)
vertex - incoming halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:393
│ │ │ +
FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh)
face - halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:486
│ │ │ +
ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const
const face - edge circulator
Definition PolyConnectivity_inline_impl.hh:718
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter
Identical to FaceHalfedgeIter.
Definition PolyConnectivity.hh:277
│ │ │ +
FaceFaceCWIter ff_cwbegin(FaceHandle _fh)
face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:684
│ │ │ +
Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:362
│ │ │ +
SmartHalfedgeHandle ccw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:58
│ │ │ +
ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:540
│ │ │ +
HalfedgeLoopIter hl_end(HalfedgeHandle _heh)
face - face circulator
Definition PolyConnectivity_inline_impl.hh:896
│ │ │ +
FaceEdgeCCWIter ConstFaceEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:377
│ │ │ +
EdgeHalfedgeIter eh_begin(EdgeHandle _eh)
edge - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:749
│ │ │ +
ConstVertexFaceCCWRange vf_ccw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:281
│ │ │ +
VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh)
vertex - outgoing halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:792
│ │ │ +
ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const
const vertex - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:456
│ │ │ +
VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh)
vertex - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:595
│ │ │ +
VertexOHalfedgeIter voh_iter(VertexHandle _vh)
vertex - outgoing halfedge circulator
Definition PolyConnectivity_inline_impl.hh:399
│ │ │ +
ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const
const face - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:510
│ │ │ +
ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const
const vertex - outgoing halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:632
│ │ │ +
ConstHalfedgeRangeSkipping halfedges() const
Definition PolyConnectivity_inline_impl.hh:125
│ │ │ +
ConstVertexEdgeCWRange ve_cw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:227
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter
Identical to FaceHalfedgeIter.
Definition PolyConnectivity.hh:272
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > ConstEdgeRange
Definition PolyConnectivity.hh:1184
│ │ │ +
FaceEdgeIter fe_begin(FaceHandle _fh)
face - edge circulator
Definition PolyConnectivity_inline_impl.hh:672
│ │ │ +
VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh)
vertex - outgoing halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:583
│ │ │ +
EdgeFaceIter ef_iter(EdgeHandle _eh)
edge - face circulator
Definition PolyConnectivity_inline_impl.hh:549
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity::cfe_ccwend > > ConstFaceEdgeCCWRange
Definition PolyConnectivity.hh:1300
│ │ │ +
VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:284
│ │ │ +
FaceEdgeIter fe_end(FaceHandle _fh)
face - edge circulator
Definition PolyConnectivity_inline_impl.hh:878
│ │ │ +
FaceFaceIter ff_end(FaceHandle _fh)
face - face circulator
Definition PolyConnectivity_inline_impl.hh:887
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRangeSkipping
Definition PolyConnectivity.hh:1179
│ │ │ +
SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:69
│ │ │ +
ConstFaceFaceIter cff_begin(FaceHandle _fh) const
const face - face circulator
Definition PolyConnectivity_inline_impl.hh:727
│ │ │ +
FaceHalfedgeIter ConstFaceHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:372
│ │ │ +
ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const
const vertex - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:856
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter
Enumerate incident vertices in a counter clockwise fashion.
Definition PolyConnectivity.hh:310
│ │ │ +
ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const
const vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:820
│ │ │ +
VertexOHalfedgeIter voh_end(VertexHandle _vh)
vertex - outgoing halfedge circulator
Definition PolyConnectivity_inline_impl.hh:786
│ │ │ +
FaceEdgeIter fe_iter(FaceHandle _fh)
face - edge circulator
Definition PolyConnectivity_inline_impl.hh:489
│ │ │ +
VertexIter vertices_begin()
Begin iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:308
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange
Definition PolyConnectivity.hh:1286
│ │ │ +
Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:234
│ │ │ +
HalfedgeIter ConstHalfedgeIter
Linear iterator.
Definition PolyConnectivity.hh:145
│ │ │ +
ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const
const vertex - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:847
│ │ │ +
ConstEdgeFaceIter cef_iter(EdgeHandle _eh) const
const edge - face circulator
Definition PolyConnectivity_inline_impl.hh:558
│ │ │ +
ConstFaceVertexRange fv_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:170
│ │ │ +
ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const
const vertex - incoming halfedge circulator
Definition PolyConnectivity_inline_impl.hh:823
│ │ │ +
ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const
const vertex - outgoing halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:447
│ │ │ +
ConstVertexFaceIter cvf_iter(VertexHandle _vh) const
const vertex - face circulator
Definition PolyConnectivity_inline_impl.hh:462
│ │ │ +
ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const
const face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:730
│ │ │ +
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > VertexIHalfedgeCCWIter
Enumerates incoming half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:219
│ │ │ +
FaceVertexCCWIter ConstFaceVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:371
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange
Definition PolyConnectivity.hh:1270
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity::ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange
Definition PolyConnectivity.hh:1278
│ │ │ +
ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const
const face - halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:522
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity::vertices_end > > ConstVertexRangeSkipping
Definition PolyConnectivity.hh:1169
│ │ │ +
ConstVertexRange all_vertices() const
Definition PolyConnectivity_inline_impl.hh:124
│ │ │ +
Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:254
│ │ │ +
EdgeHalfedgeIter eh_end(EdgeHandle _eh)
edge - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:955
│ │ │ +
ConstVertexVertexIter cvv_end(VertexHandle _vh) const
const vertex circulator
Definition PolyConnectivity_inline_impl.hh:814
│ │ │ +
VertexVertexCCWIter vv_ccwend(VertexHandle _vh)
vertex - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:774
│ │ │ +
ConstFaceFaceCCWRange ff_ccw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:297
│ │ │ +
ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:146
│ │ │ +
FaceEdgeIter ConstFaceEdgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:375
│ │ │ +
SmartVertexHandle add_vertex()
Add a new vertex.
Definition PolyConnectivity_inline_impl.hh:53
│ │ │ +
ConstVertexFaceIter cvf_begin(VertexHandle _vh) const
const vertex - face circulator
Definition PolyConnectivity_inline_impl.hh:644
│ │ │ +
ConstEdgeVertexIter cev_iter(EdgeHandle _eh) const
const edge - vertex circulator
Definition PolyConnectivity_inline_impl.hh:552
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:322
│ │ │ +
ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const
const vertex - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:459
│ │ │ +
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > VertexIHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:214
│ │ │ +
FaceIter faces_end()
End iterator for faces.
Definition PolyConnectivity_inline_impl.hh:350
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity::cvf_end > > ConstVertexFaceRange
Definition PolyConnectivity.hh:1272
│ │ │ +
FaceVertexCWIter fv_cwbegin(FaceHandle _fh)
face - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:657
│ │ │ +
ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const
const face - halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:918
│ │ │ +
FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh)
face - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:495
│ │ │ +
ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const
const vertex - incoming halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:620
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange
Definition PolyConnectivity.hh:1294
│ │ │ +
Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:311
│ │ │ +
ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const
const halfedge circulator
Definition PolyConnectivity_inline_impl.hh:736
│ │ │ +
FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh)
face - halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:875
│ │ │ +
ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const
const vertex - outgoing halfedge circulator
Definition PolyConnectivity_inline_impl.hh:444
│ │ │ +
VertexFaceCCWIter ConstVertexFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:290
│ │ │ +
ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const
const face - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:721
│ │ │ +
ConstVertexVertexCCWRange vv_ccw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:257
│ │ │ +
ConstFaceRangeSkipping faces() const
Definition PolyConnectivity_inline_impl.hh:129
│ │ │ +
FaceFaceIter ff_begin(FaceHandle _fh)
face - face circulator
Definition PolyConnectivity_inline_impl.hh:681
│ │ │ +
ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const
const vertex - incoming halfedge circulator
Definition PolyConnectivity_inline_impl.hh:617
│ │ │ +
ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const
const vertex - outgoing halfedge circulator
Definition PolyConnectivity_inline_impl.hh:626
│ │ │ +
VertexOHalfedgeIter ConstVertexOHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:282
│ │ │ +
VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh)
vertex - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:568
│ │ │ +
VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh)
vertex - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:604
│ │ │ +
FaceIter ConstFaceIter
Linear iterator.
Definition PolyConnectivity.hh:147
│ │ │ +
ConstVertexRangeSkipping vertices() const
Definition PolyConnectivity_inline_impl.hh:123
│ │ │ +
FaceVertexCCWIter fv_ccwend(FaceHandle _fh)
face - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:866
│ │ │ +
ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const
const vertex - face circulator cw
Definition PolyConnectivity_inline_impl.hh:647
│ │ │ +
ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const
const vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:429
│ │ │ +
VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:286
│ │ │ +
VertexEdgeCWIter ConstVertexEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:292
│ │ │ +
Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:175
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity::cef_end > > ConstEdgeFaceRange
Definition PolyConnectivity.hh:1279
│ │ │ +
SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:65
│ │ │ +
VertexFaceCCWIter vf_ccwiter(VertexHandle _vh)
vertex - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:423
│ │ │ +
VertexVertexCWIter vv_cwiter(VertexHandle _vh)
vertex - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:384
│ │ │ +
ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const
const vertex - outgoing halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:838
│ │ │ +
ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const
const vertex - outgoing halfedge circulator
Definition PolyConnectivity_inline_impl.hh:832
│ │ │ +
VertexEdgeIter ve_begin(VertexHandle _vh)
vertex - edge circulator
Definition PolyConnectivity_inline_impl.hh:589
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRange
Definition PolyConnectivity.hh:1174
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter
Enumerate incident half edges in a clockwise fashion.
Definition PolyConnectivity.hh:327
│ │ │ +
ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const
const halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:739
│ │ │ +
VertexVertexCWIter ConstVertexVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:280
│ │ │ +
ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:174
│ │ │ +
ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const
const vertex - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:638
│ │ │ +
ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const
const halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:742
│ │ │ +
VertexEdgeCCWIter ConstVertexEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:293
│ │ │ +
ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const
const face - vertex circulator ccw
Definition PolyConnectivity_inline_impl.hh:706
│ │ │ +
VertexVertexIter ConstVertexVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:279
│ │ │ +
ConstVertexOHalfedgeCCWRange voh_ccw_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:269
│ │ │ +
SmartFaceHandle opposite_face_handle(HalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:71
│ │ │ +
FaceFaceCCWIter ff_ccwend(FaceHandle _fh)
face - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:893
│ │ │ +
ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const
const vertex - outgoing halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:835
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter
Enumerate adjacent faces in a counter clockwise fashion.
Definition PolyConnectivity.hh:361
│ │ │ +
SmartHalfedgeHandle cw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:59
│ │ │ +
FaceHalfedgeCWIter ConstFaceHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:373
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange
Definition PolyConnectivity.hh:1274
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter
Enumerate faces incident to an edge.
Definition PolyConnectivity.hh:423
│ │ │ +
HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh)
face - face circulator cw
Definition PolyConnectivity_inline_impl.hh:899
│ │ │ +
FaceEdgeCCWIter fe_ccwend(FaceHandle _fh)
face - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:884
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity::cev_end > > ConstEdgeVertexRange
Definition PolyConnectivity.hh:1277
│ │ │ +
ConstFaceHalfedgeCCWRange fh_ccw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:289
│ │ │ +
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:273
│ │ │ +
ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const
const face - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:909
│ │ │ +
Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter
Enumerate adjacent faces in a clockwise fashion.
Definition PolyConnectivity.hh:367
│ │ │ +
VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh)
vertex - incoming halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:396
│ │ │ +
FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh)
face - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:687
│ │ │ +
VertexIHalfedgeIter vih_iter(VertexHandle _vh)
vertex - incoming halfedge circulator
Definition PolyConnectivity_inline_impl.hh:390
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter
Enumerate incident edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:341
│ │ │ +
ConstVertexVertexIter cvv_begin(VertexHandle _vh) const
const vertex circulator
Definition PolyConnectivity_inline_impl.hh:608
│ │ │ +
VertexIter vertices_end()
End iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:314
│ │ │ +
Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter
Enumerate incident edges in a clockwise fashion.
Definition PolyConnectivity.hh:347
│ │ │ +
ConstEdgeHalfedgeIter ceh_iter(EdgeHandle _eh) const
const edge - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:555
│ │ │ +
Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter
Enumerate vertices incident to an edge.
Definition PolyConnectivity.hh:397
│ │ │ +
Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter
Enumerates incident faces in a counter clockwise fashion.
Definition PolyConnectivity.hh:239
│ │ │ +
FaceHalfedgeIter fh_iter(FaceHandle _fh)
face - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:480
│ │ │ +
FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh)
face - halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:666
│ │ │ +
ConstVertexFaceIter cvf_end(VertexHandle _vh) const
const vertex - face circulator
Definition PolyConnectivity_inline_impl.hh:850
│ │ │ +
VertexEdgeIter ve_iter(VertexHandle _vh)
vertex - edge circulator
Definition PolyConnectivity_inline_impl.hh:408
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity::cff_end > > ConstFaceFaceRange
Definition PolyConnectivity.hh:1276
│ │ │ +
FaceIter faces_begin()
Begin iterator for faces.
Definition PolyConnectivity_inline_impl.hh:344
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange
Definition PolyConnectivity.hh:1291
│ │ │ +
ConstFaceVertexIter cfv_end(FaceHandle _fh) const
const face - vertex circulator
Definition PolyConnectivity_inline_impl.hh:906
│ │ │ +
VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh)
vertex - outgoing halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:586
│ │ │ +
ConstEdgeHalfedgeRange eh_range(EdgeHandle _eh) const
Definition PolyConnectivity_inline_impl.hh:190
│ │ │ +
FaceHalfedgeIter fh_begin(FaceHandle _fh)
face - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:663
│ │ │ +
ConstVertexEdgeIter cve_begin(VertexHandle _vh) const
const vertex - edge circulator
Definition PolyConnectivity_inline_impl.hh:635
│ │ │ +
Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:342
│ │ │ +
ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const
const face - edge circulator ccw
Definition PolyConnectivity_inline_impl.hh:531
│ │ │ +
ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const
const face - halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:712
│ │ │ +
ConstFaceVertexCWRange fv_cw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:235
│ │ │ +
ConstVertexVertexRange vv_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:142
│ │ │ +
HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh)
face - face circulator ccw
Definition PolyConnectivity_inline_impl.hh:902
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange
Definition PolyConnectivity.hh:1297
│ │ │ +
ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const
const face - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:703
│ │ │ +
FaceVertexIter fv_iter(FaceHandle _fh)
face - vertex circulator
Definition PolyConnectivity_inline_impl.hh:471
│ │ │ +
VertexEdgeCWIter ve_cwiter(VertexHandle _vh)
vertex - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:411
│ │ │ +
ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const
const face - halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:921
│ │ │ +
VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh)
vertex - outgoing halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:789
│ │ │ +
ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const
const vertex - incoming halfedge circulator cw
Definition PolyConnectivity_inline_impl.hh:438
│ │ │ +
ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const
const vertex - face circulator cw
Definition PolyConnectivity_inline_impl.hh:853
│ │ │ +
FaceEdgeCWIter fe_cwend(FaceHandle _fh)
face - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:881
│ │ │ +
ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const
const vertex - incoming halfedge circulator
Definition PolyConnectivity_inline_impl.hh:435
│ │ │ +
EdgeHalfedgeIter eh_iter(EdgeHandle _eh)
edge - halfedge circulator
Definition PolyConnectivity_inline_impl.hh:546
│ │ │ +
EdgeFaceIter ef_end(EdgeHandle _eh)
edge - face circulator
Definition PolyConnectivity_inline_impl.hh:958
│ │ │ +
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > > ConstFaceRangeSkipping
Definition PolyConnectivity.hh:1199
│ │ │ +
VertexIHalfedgeIter vih_begin(VertexHandle _vh)
vertex - incoming halfedge circulator
Definition PolyConnectivity_inline_impl.hh:571
│ │ │ +
VertexFaceIter vf_end(VertexHandle _vh)
vertex - face circulator
Definition PolyConnectivity_inline_impl.hh:804
│ │ │ +
ConstFaceRange all_faces() const
Definition PolyConnectivity_inline_impl.hh:130
│ │ │ +
VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh)
vertex - incoming halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:577
│ │ │ +
SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i=0) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:64
│ │ │ +
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange
Definition PolyConnectivity.hh:1298
│ │ │ +
VertexVertexCWIter vv_cwend(VertexHandle _vh)
vertex - vertex circulator cw
Definition PolyConnectivity_inline_impl.hh:771
│ │ │ +
VertexFaceIter vf_iter(VertexHandle _vh)
vertex - face circulator
Definition PolyConnectivity_inline_impl.hh:417
│ │ │ +
ConstFaceVertexCCWRange fv_ccw_range(FaceHandle _fh) const
Definition PolyConnectivity_inline_impl.hh:285
│ │ │ +
ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const
const vertex - edge circulator cw
Definition PolyConnectivity_inline_impl.hh:844
│ │ │ +
ConstVertexEdgeIter cve_end(VertexHandle _vh) const
const vertex - edge circulator
Definition PolyConnectivity_inline_impl.hh:841
│ │ │ +
FaceVertexCWIter ConstFaceVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:370
│ │ │ +
Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > VertexOHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:195
│ │ │ +
ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const
const vertex - incoming halfedge circulator ccw
Definition PolyConnectivity_inline_impl.hh:829
│ │ │ +
ConstVertexFaceRange vf_range(VertexHandle _vh) const
Definition PolyConnectivity_inline_impl.hh:166
│ │ │ +
const PolyConnectivity * mesh() const
Get the underlying mesh of this handle.
Definition SmartHandles.hh:69
│ │ │
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ +
PolyConnectivity::ConstVertexEdgeCWRange edges_cw() const
Returns a range of edges incident to the vertex (PolyConnectivity::ve_cw_range())
Definition PolyConnectivity_inline_impl.hh:977
│ │ │ +
PolyConnectivity::ConstVertexFaceCWRange faces_cw() const
Returns a range of faces incident to the vertex (PolyConnectivity::vf_cw_range())
Definition PolyConnectivity_inline_impl.hh:973
│ │ │ +
PolyConnectivity::ConstVertexIHalfedgeRange incoming_halfedges() const
Returns a range of outgoing halfedges incident to the vertex (PolyConnectivity::voh_range())
Definition PolyConnectivity_inline_impl.hh:984
│ │ │ +
PolyConnectivity::ConstVertexIHalfedgeCWRange incoming_halfedges_cw() const
Returns a range of outgoing halfedges incident to the vertex (PolyConnectivity::voh_cw_range())
Definition PolyConnectivity_inline_impl.hh:985
│ │ │ +
PolyConnectivity::ConstVertexVertexCCWRange vertices_ccw() const
Returns a range of vertices adjacent to the vertex (PolyConnectivity::vv_ccw_range())
Definition PolyConnectivity_inline_impl.hh:982
│ │ │ +
PolyConnectivity::ConstVertexVertexCWRange vertices_cw() const
Returns a range of vertices adjacent to the vertex (PolyConnectivity::vv_cw_range())
Definition PolyConnectivity_inline_impl.hh:981
│ │ │ +
PolyConnectivity::ConstVertexVertexRange vertices() const
Returns a range of vertices adjacent to the vertex (PolyConnectivity::vv_range())
Definition PolyConnectivity_inline_impl.hh:980
│ │ │ +
PolyConnectivity::ConstVertexEdgeCCWRange edges_ccw() const
Returns a range of edges incident to the vertex (PolyConnectivity::ve_ccw_range())
Definition PolyConnectivity_inline_impl.hh:978
│ │ │ +
PolyConnectivity::ConstVertexIHalfedgeCCWRange incoming_halfedges_ccw() const
Returns a range of outgoing halfedges incident to the vertex (PolyConnectivity::voh_ccw_range())
Definition PolyConnectivity_inline_impl.hh:986
│ │ │ +
PolyConnectivity::ConstVertexFaceRange faces() const
Returns a range of faces incident to the vertex (PolyConnectivity::vf_range())
Definition PolyConnectivity_inline_impl.hh:972
│ │ │ +
PolyConnectivity::ConstVertexOHalfedgeRange outgoing_halfedges() const
Returns a range of incoming halfedges incident to the vertex (PolyConnectivity::voh_range())
Definition PolyConnectivity_inline_impl.hh:992
│ │ │ +
PolyConnectivity::ConstVertexOHalfedgeCWRange outgoing_halfedges_cw() const
Returns a range of incoming halfedges incident to the vertex (PolyConnectivity::voh_cw_range())
Definition PolyConnectivity_inline_impl.hh:993
│ │ │ +
PolyConnectivity::ConstVertexFaceCCWRange faces_ccw() const
Returns a range of faces incident to the vertex (PolyConnectivity::vf_ccw_range())
Definition PolyConnectivity_inline_impl.hh:974
│ │ │ +
PolyConnectivity::ConstVertexOHalfedgeCCWRange outgoing_halfedges_ccw() const
Returns a range of incoming halfedges incident to the vertex (PolyConnectivity::voh_ccw_range())
Definition PolyConnectivity_inline_impl.hh:994
│ │ │ +
PolyConnectivity::ConstVertexEdgeRange edges() const
Returns a range of edges incident to the vertex (PolyConnectivity::ve_range())
Definition PolyConnectivity_inline_impl.hh:976
│ │ │ +
Definition SmartHandles.hh:170
│ │ │ +
PolyConnectivity::ConstHalfedgeLoopRange loop() const
Returns a range of halfedges in the face of the halfedge (or along the boundary) (PolyConnectivity::h...
Definition PolyConnectivity_inline_impl.hh:1001
│ │ │ +
PolyConnectivity::ConstHalfedgeLoopCCWRange loop_ccw() const
Returns a range of halfedges in the face of the halfedge (or along the boundary) (PolyConnectivity::h...
Definition PolyConnectivity_inline_impl.hh:1003
│ │ │ +
PolyConnectivity::ConstHalfedgeLoopCWRange loop_cw() const
Returns a range of halfedges in the face of the halfedge (or along the boundary) (PolyConnectivity::h...
Definition PolyConnectivity_inline_impl.hh:1002
│ │ │ +
Definition SmartHandles.hh:197
│ │ │ +
PolyConnectivity::ConstEdgeHalfedgeRange halfedges() const
Returns a range of halfedges of the edge (PolyConnectivity::eh_range())
Definition PolyConnectivity_inline_impl.hh:1025
│ │ │ +
PolyConnectivity::ConstEdgeFaceRange faces() const
Returns a range of faces incident to the edge (PolyConnectivity::ef_range())
Definition PolyConnectivity_inline_impl.hh:1029
│ │ │ +
PolyConnectivity::ConstEdgeVertexRange vertices() const
Returns a range of vertices incident to the edge (PolyConnectivity::ev_range())
Definition PolyConnectivity_inline_impl.hh:1023
│ │ │ +
Definition SmartHandles.hh:228
│ │ │ +
PolyConnectivity::ConstFaceFaceCWRange faces_cw() const
Returns a range adjacent faces of the face (PolyConnectivity::ff_cw_range())
Definition PolyConnectivity_inline_impl.hh:1019
│ │ │ +
PolyConnectivity::ConstFaceEdgeRange edges() const
Returns a range of edges of the face (PolyConnectivity::fv_range())
Definition PolyConnectivity_inline_impl.hh:1014
│ │ │ +
PolyConnectivity::ConstFaceHalfedgeCWRange halfedges_cw() const
Returns a range of halfedges of the face (PolyConnectivity::fh_cw_range())
Definition PolyConnectivity_inline_impl.hh:1011
│ │ │ +
PolyConnectivity::ConstFaceFaceRange faces() const
Returns a range adjacent faces of the face (PolyConnectivity::ff_range())
Definition PolyConnectivity_inline_impl.hh:1018
│ │ │ +
PolyConnectivity::ConstFaceVertexRange vertices() const
Returns a range of vertices incident to the face (PolyConnectivity::fv_range())
Definition PolyConnectivity_inline_impl.hh:1006
│ │ │ +
PolyConnectivity::ConstFaceFaceCCWRange faces_ccw() const
Returns a range adjacent faces of the face (PolyConnectivity::ff_ccw_range())
Definition PolyConnectivity_inline_impl.hh:1020
│ │ │ +
PolyConnectivity::ConstFaceEdgeCCWRange edges_ccw() const
Returns a range of edges of the face (PolyConnectivity::fv_ccw_range())
Definition PolyConnectivity_inline_impl.hh:1016
│ │ │ +
PolyConnectivity::ConstFaceEdgeCWRange edges_cw() const
Returns a range of edges of the face (PolyConnectivity::fv_cw_range())
Definition PolyConnectivity_inline_impl.hh:1015
│ │ │ +
PolyConnectivity::ConstFaceHalfedgeCCWRange halfedges_ccw() const
Returns a range of halfedges of the face (PolyConnectivity::fh_ccw_range())
Definition PolyConnectivity_inline_impl.hh:1012
│ │ │ +
PolyConnectivity::ConstFaceHalfedgeRange halfedges() const
Returns a range of halfedges of the face (PolyConnectivity::fh_range())
Definition PolyConnectivity_inline_impl.hh:1010
│ │ │ +
PolyConnectivity::ConstFaceVertexCWRange vertices_cw() const
Returns a range of vertices incident to the face (PolyConnectivity::fv_cw_range())
Definition PolyConnectivity_inline_impl.hh:1007
│ │ │ +
PolyConnectivity::ConstFaceVertexCCWRange vertices_ccw() const
Returns a range of vertices incident to the face (PolyConnectivity::fv_ccw_range())
Definition PolyConnectivity_inline_impl.hh:1008
│ │ │ +
Base class for all smart range types.
Definition SmartRange.hh:74
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -PolyMeshT.hh │ │ │ │ +PolyConnectivity_inline_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,871 +45,3074 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS PolyMeshT │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ +42#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ +43#error Do not include this directly, include instead PolyConnectivity.hh │ │ │ │ +44#endif // OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ +45 │ │ │ │ +46#include // To help some IDEs │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ +49 │ │ │ │ +50namespace _O_p_e_n_M_e_s_h { │ │ │ │ 51 │ │ │ │ -52#ifndef OPENMESH_POLYMESHT_HH │ │ │ │ -53#define OPENMESH_POLYMESHT_HH │ │ │ │ +52 │ │ │ │ +_5_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_d_d___v_e_r_t_e_x() { return _m_a_k_e___s_m_a_r_t │ │ │ │ +(_n_e_w___v_e_r_t_e_x(), *this); } │ │ │ │ 54 │ │ │ │ -55 │ │ │ │ -56//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -57 │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65 │ │ │ │ -66 │ │ │ │ -67//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ +_5_5inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_n_e_x_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { return _m_a_k_e___s_m_a_r_t(_n_e_x_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +_5_6inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_p_r_e_v___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { return _m_a_k_e___s_m_a_r_t(_p_r_e_v___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +_5_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { return _m_a_k_e___s_m_a_r_t(_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +_5_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_c_w___r_o_t_a_t_e_d___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { return _m_a_k_e___s_m_a_r_t │ │ │ │ +(_c_c_w___r_o_t_a_t_e_d___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +_5_9inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_w___r_o_t_a_t_e_d___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { return _m_a_k_e___s_m_a_r_t(_c_w___r_o_t_a_t_e_d___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +60 │ │ │ │ +_6_1inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _eh, unsigned int _i) { return _m_a_k_e___s_m_a_r_t(ArrayKernel:: │ │ │ │ +s_halfedge_handle(_E_d_g_e_H_a_n_d_l_e(_eh), _i), _eh._m_e_s_h()); } │ │ │ │ +_6_2inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s___e_d_g_e___h_a_n_d_l_e(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) { return _m_a_k_e___s_m_a_r_t(ArrayKernel::s_edge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), │ │ │ │ +_heh._m_e_s_h()); } │ │ │ │ +63 │ │ │ │ +_6_4inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e___h_a_n_d_l_e(_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ +_eh, unsigned int _i) const { return _m_a_k_e___s_m_a_r_t(_h_a_l_f_e_d_g_e___h_a_n_d_l_e(_E_d_g_e_H_a_n_d_l_e │ │ │ │ +(_eh), _i), *this); } │ │ │ │ +_6_5inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e___h_a_n_d_l_e(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) const { return _m_a_k_e___s_m_a_r_t(_e_d_g_e___h_a_n_d_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +_6_6inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e___h_a_n_d_l_e(_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e │ │ │ │ +_fh) const { return _m_a_k_e___s_m_a_r_t(_h_a_l_f_e_d_g_e___h_a_n_d_l_e(_F_a_c_e_H_a_n_d_l_e(_fh)), *this); } │ │ │ │ +_6_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +(_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { return _m_a_k_e___s_m_a_r_t(_h_a_l_f_e_d_g_e___h_a_n_d_l_e(_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +(_vh)), *this); } │ │ │ │ 68 │ │ │ │ -69 │ │ │ │ -70namespace _O_p_e_n_M_e_s_h { │ │ │ │ -71 │ │ │ │ -72//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ +_6_9inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e___h_a_n_d_l_e(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) const { return _m_a_k_e___s_m_a_r_t(_f_a_c_e___h_a_n_d_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh)), *this); } │ │ │ │ +70 │ │ │ │ +_7_1inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___f_a_c_e___h_a_n_d_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +_heh) const { return _m_a_k_e___s_m_a_r_t(_f_a_c_e___h_a_n_d_l_e(_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh)), │ │ │ │ +*this); } │ │ │ │ +72 │ │ │ │ 73 │ │ │ │ -74 │ │ │ │ -89template │ │ │ │ -_9_0class _P_o_l_y_M_e_s_h_T : public Kernel │ │ │ │ -91{ │ │ │ │ -92public: │ │ │ │ -93 │ │ │ │ -_9_5 typedef _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_> _T_h_i_s; │ │ │ │ -96 //--- item types --- │ │ │ │ -97 │ │ │ │ +75template │ │ │ │ +_7_6class _E_n_t_i_t_y_R_a_n_g_e : public _S_m_a_r_t_R_a_n_g_e_T, typename │ │ │ │ +RangeTraitT::ITER_TYPE::SmartHandle> { │ │ │ │ +77 public: │ │ │ │ +78 typedef typename RangeTraitT::ITER_TYPE iterator; │ │ │ │ +79 typedef typename RangeTraitT::ITER_TYPE const_iterator; │ │ │ │ +80 │ │ │ │ +81 explicit _E_n_t_i_t_y_R_a_n_g_e(typename RangeTraitT::CONTAINER_TYPE &container) : │ │ │ │ +container_(container) {} │ │ │ │ +82 typename RangeTraitT::ITER_TYPE begin() const { return RangeTraitT::begin │ │ │ │ +(container_); } │ │ │ │ +83 typename RangeTraitT::ITER_TYPE end() const { return RangeTraitT::end │ │ │ │ +(container_); } │ │ │ │ +84 │ │ │ │ +85 private: │ │ │ │ +86 typename RangeTraitT::CONTAINER_TYPE &container_; │ │ │ │ +87}; │ │ │ │ +88 │ │ │ │ +90template │ │ │ │ +91//class CirculatorRange : public │ │ │ │ +SmartRangeT, decltype (make_smart(std:: │ │ │ │ +declval(), std:: │ │ │ │ +declval()))>{ │ │ │ │ +_9_2class _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e : public │ │ │ │ +_S_m_a_r_t_R_a_n_g_e_T, typename │ │ │ │ +SmartHandle::type>{ │ │ │ │ +93 public: │ │ │ │ +94 typedef typename CirculatorRangeTraitT::ITER_TYPE ITER_TYPE; │ │ │ │ +95 typedef typename CirculatorRangeTraitT::CENTER_ENTITY_TYPE │ │ │ │ +CENTER_ENTITY_TYPE; │ │ │ │ +96 typedef typename CirculatorRangeTraitT::CONTAINER_TYPE CONTAINER_TYPE; │ │ │ │ +97 typedef ITER_TYPE iterator; │ │ │ │ +98 typedef ITER_TYPE const_iterator; │ │ │ │ 99 │ │ │ │ -_1_0_0 static constexpr bool _i_s___p_o_l_y_m_e_s_h() { return true; } │ │ │ │ -101 static constexpr bool is_trimesh() { return false; } │ │ │ │ -102 using ConnectivityTag = PolyConnectivityTag; │ │ │ │ -103 enum { IsPolyMesh = 1 }; │ │ │ │ -104 enum { IsTriMesh = 0 }; │ │ │ │ -106 │ │ │ │ +100 _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e( │ │ │ │ +101 const CONTAINER_TYPE &container, │ │ │ │ +102 CENTER_ENTITY_TYPE center) : │ │ │ │ +103 container_(container), heh_() │ │ │ │ +104 { │ │ │ │ +105 auto it = CirculatorRangeTraitT::begin(container_, center); │ │ │ │ +106 heh_ = it.heh_; │ │ │ │ +107 } │ │ │ │ 108 │ │ │ │ -109 │ │ │ │ -_1_1_0 typedef typename Kernel::Scalar _S_c_a_l_a_r; │ │ │ │ -_1_1_2 typedef typename Kernel::Point _P_o_i_n_t; │ │ │ │ -_1_1_4 typedef typename Kernel::Normal _N_o_r_m_a_l; │ │ │ │ -_1_1_6 typedef typename Kernel::Color _C_o_l_o_r; │ │ │ │ -_1_1_8 typedef typename Kernel::TexCoord1D _T_e_x_C_o_o_r_d_1_D; │ │ │ │ -_1_2_0 typedef typename Kernel::TexCoord2D _T_e_x_C_o_o_r_d_2_D; │ │ │ │ -_1_2_2 typedef typename Kernel::TexCoord3D _T_e_x_C_o_o_r_d_3_D; │ │ │ │ -_1_2_4 typedef typename Kernel::Vertex _V_e_r_t_e_x; │ │ │ │ -_1_2_6 typedef typename Kernel::Halfedge _H_a_l_f_e_d_g_e; │ │ │ │ -_1_2_8 typedef typename Kernel::Edge _E_d_g_e; │ │ │ │ -_1_3_0 typedef typename Kernel::Face _F_a_c_e; │ │ │ │ -132 │ │ │ │ -133 //--- handle types --- │ │ │ │ -134 │ │ │ │ -_1_3_6 typedef typename Kernel::VertexHandle _V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -_1_3_7 typedef typename Kernel::HalfedgeHandle _H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -_1_3_8 typedef typename Kernel::EdgeHandle _E_d_g_e_H_a_n_d_l_e; │ │ │ │ -_1_3_9 typedef typename Kernel::FaceHandle _F_a_c_e_H_a_n_d_l_e; │ │ │ │ +109 _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e( │ │ │ │ +110 const CONTAINER_TYPE &container, │ │ │ │ +111 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, int) : │ │ │ │ +112 container_(container), heh_(heh) {} │ │ │ │ +113 │ │ │ │ +114 ITER_TYPE begin() const { return CirculatorRangeTraitT::begin(container_, │ │ │ │ +heh_, 1); } │ │ │ │ +115 ITER_TYPE end() const { return CirculatorRangeTraitT::end(container_, heh_, │ │ │ │ +1); } │ │ │ │ +116 │ │ │ │ +117 private: │ │ │ │ +118 const CONTAINER_TYPE &container_; │ │ │ │ +119 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh_; │ │ │ │ +120}; │ │ │ │ +121 │ │ │ │ +122 │ │ │ │ +_1_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s │ │ │ │ +() const { return _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g(*this); } │ │ │ │ +_1_2_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___v_e_r_t_i_c_e_s() │ │ │ │ +const { return _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e(*this); } │ │ │ │ +_1_2_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_h_a_l_f_e_d_g_e_s() const { return _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g(*this); } │ │ │ │ +_1_2_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___h_a_l_f_e_d_g_e_s │ │ │ │ +() const { return _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e(*this); } │ │ │ │ +_1_2_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s() │ │ │ │ +const { return _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g(*this); } │ │ │ │ +_1_2_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___e_d_g_e_s() const │ │ │ │ +{ return _C_o_n_s_t_E_d_g_e_R_a_n_g_e(*this); } │ │ │ │ +_1_2_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s() │ │ │ │ +const { return _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g(*this); } │ │ │ │ +_1_3_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___f_a_c_e_s() const │ │ │ │ +{ return _C_o_n_s_t_F_a_c_e_R_a_n_g_e(*this); } │ │ │ │ +131 │ │ │ │ +132template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +PolyConnectivity::elements() const { return _v_e_r_t_i_c_e_s(); } │ │ │ │ +133template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e PolyConnectivity:: │ │ │ │ +all_elements() const { return _a_l_l___v_e_r_t_i_c_e_s(); } │ │ │ │ +134template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +PolyConnectivity::elements() const { return _h_a_l_f_e_d_g_e_s(); } │ │ │ │ +135template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e PolyConnectivity:: │ │ │ │ +all_elements() const { return _a_l_l___h_a_l_f_e_d_g_e_s(); } │ │ │ │ +136template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +PolyConnectivity::elements() const { return _e_d_g_e_s(); } │ │ │ │ +137template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e PolyConnectivity:: │ │ │ │ +all_elements() const { return _a_l_l___e_d_g_e_s(); } │ │ │ │ +138template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +PolyConnectivity::elements() const { return _f_a_c_e_s(); } │ │ │ │ +139template <> inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e PolyConnectivity:: │ │ │ │ +all_elements() const { return _a_l_l___f_a_c_e_s(); } │ │ │ │ 140 │ │ │ │ 141 │ │ │ │ -142 │ │ │ │ -_1_4_3 typedef typename Kernel::VertexIter _V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_4_4 typedef typename Kernel::HalfedgeIter _H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_4_5 typedef typename Kernel::EdgeIter _E_d_g_e_I_t_e_r; │ │ │ │ -_1_4_6 typedef typename Kernel::FaceIter _F_a_c_e_I_t_e_r; │ │ │ │ -147 │ │ │ │ -_1_4_8 typedef typename Kernel::ConstVertexIter _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_4_9 typedef typename Kernel::ConstHalfedgeIter _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_5_0 typedef typename Kernel::ConstEdgeIter _C_o_n_s_t_E_d_g_e_I_t_e_r; │ │ │ │ -_1_5_1 typedef typename Kernel::ConstFaceIter _C_o_n_s_t_F_a_c_e_I_t_e_r; │ │ │ │ +_1_4_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___r_a_n_g_e │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +143 return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e(*this, _vh); │ │ │ │ +144} │ │ │ │ +145 │ │ │ │ +_1_4_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +147 return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _vh); │ │ │ │ +148} │ │ │ │ +149 │ │ │ │ +_1_5_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +151 return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh), 1); │ │ │ │ +152} │ │ │ │ 153 │ │ │ │ -154 //--- circulators --- │ │ │ │ -155 │ │ │ │ -_1_6_2 typedef typename Kernel::VertexVertexIter _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_6_3 typedef typename Kernel::VertexOHalfedgeIter _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_6_4 typedef typename Kernel::VertexIHalfedgeIter _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_6_5 typedef typename Kernel::VertexEdgeIter _V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ -_1_6_6 typedef typename Kernel::VertexFaceIter _V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ -_1_6_7 typedef typename Kernel::FaceVertexIter _F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_6_8 typedef typename Kernel::FaceHalfedgeIter _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_6_9 typedef typename Kernel::FaceEdgeIter _F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ -_1_7_0 typedef typename Kernel::FaceFaceIter _F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ -171 │ │ │ │ -_1_7_2 typedef typename Kernel::ConstVertexVertexIter _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_7_3 typedef typename Kernel::ConstVertexOHalfedgeIter _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_7_4 typedef typename Kernel::ConstVertexIHalfedgeIter _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_7_5 typedef typename Kernel::ConstVertexEdgeIter _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ -_1_7_6 typedef typename Kernel::ConstVertexFaceIter _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ -_1_7_7 typedef typename Kernel::ConstFaceVertexIter _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_7_8 typedef typename Kernel::ConstFaceHalfedgeIter _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_7_9 typedef typename Kernel::ConstFaceEdgeIter _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ -_1_8_0 typedef typename Kernel::ConstFaceFaceIter _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ -182 │ │ │ │ -183 │ │ │ │ -184 // --- constructor/destructor │ │ │ │ -_1_8_5 _P_o_l_y_M_e_s_h_T() {} │ │ │ │ -186 template │ │ │ │ -_1_8_7 explicit _P_o_l_y_M_e_s_h_T(const T& t) : Kernel(t) {} │ │ │ │ -_1_8_8 virtual _~_P_o_l_y_M_e_s_h_T() {} │ │ │ │ +_1_5_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +155 return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _vh); │ │ │ │ +156} │ │ │ │ +157 │ │ │ │ +_1_5_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +159 return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _heh, 1); │ │ │ │ +160} │ │ │ │ +161 │ │ │ │ +_1_6_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___r_a_n_g_e │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +163 return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e(*this, _vh); │ │ │ │ +164} │ │ │ │ +165 │ │ │ │ +_1_6_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___r_a_n_g_e │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +167 return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e(*this, _vh); │ │ │ │ +168} │ │ │ │ +169 │ │ │ │ +_1_7_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___r_a_n_g_e │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +171 return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e(*this, _fh); │ │ │ │ +172} │ │ │ │ +173 │ │ │ │ +_1_7_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___r_a_n_g_e │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +175 return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _fh); │ │ │ │ +176} │ │ │ │ +177 │ │ │ │ +_1_7_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___r_a_n_g_e │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +179 return _C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e(*this, _fh); │ │ │ │ +180} │ │ │ │ +181 │ │ │ │ +_1_8_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___r_a_n_g_e │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +183 return _C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e(*this, _fh); │ │ │ │ +184} │ │ │ │ +185 │ │ │ │ +_1_8_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___r_a_n_g_e │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const { │ │ │ │ +187 return _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e(*this, _eh); │ │ │ │ +188} │ │ │ │ 189 │ │ │ │ -194 // --- creation --- │ │ │ │ -195 │ │ │ │ -_2_0_1 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x() │ │ │ │ -202 { return _m_a_k_e___s_m_a_r_t(Kernel::new_vertex(), this); } │ │ │ │ -203 │ │ │ │ -_2_1_0 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x(const _P_o_i_n_t _p) │ │ │ │ -211 { │ │ │ │ -212 _V_e_r_t_e_x_H_a_n_d_l_e vh(Kernel::new_vertex()); │ │ │ │ -213 this->set_point(vh, _p); │ │ │ │ -214 return _m_a_k_e___s_m_a_r_t(vh, this); │ │ │ │ -215 } │ │ │ │ -216 │ │ │ │ -_2_2_8 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x___d_i_r_t_y(const _P_o_i_n_t _p) │ │ │ │ -229 { │ │ │ │ -230 _V_e_r_t_e_x_H_a_n_d_l_e vh(Kernel::new_vertex_dirty()); │ │ │ │ -231 this->set_point(vh, _p); │ │ │ │ -232 return _m_a_k_e___s_m_a_r_t(vh, this); │ │ │ │ -233 } │ │ │ │ +_1_9_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___r_a_n_g_e │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const { │ │ │ │ +191 return _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _eh); │ │ │ │ +192} │ │ │ │ +193 │ │ │ │ +_1_9_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___r_a_n_g_e │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +195 return _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e(*this, _heh, 1); │ │ │ │ +196} │ │ │ │ +197 │ │ │ │ +_1_9_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___r_a_n_g_e │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const { │ │ │ │ +199 return _C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e(*this, _eh); │ │ │ │ +200} │ │ │ │ +201 │ │ │ │ +_2_0_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___r_a_n_g_e │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +203 return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e(*this, _heh); │ │ │ │ +204} │ │ │ │ +205 │ │ │ │ +206 │ │ │ │ +_2_0_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_v___c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +208 return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +209} │ │ │ │ +210 │ │ │ │ +_2_1_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +212 return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +213} │ │ │ │ +214 │ │ │ │ +_2_1_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___c_w___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +216 return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e(*this, _o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh), │ │ │ │ +1); │ │ │ │ +217} │ │ │ │ +218 │ │ │ │ +_2_1_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +220 return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +221} │ │ │ │ +222 │ │ │ │ +_2_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___c_w___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +224 return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e(*this, _heh, 1); │ │ │ │ +225} │ │ │ │ +226 │ │ │ │ +_2_2_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_e___c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +228 return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +229} │ │ │ │ +230 │ │ │ │ +_2_3_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_f___c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +232 return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +233} │ │ │ │ 234 │ │ │ │ -_2_3_8 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _a_d_d___v_e_r_t_e_x(const _P_o_i_n_t _p) │ │ │ │ -239 { return _n_e_w___v_e_r_t_e_x(_p); } │ │ │ │ -240 │ │ │ │ -_2_4_2 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _a_d_d___v_e_r_t_e_x___d_i_r_t_y(const _P_o_i_n_t _p) │ │ │ │ -243 { return _m_a_k_e___s_m_a_r_t(_n_e_w___v_e_r_t_e_x___d_i_r_t_y(_p), this); } │ │ │ │ -244 │ │ │ │ -245 // --- normal vectors --- │ │ │ │ +_2_3_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_f_v___c_w___r_a_n_g_e(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +236 return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +237} │ │ │ │ +238 │ │ │ │ +_2_3_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_f_h___c_w___r_a_n_g_e(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +240 return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +241} │ │ │ │ +242 │ │ │ │ +_2_4_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w___r_a_n_g_e │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +244 return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +245} │ │ │ │ 246 │ │ │ │ +_2_4_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w___r_a_n_g_e │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +248 return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +249} │ │ │ │ 250 │ │ │ │ -258 void _u_p_d_a_t_e___n_o_r_m_a_l_s(); │ │ │ │ -259 │ │ │ │ -_2_6_1 void _u_p_d_a_t_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ -262 { this->set_normal(_fh, _c_a_l_c___f_a_c_e___n_o_r_m_a_l(_fh)); } │ │ │ │ -263 │ │ │ │ -269 void _u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s(); │ │ │ │ -270 │ │ │ │ -272 virtual _N_o_r_m_a_l _c_a_l_c___f_a_c_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -273 │ │ │ │ -275 _N_o_r_m_a_l _c_a_l_c___f_a_c_e___n_o_r_m_a_l(const _P_o_i_n_t& _p0, const _P_o_i_n_t& _p1, │ │ │ │ -276 const _P_o_i_n_t& _p2) const; │ │ │ │ -277 │ │ │ │ -279 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +_2_5_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_h_l___c_w___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +252 return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e(*this, _heh); │ │ │ │ +253} │ │ │ │ +254 │ │ │ │ +255 │ │ │ │ +256 │ │ │ │ +_2_5_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_v___c_c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +258 return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +259} │ │ │ │ +260 │ │ │ │ +_2_6_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___c_c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +262 return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +263} │ │ │ │ +264 │ │ │ │ +_2_6_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___c_c_w___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +266 return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e(*this, _o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh), │ │ │ │ +1); │ │ │ │ +267} │ │ │ │ +268 │ │ │ │ +_2_6_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___c_c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +270 return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +271} │ │ │ │ +272 │ │ │ │ +_2_7_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___c_c_w___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +274 return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e(*this, _heh, 1); │ │ │ │ +275} │ │ │ │ +276 │ │ │ │ +_2_7_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_e___c_c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +278 return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +279} │ │ │ │ 280 │ │ │ │ -_2_8_2 void _c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh, _P_o_i_n_t& _pt) const { │ │ │ │ -283 _pt = _c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_fh); │ │ │ │ -284 } │ │ │ │ -285 │ │ │ │ -287 _P_o_i_n_t _c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ +_2_8_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_f___c_c_w___r_a_n_g_e(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const { │ │ │ │ +282 return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e(*this, _vh); │ │ │ │ +283} │ │ │ │ +284 │ │ │ │ +_2_8_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_f_v___c_c_w___r_a_n_g_e(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +286 return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +287} │ │ │ │ 288 │ │ │ │ -290 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -291 │ │ │ │ -293 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -294 │ │ │ │ -296 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -297 │ │ │ │ -299 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +_2_8_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_f_h___c_c_w___r_a_n_g_e(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +290 return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +291} │ │ │ │ +292 │ │ │ │ +_2_9_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_f_e___c_c_w___r_a_n_g_e(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +294 return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +295} │ │ │ │ +296 │ │ │ │ +_2_9_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_f_f___c_c_w___r_a_n_g_e(_F_a_c_e_H_a_n_d_l_e _fh) const { │ │ │ │ +298 return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e(*this, _fh); │ │ │ │ +299} │ │ │ │ 300 │ │ │ │ -302 _P_o_i_n_t _c_a_l_c___c_e_n_t_r_o_i_d(_M_e_s_h_H_a_n_d_l_e _mh) const; │ │ │ │ -303 │ │ │ │ -_3_0_5 void _u_p_d_a_t_e___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle = 0.8) │ │ │ │ -306 { this->set_normal(_heh, _c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l(_heh,_feature_angle)); } │ │ │ │ +301 │ │ │ │ +_3_0_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_h_l___c_c_w___r_a_n_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { │ │ │ │ +303 return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e(*this, _heh); │ │ │ │ +304} │ │ │ │ +305 │ │ │ │ +306 │ │ │ │ 307 │ │ │ │ -317 void _u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s(const double _feature_angle = 0.8); │ │ │ │ -318 │ │ │ │ -331 virtual _N_o_r_m_a_l _c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double │ │ │ │ -_feature_angle = 0.8) const; │ │ │ │ -332 │ │ │ │ -334 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e, const double _feature_angle = 0.8) │ │ │ │ -const; │ │ │ │ -335 │ │ │ │ -338 bool _i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double │ │ │ │ -_feature_angle) const; │ │ │ │ -339 │ │ │ │ -_3_4_1 void _u_p_d_a_t_e___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -342 { this->set_normal(_vh, _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l(_vh)); } │ │ │ │ +_3_0_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n() │ │ │ │ +309{ return _V_e_r_t_e_x_I_t_e_r(*this, _V_e_r_t_e_x_H_a_n_d_l_e(0)); } │ │ │ │ +310 │ │ │ │ +_3_1_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n() │ │ │ │ +const │ │ │ │ +312{ return _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r(*this, _V_e_r_t_e_x_H_a_n_d_l_e(0)); } │ │ │ │ +313 │ │ │ │ +_3_1_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d() │ │ │ │ +315{ return _V_e_r_t_e_x_I_t_e_r(*this, _V_e_r_t_e_x_H_a_n_d_l_e( int(_n___v_e_r_t_i_c_e_s() ) )); } │ │ │ │ +316 │ │ │ │ +_3_1_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d() │ │ │ │ +const │ │ │ │ +318{ return _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r(*this, _V_e_r_t_e_x_H_a_n_d_l_e( int(_n___v_e_r_t_i_c_e_s()) )); } │ │ │ │ +319 │ │ │ │ +_3_2_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n() │ │ │ │ +321{ return _H_a_l_f_e_d_g_e_I_t_e_r(*this, _H_a_l_f_e_d_g_e_H_a_n_d_l_e(0)); } │ │ │ │ +322 │ │ │ │ +_3_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n │ │ │ │ +() const │ │ │ │ +324{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r(*this, _H_a_l_f_e_d_g_e_H_a_n_d_l_e(0)); } │ │ │ │ +325 │ │ │ │ +_3_2_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d() │ │ │ │ +327{ return _H_a_l_f_e_d_g_e_I_t_e_r(*this, _H_a_l_f_e_d_g_e_H_a_n_d_l_e(int(_n___h_a_l_f_e_d_g_e_s()))); } │ │ │ │ +328 │ │ │ │ +_3_2_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d() │ │ │ │ +const │ │ │ │ +330{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r(*this, _H_a_l_f_e_d_g_e_H_a_n_d_l_e(int(_n___h_a_l_f_e_d_g_e_s()))); } │ │ │ │ +331 │ │ │ │ +_3_3_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n() │ │ │ │ +333{ return _E_d_g_e_I_t_e_r(*this, _E_d_g_e_H_a_n_d_l_e(0)); } │ │ │ │ +334 │ │ │ │ +_3_3_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n() const │ │ │ │ +336{ return _C_o_n_s_t_E_d_g_e_I_t_e_r(*this, _E_d_g_e_H_a_n_d_l_e(0)); } │ │ │ │ +337 │ │ │ │ +_3_3_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d() │ │ │ │ +339{ return _E_d_g_e_I_t_e_r(*this, _E_d_g_e_H_a_n_d_l_e(int(_n___e_d_g_e_s()))); } │ │ │ │ +340 │ │ │ │ +_3_4_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d() const │ │ │ │ +342{ return _C_o_n_s_t_E_d_g_e_I_t_e_r(*this, _E_d_g_e_H_a_n_d_l_e(int(_n___e_d_g_e_s()))); } │ │ │ │ 343 │ │ │ │ -353 void _u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s(); │ │ │ │ -354 │ │ │ │ -367 _N_o_r_m_a_l _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ +_3_4_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n() │ │ │ │ +345{ return _F_a_c_e_I_t_e_r(*this, _F_a_c_e_H_a_n_d_l_e(0)); } │ │ │ │ +346 │ │ │ │ +_3_4_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n() const │ │ │ │ +348{ return _C_o_n_s_t_F_a_c_e_I_t_e_r(*this, _F_a_c_e_H_a_n_d_l_e(0)); } │ │ │ │ +349 │ │ │ │ +_3_5_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d() │ │ │ │ +351{ return _F_a_c_e_I_t_e_r(*this, _F_a_c_e_H_a_n_d_l_e(int(_n___f_a_c_e_s()))); } │ │ │ │ +352 │ │ │ │ +353 │ │ │ │ +_3_5_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d() const │ │ │ │ +355{ return _C_o_n_s_t_F_a_c_e_I_t_e_r(*this, _F_a_c_e_H_a_n_d_l_e(int(_n___f_a_c_e_s()))); } │ │ │ │ +356 │ │ │ │ +_3_5_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n() │ │ │ │ +358{ return _V_e_r_t_e_x_I_t_e_r(*this, _V_e_r_t_e_x_H_a_n_d_l_e(0), true); } │ │ │ │ +359 │ │ │ │ +_3_6_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n() │ │ │ │ +const │ │ │ │ +361{ return _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r(*this, _V_e_r_t_e_x_H_a_n_d_l_e(0), true); } │ │ │ │ +362 │ │ │ │ +_3_6_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n() │ │ │ │ +364{ return _H_a_l_f_e_d_g_e_I_t_e_r(*this, _H_a_l_f_e_d_g_e_H_a_n_d_l_e(0), true); } │ │ │ │ +365 │ │ │ │ +_3_6_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n() const │ │ │ │ +367{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r(*this, _H_a_l_f_e_d_g_e_H_a_n_d_l_e(0), true); } │ │ │ │ 368 │ │ │ │ -376 void _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const; │ │ │ │ -377 void _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const; │ │ │ │ -378 void _c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const; │ │ │ │ -379 │ │ │ │ -381 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -382 │ │ │ │ -384 │ │ │ │ -385 // --- Geometry API - still in development --- │ │ │ │ +_3_6_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n() │ │ │ │ +370{ return _E_d_g_e_I_t_e_r(*this, _E_d_g_e_H_a_n_d_l_e(0), true); } │ │ │ │ +371 │ │ │ │ +_3_7_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n() │ │ │ │ +const │ │ │ │ +373{ return _C_o_n_s_t_E_d_g_e_I_t_e_r(*this, _E_d_g_e_H_a_n_d_l_e(0), true); } │ │ │ │ +374 │ │ │ │ +_3_7_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n() │ │ │ │ +376{ return _F_a_c_e_I_t_e_r(*this, _F_a_c_e_H_a_n_d_l_e(0), true); } │ │ │ │ +377 │ │ │ │ +_3_7_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n() │ │ │ │ +const │ │ │ │ +379{ return _C_o_n_s_t_F_a_c_e_I_t_e_r(*this, _F_a_c_e_H_a_n_d_l_e(0), true); } │ │ │ │ +380 │ │ │ │ +_3_8_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +382{ return _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r(*this, _vh); } │ │ │ │ +383 │ │ │ │ +_3_8_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +385{ return _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 386 │ │ │ │ -_3_8_9 void _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_E_d_g_e_H_a_n_d_l_e _eh, _N_o_r_m_a_l& _edge_vec) const │ │ │ │ -390 { │ │ │ │ -391 _edge_vec = _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_eh); │ │ │ │ -392 } │ │ │ │ -393 │ │ │ │ -_3_9_6 _N_o_r_m_a_l _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -397 { │ │ │ │ -398 return _c_a_l_c___e_d_g_e___v_e_c_t_o_r(this->halfedge_handle(_eh,0)); │ │ │ │ -399 } │ │ │ │ -400 │ │ │ │ -_4_0_3 void _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _N_o_r_m_a_l& _edge_vec) const │ │ │ │ -404 { │ │ │ │ -405 _edge_vec = _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh); │ │ │ │ -406 } │ │ │ │ +_3_8_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +388{ return _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +389 │ │ │ │ +_3_9_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +391{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +392 │ │ │ │ +_3_9_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +394{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +395 │ │ │ │ +_3_9_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +397{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +398 │ │ │ │ +_3_9_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +400{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +401 │ │ │ │ +_4_0_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +403{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +404 │ │ │ │ +_4_0_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +406{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 407 │ │ │ │ -_4_1_0 _N_o_r_m_a_l _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -411 { │ │ │ │ -412 return this->point(this->to_vertex_handle(_heh)) - │ │ │ │ -413 this->point(this->from_vertex_handle(_heh)); │ │ │ │ -414 } │ │ │ │ -415 │ │ │ │ -416 // Calculates the length of the edge _eh │ │ │ │ -_4_1_7 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___l_e_n_g_t_h(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -418 { return _c_a_l_c___e_d_g_e___l_e_n_g_t_h(this->halfedge_handle(_eh,0)); } │ │ │ │ +_4_0_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +409{ return _V_e_r_t_e_x_E_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +410 │ │ │ │ +_4_1_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +412{ return _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +413 │ │ │ │ +_4_1_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +415{ return _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +416 │ │ │ │ +_4_1_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +418{ return _V_e_r_t_e_x_F_a_c_e_I_t_e_r(*this, _vh); } │ │ │ │ 419 │ │ │ │ -_4_2_2 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___l_e_n_g_t_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -423 { return (_S_c_a_l_a_r)sqrt(_c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(_heh)); } │ │ │ │ -424 │ │ │ │ -_4_2_5 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -426 { return _c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(this->halfedge_handle(_eh,0)); } │ │ │ │ -427 │ │ │ │ -_4_2_8 _S_c_a_l_a_r _c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -429 { │ │ │ │ -430 _N_o_r_m_a_l edge_vec; │ │ │ │ -431 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh, edge_vec); │ │ │ │ -432 return sqrnorm(edge_vec); │ │ │ │ -433 } │ │ │ │ +_4_2_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +421{ return _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +422 │ │ │ │ +_4_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +424{ return _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +425 │ │ │ │ +_4_2_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +427{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r(*this, _vh); } │ │ │ │ +428 │ │ │ │ +_4_2_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +430{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +431 │ │ │ │ +_4_3_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +433{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 434 │ │ │ │ -_4_3_7 _P_o_i_n_t _c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -438 { │ │ │ │ -439 _V_e_r_t_e_x_H_a_n_d_l_e vh0 = this->from_vertex_handle(_heh); │ │ │ │ -440 _V_e_r_t_e_x_H_a_n_d_l_e vh1 = this->to_vertex_handle(_heh); │ │ │ │ -441 return 0.5 * (this->point(vh0) + this->point(vh1)); │ │ │ │ -442 } │ │ │ │ +_4_3_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +436{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +437 │ │ │ │ +_4_3_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +439{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +440 │ │ │ │ +_4_4_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +442{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 443 │ │ │ │ -_4_4_6 _P_o_i_n_t _c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -447 { │ │ │ │ -448 return _c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t(this->halfedge_handle(_eh, 0)); │ │ │ │ -449 } │ │ │ │ -450 │ │ │ │ -452 _N_o_r_m_a_l _c_a_l_c___n_o_r_m_a_l(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -453 │ │ │ │ -_4_5_8 void _c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh, _N_o_r_m_a_l& _vec0, _N_o_r_m_a_l& │ │ │ │ -_vec1) const │ │ │ │ -459 { │ │ │ │ -460 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(this->next_halfedge_handle(_in_heh), _vec0);//p2 - p1 │ │ │ │ -461 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(this->opposite_halfedge_handle(_in_heh), _vec1);//p0 - p1 │ │ │ │ -462 } │ │ │ │ -463 │ │ │ │ -_4_6_9 _S_c_a_l_a_r _c_a_l_c___s_e_c_t_o_r___a_n_g_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh) const │ │ │ │ -470 { │ │ │ │ -471 _N_o_r_m_a_l v0, v1; │ │ │ │ -472 _c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s(_in_heh, v0, v1); │ │ │ │ -473 _S_c_a_l_a_r denom = norm(v0)*norm(v1); │ │ │ │ -474 if ( denom == _S_c_a_l_a_r(0)) │ │ │ │ -475 { │ │ │ │ -476 return 0; │ │ │ │ -477 } │ │ │ │ -478 _S_c_a_l_a_r cos_a = _d_o_t(v0 , v1) / denom; │ │ │ │ -479 if (this->is_boundary(_in_heh)) │ │ │ │ -480 {//determine if the boundary sector is concave or convex │ │ │ │ -481 _F_a_c_e_H_a_n_d_l_e fh(this->face_handle(this->opposite_halfedge_handle(_in_heh))); │ │ │ │ -482 _N_o_r_m_a_l f_n(_c_a_l_c___f_a_c_e___n_o_r_m_a_l(fh));//this normal is (for convex fh) OK │ │ │ │ -483 _S_c_a_l_a_r sign_a = _d_o_t(cross(v0, v1), f_n); │ │ │ │ -484 return _a_n_g_l_e(cos_a, sign_a); │ │ │ │ -485 } │ │ │ │ -486 else │ │ │ │ -487 { │ │ │ │ -488 return acos(_s_a_n_e___a_a_r_g(cos_a)); │ │ │ │ -489 } │ │ │ │ -490 } │ │ │ │ +_4_4_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +445{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +446 │ │ │ │ +_4_4_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +448{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +449 │ │ │ │ +_4_5_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +451{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +452 │ │ │ │ +_4_5_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +454{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +455 │ │ │ │ +_4_5_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +457{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +458 │ │ │ │ +_4_5_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_e___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +460{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +461 │ │ │ │ +_4_6_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +463{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r(*this, _vh); } │ │ │ │ +464 │ │ │ │ +_4_6_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +466{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +467 │ │ │ │ +_4_6_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_f___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +469{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +470 │ │ │ │ +_4_7_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +472{ return _F_a_c_e_V_e_r_t_e_x_I_t_e_r(*this, _fh); } │ │ │ │ +473 │ │ │ │ +_4_7_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +475{ return _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +476 │ │ │ │ +_4_7_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +478{ return _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +479 │ │ │ │ +_4_8_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +481{ return _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +482 │ │ │ │ +_4_8_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +484{ return _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +485 │ │ │ │ +_4_8_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +487{ return _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +488 │ │ │ │ +_4_8_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +490{ return _F_a_c_e_E_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ 491 │ │ │ │ -492 // calculate the cos and the sin of angle <(_in_heh,next_halfedge(_in_heh)) │ │ │ │ -493 /* │ │ │ │ -494 void calc_sector_angle_cos_sin(HalfedgeHandle _in_heh, Scalar& _cos_a, │ │ │ │ -Scalar& _sin_a) const │ │ │ │ -495 { │ │ │ │ -496 Normal in_vec, out_vec; │ │ │ │ -497 calc_edge_vector(_in_heh, in_vec); │ │ │ │ -498 calc_edge_vector(next_halfedge_handle(_in_heh), out_vec); │ │ │ │ -499 Scalar denom = norm(in_vec)*norm(out_vec); │ │ │ │ -500 if (is_zero(denom)) │ │ │ │ -501 { │ │ │ │ -502 _cos_a = 1; │ │ │ │ -503 _sin_a = 0; │ │ │ │ -504 } │ │ │ │ -505 else │ │ │ │ -506 { │ │ │ │ -507 _cos_a = dot(in_vec, out_vec)/denom; │ │ │ │ -508 _sin_a = norm(cross(in_vec, out_vec))/denom; │ │ │ │ -509 } │ │ │ │ -510 } │ │ │ │ -511 */ │ │ │ │ -_5_1_4 void _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh, _N_o_r_m_a_l& _sector_normal) │ │ │ │ -const │ │ │ │ -515 { │ │ │ │ -516 _N_o_r_m_a_l vec0, vec1; │ │ │ │ -517 _c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s(_in_heh, vec0, vec1); │ │ │ │ -518 _sector_normal = cross(vec0, vec1);//(p2-p1)^(p0-p1) │ │ │ │ -519 } │ │ │ │ -520 │ │ │ │ -_5_2_4 _S_c_a_l_a_r _c_a_l_c___s_e_c_t_o_r___a_r_e_a(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _in_heh) const │ │ │ │ -525 { │ │ │ │ -526 _N_o_r_m_a_l sector_normal; │ │ │ │ -527 _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(_in_heh, sector_normal); │ │ │ │ -528 return norm(sector_normal)/2; │ │ │ │ -529 } │ │ │ │ +_4_9_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +493{ return _F_a_c_e_E_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +494 │ │ │ │ +_4_9_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +496{ return _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +497 │ │ │ │ +_4_9_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +499{ return _F_a_c_e_F_a_c_e_I_t_e_r(*this, _fh); } │ │ │ │ +500 │ │ │ │ +_5_0_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +502{ return _F_a_c_e_F_a_c_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +503 │ │ │ │ +_5_0_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +505{ return _F_a_c_e_F_a_c_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +506 │ │ │ │ +_5_0_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +508{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r(*this, _fh); } │ │ │ │ +509 │ │ │ │ +_5_1_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +511{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +512 │ │ │ │ +_5_1_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_v___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +514{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +515 │ │ │ │ +_5_1_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +517{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +518 │ │ │ │ +_5_1_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +520{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +521 │ │ │ │ +_5_2_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_c_w_i_t_e_r(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +523{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +524 │ │ │ │ +_5_2_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +526{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +527 │ │ │ │ +_5_2_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +529{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ 530 │ │ │ │ -_5_3_3 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -534 { │ │ │ │ -535 // Make sure that we have face normals on the mesh │ │ │ │ -536 assert(Kernel::has_face_normals()); │ │ │ │ -537 │ │ │ │ -538 if (this->is_boundary(this->edge_handle(_heh))) │ │ │ │ -539 {//the dihedral angle at a boundary edge is 0 │ │ │ │ -540 return 0; │ │ │ │ -541 } │ │ │ │ -542 const _N_o_r_m_a_l& n0 = this->normal(this->face_handle(_heh)); │ │ │ │ -543 const _N_o_r_m_a_l& n1 = this->normal(this->face_handle(this- │ │ │ │ ->opposite_halfedge_handle(_heh))); │ │ │ │ -544 _N_o_r_m_a_l he; │ │ │ │ -545 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh, he); │ │ │ │ -546 _S_c_a_l_a_r da_cos = _d_o_t(n0, n1); │ │ │ │ -547 //should be normalized, but we need only the sign │ │ │ │ -548 _S_c_a_l_a_r da_sin_sign = _d_o_t(cross(n0, n1), he); │ │ │ │ -549 return _a_n_g_l_e(da_cos, da_sin_sign); │ │ │ │ -550 } │ │ │ │ +_5_3_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +532{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +533 │ │ │ │ +_5_3_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +535{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r(*this, _fh); } │ │ │ │ +536 │ │ │ │ +_5_3_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +538{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +539 │ │ │ │ +_5_4_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +541{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +542 │ │ │ │ +_5_4_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ +544{ return _E_d_g_e_V_e_r_t_e_x_I_t_e_r(*this, _eh); } │ │ │ │ +545 │ │ │ │ +_5_4_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ +547{ return _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _eh); } │ │ │ │ +548 │ │ │ │ +_5_4_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ +550{ return _E_d_g_e_F_a_c_e_I_t_e_r(*this, _eh); } │ │ │ │ 551 │ │ │ │ -_5_5_4 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -555 { return _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t(this->halfedge_handle(_eh,0)); } │ │ │ │ -556 │ │ │ │ -557 // calculates the dihedral angle on the halfedge _heh │ │ │ │ -_5_5_8 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -559 { │ │ │ │ -560 if (this->is_boundary(this->edge_handle(_heh))) │ │ │ │ -561 {//the dihedral angle at a boundary edge is 0 │ │ │ │ -562 return 0; │ │ │ │ -563 } │ │ │ │ -564 _N_o_r_m_a_l n0, n1, he; │ │ │ │ -565 _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(_heh, n0); │ │ │ │ -566 _c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l(this->opposite_halfedge_handle(_heh), n1); │ │ │ │ -567 _c_a_l_c___e_d_g_e___v_e_c_t_o_r(_heh, he); │ │ │ │ -568 _S_c_a_l_a_r denom = norm(n0)*norm(n1); │ │ │ │ -569 if (denom == _S_c_a_l_a_r(0)) │ │ │ │ -570 { │ │ │ │ -571 return 0; │ │ │ │ -572 } │ │ │ │ -573 _S_c_a_l_a_r da_cos = _d_o_t(n0, n1)/denom; │ │ │ │ -574 //should be normalized, but we need only the sign │ │ │ │ -575 _S_c_a_l_a_r da_sin_sign = _d_o_t(cross(n0, n1), he); │ │ │ │ -576 return _a_n_g_l_e(da_cos, da_sin_sign); │ │ │ │ -577 } │ │ │ │ -578 │ │ │ │ -579 // calculates the dihedral angle on the edge _eh │ │ │ │ -_5_8_0 _S_c_a_l_a_r _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -581 { return _c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e(this->halfedge_handle(_eh,0)); } │ │ │ │ +_5_5_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +553{ return _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r(*this, _eh); } │ │ │ │ +554 │ │ │ │ +_5_5_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +556{ return _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _eh); } │ │ │ │ +557 │ │ │ │ +_5_5_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___i_t_e_r │ │ │ │ +(_A_r_r_a_y_K_e_r_n_e_l_:_:_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +559{ return _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r(*this, _eh); } │ │ │ │ +560 │ │ │ │ +561 │ │ │ │ +_5_6_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +563{ return _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r(*this, _vh); } │ │ │ │ +564 │ │ │ │ +_5_6_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +566{ return _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +567 │ │ │ │ +_5_6_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +569{ return _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +570 │ │ │ │ +_5_7_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +572{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +573 │ │ │ │ +_5_7_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +575{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +576 │ │ │ │ +_5_7_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_i_h___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +578{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +579 │ │ │ │ +_5_8_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +581{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ 582 │ │ │ │ -585 unsigned int _f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s(_S_c_a_l_a_r _angle_tresh = OpenMesh::deg_to_rad │ │ │ │ -(44.0)); │ │ │ │ -586 // --- misc --- │ │ │ │ -587 │ │ │ │ -_5_8_9 inline void _s_p_l_i_t(_F_a_c_e_H_a_n_d_l_e _fh, const _P_o_i_n_t& _p) │ │ │ │ -590 { Kernel::split(_fh, _a_d_d___v_e_r_t_e_x(_p)); } │ │ │ │ +_5_8_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +584{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +585 │ │ │ │ +_5_8_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_v_o_h___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +587{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +588 │ │ │ │ +_5_8_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +590{ return _V_e_r_t_e_x_E_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ 591 │ │ │ │ -_5_9_2 inline void _s_p_l_i_t(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -593 { Kernel::split(_fh, _vh); } │ │ │ │ +_5_9_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +593{ return _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 594 │ │ │ │ -_5_9_5 inline void _s_p_l_i_t(_E_d_g_e_H_a_n_d_l_e _eh, const _P_o_i_n_t& _p) │ │ │ │ -596 { Kernel::split_edge(_eh, _a_d_d___v_e_r_t_e_x(_p)); } │ │ │ │ +_5_9_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +596{ return _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 597 │ │ │ │ -_5_9_8 inline void _s_p_l_i_t(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -599 { Kernel::split_edge(_eh, _vh); } │ │ │ │ +_5_9_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +599{ return _V_e_r_t_e_x_F_a_c_e_I_t_e_r(*this, _vh); } │ │ │ │ 600 │ │ │ │ -601private: │ │ │ │ -602 struct PointIs3DTag {}; │ │ │ │ -603 struct PointIsNot3DTag {}; │ │ │ │ -604 _N_o_r_m_a_l calc_face_normal_impl(_F_a_c_e_H_a_n_d_l_e, PointIs3DTag) const; │ │ │ │ -605 _N_o_r_m_a_l calc_face_normal_impl(_F_a_c_e_H_a_n_d_l_e, PointIsNot3DTag) const; │ │ │ │ -606 _N_o_r_m_a_l calc_face_normal_impl(const _P_o_i_n_t&, const _P_o_i_n_t&, const _P_o_i_n_t&, │ │ │ │ -PointIs3DTag) const; │ │ │ │ -607 _N_o_r_m_a_l calc_face_normal_impl(const _P_o_i_n_t&, const _P_o_i_n_t&, const _P_o_i_n_t&, │ │ │ │ -PointIsNot3DTag) const; │ │ │ │ -608}; │ │ │ │ -609 │ │ │ │ -635template │ │ │ │ -_6_3_6LHS _m_e_s_h___c_a_s_t(_P_o_l_y_M_e_s_h_T_<_K_E_R_N_E_L_> &rhs) { │ │ │ │ -637 return _M_e_s_h_C_a_s_t_<_L_H_S_,_ _P_o_l_y_M_e_s_h_T_<_K_E_R_N_E_L_>&>::cast(rhs); │ │ │ │ -638} │ │ │ │ -639 │ │ │ │ -640template │ │ │ │ -641LHS _m_e_s_h___c_a_s_t(PolyMeshT *rhs) { │ │ │ │ -642 return MeshCast*>::cast(rhs); │ │ │ │ -643} │ │ │ │ -644 │ │ │ │ -645template │ │ │ │ -646const LHS _m_e_s_h___c_a_s_t(const PolyMeshT &rhs) { │ │ │ │ -647 return MeshCast&>::cast(rhs); │ │ │ │ -648} │ │ │ │ +_6_0_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +602{ return _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +603 │ │ │ │ +_6_0_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +605{ return _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +606 │ │ │ │ +607 │ │ │ │ +_6_0_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +609{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r(*this, _vh); } │ │ │ │ +610 │ │ │ │ +_6_1_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +612{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +613 │ │ │ │ +_6_1_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +615{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +616 │ │ │ │ +_6_1_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +618{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +619 │ │ │ │ +_6_2_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +621{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +622 │ │ │ │ +_6_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +624{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +625 │ │ │ │ +_6_2_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +627{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +628 │ │ │ │ +_6_2_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +630{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +631 │ │ │ │ +_6_3_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +633{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +634 │ │ │ │ +_6_3_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +636{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r(*this, _vh); } │ │ │ │ +637 │ │ │ │ +_6_3_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +639{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +640 │ │ │ │ +_6_4_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_e___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +642{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +643 │ │ │ │ +_6_4_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +645{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r(*this, _vh); } │ │ │ │ +646 │ │ │ │ +_6_4_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_b_e_g_i_n │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +648{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r(*this, _vh); } │ │ │ │ 649 │ │ │ │ -650template │ │ │ │ -651const LHS _m_e_s_h___c_a_s_t(const PolyMeshT *rhs) { │ │ │ │ -652 return MeshCast*>::cast(rhs); │ │ │ │ -653} │ │ │ │ -654 │ │ │ │ -655// │ │ │ │ -============================================================================= │ │ │ │ -656} // namespace OpenMesh │ │ │ │ -657// │ │ │ │ -============================================================================= │ │ │ │ -658#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_POLYMESH_C) │ │ │ │ -659# define OPENMESH_POLYMESH_TEMPLATES │ │ │ │ -660# include "PolyMeshT_impl.hh" │ │ │ │ -661#endif │ │ │ │ -662// │ │ │ │ -============================================================================= │ │ │ │ -663#endif // OPENMESH_POLYMESHT_HH defined │ │ │ │ -664// │ │ │ │ -============================================================================= │ │ │ │ +_6_5_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_f___c_c_w_b_e_g_i_n(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +651{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r(*this, _vh); } │ │ │ │ +652 │ │ │ │ +653 │ │ │ │ +_6_5_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +655{ return _F_a_c_e_V_e_r_t_e_x_I_t_e_r(*this, _fh); } │ │ │ │ +656 │ │ │ │ +_6_5_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +658{ return _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +659 │ │ │ │ +_6_6_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +661{ return _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +662 │ │ │ │ +_6_6_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +664{ return _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +665 │ │ │ │ +_6_6_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +667{ return _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +668 │ │ │ │ +_6_6_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +670{ return _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +671 │ │ │ │ +_6_7_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___b_e_g_i_n(_F_a_c_e_H_a_n_d_l_e │ │ │ │ +_fh) │ │ │ │ +673{ return _F_a_c_e_E_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +674 │ │ │ │ +_6_7_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +676{ return _F_a_c_e_E_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +677 │ │ │ │ +_6_7_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +679{ return _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +680 │ │ │ │ +_6_8_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___b_e_g_i_n(_F_a_c_e_H_a_n_d_l_e │ │ │ │ +_fh) │ │ │ │ +682{ return _F_a_c_e_F_a_c_e_I_t_e_r(*this, _fh); } │ │ │ │ +683 │ │ │ │ +_6_8_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +685{ return _F_a_c_e_F_a_c_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +686 │ │ │ │ +_6_8_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +688{ return _F_a_c_e_F_a_c_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +689 │ │ │ │ +_6_9_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___b_e_g_i_n │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +691{ return _H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r(*this, _heh); } │ │ │ │ +692 │ │ │ │ +_6_9_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_w_b_e_g_i_n │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +694{ return _H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r(*this, _heh); } │ │ │ │ +695 │ │ │ │ +_6_9_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_c_w_b_e_g_i_n │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +697{ return _H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r(*this, _heh); } │ │ │ │ +698 │ │ │ │ +699 │ │ │ │ +_7_0_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +701{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r(*this, _fh); } │ │ │ │ +702 │ │ │ │ +_7_0_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +704{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +705 │ │ │ │ +_7_0_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_v___c_c_w_b_e_g_i_n(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +707{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +708 │ │ │ │ +_7_0_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +710{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +711 │ │ │ │ +_7_1_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_w_b_e_g_i_n(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +713{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +714 │ │ │ │ +_7_1_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_c_w_b_e_g_i_n(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +716{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +717 │ │ │ │ +_7_1_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +719{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r(*this, _fh); } │ │ │ │ +720 │ │ │ │ +_7_2_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +722{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +723 │ │ │ │ +_7_2_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +725{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +726 │ │ │ │ +_7_2_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +728{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r(*this, _fh); } │ │ │ │ +729 │ │ │ │ +_7_3_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +731{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +732 │ │ │ │ +_7_3_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_b_e_g_i_n │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +734{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r(*this, _fh); } │ │ │ │ +735 │ │ │ │ +_7_3_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___b_e_g_i_n │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +737{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r(*this, _heh); } │ │ │ │ +738 │ │ │ │ +_7_3_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_h_l___c_w_b_e_g_i_n(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +740{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r(*this, _heh); } │ │ │ │ +741 │ │ │ │ +_7_4_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_h_l___c_c_w_b_e_g_i_n(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +743{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r(*this, _heh); } │ │ │ │ +744 │ │ │ │ +745 │ │ │ │ +_7_4_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___b_e_g_i_n │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ +747{ return _E_d_g_e_V_e_r_t_e_x_I_t_e_r(*this, _eh); } │ │ │ │ +748 │ │ │ │ +_7_4_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___b_e_g_i_n │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ +750{ return _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _eh); } │ │ │ │ +751 │ │ │ │ +_7_5_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___b_e_g_i_n(_E_d_g_e_H_a_n_d_l_e │ │ │ │ +_eh) │ │ │ │ +753{ return _E_d_g_e_F_a_c_e_I_t_e_r(*this, _eh); } │ │ │ │ +754 │ │ │ │ +755 │ │ │ │ +_7_5_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___b_e_g_i_n │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +757{ return _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r(*this, _eh); } │ │ │ │ +758 │ │ │ │ +_7_5_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___b_e_g_i_n │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +760{ return _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _eh); } │ │ │ │ +761 │ │ │ │ +_7_6_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___b_e_g_i_n │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +763{ return _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r(*this, _eh); } │ │ │ │ +764 │ │ │ │ +765 │ │ │ │ +766// 'end' circulators │ │ │ │ +767 │ │ │ │ +_7_6_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +769{ return _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r(*this, _vh, true); } │ │ │ │ +770 │ │ │ │ +_7_7_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +772{ return _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +773 │ │ │ │ +_7_7_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +775{ return _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +776 │ │ │ │ +_7_7_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +778{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +779 │ │ │ │ +_7_8_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +781{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +782 │ │ │ │ +_7_8_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +784{ return _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +785 │ │ │ │ +_7_8_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +787{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +788 │ │ │ │ +_7_8_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +790{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +791 │ │ │ │ +_7_9_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +793{ return _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +794 │ │ │ │ +_7_9_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +796{ return _V_e_r_t_e_x_E_d_g_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +797 │ │ │ │ +_7_9_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +799{ return _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +800 │ │ │ │ +_8_0_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +802{ return _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +803 │ │ │ │ +_8_0_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +805{ return _V_e_r_t_e_x_F_a_c_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +806 │ │ │ │ +_8_0_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +808{ return _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +809 │ │ │ │ +_8_1_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ +811{ return _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +812 │ │ │ │ +813 │ │ │ │ +_8_1_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +815{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r(*this, _vh, true); } │ │ │ │ +816 │ │ │ │ +_8_1_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +818{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +819 │ │ │ │ +_8_2_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_v___c_c_w_e_n_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +821{ return _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +822 │ │ │ │ +_8_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +824{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +825 │ │ │ │ +_8_2_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_w_e_n_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +827{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +828 │ │ │ │ +_8_2_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_i_h___c_c_w_e_n_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +830{ return _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +831 │ │ │ │ +_8_3_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +833{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +834 │ │ │ │ +_8_3_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_w_e_n_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +836{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +837 │ │ │ │ +_8_3_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_v_o_h___c_c_w_e_n_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +839{ return _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +840 │ │ │ │ +_8_4_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +842{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +843 │ │ │ │ +_8_4_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +845{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +846 │ │ │ │ +_8_4_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +848{ return _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +849 │ │ │ │ +_8_5_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +851{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r(*this, _vh, true); } │ │ │ │ +852 │ │ │ │ +_8_5_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +854{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +855 │ │ │ │ +_8_5_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_c_w_e_n_d │ │ │ │ +(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ +857{ return _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r(*this, _vh, true); } │ │ │ │ +858 │ │ │ │ +859 │ │ │ │ +_8_6_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___e_n_d(_F_a_c_e_H_a_n_d_l_e │ │ │ │ +_fh) │ │ │ │ +861{ return _F_a_c_e_V_e_r_t_e_x_I_t_e_r(*this, _fh, true); } │ │ │ │ +862 │ │ │ │ +_8_6_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +864{ return _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +865 │ │ │ │ +_8_6_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +867{ return _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +868 │ │ │ │ +_8_6_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +870{ return _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _fh, true); } │ │ │ │ +871 │ │ │ │ +_8_7_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +873{ return _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +874 │ │ │ │ +_8_7_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +876{ return _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +877 │ │ │ │ +_8_7_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___e_n_d(_F_a_c_e_H_a_n_d_l_e │ │ │ │ +_fh) │ │ │ │ +879{ return _F_a_c_e_E_d_g_e_I_t_e_r(*this, _fh, true); } │ │ │ │ +880 │ │ │ │ +_8_8_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +882{ return _F_a_c_e_E_d_g_e_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +883 │ │ │ │ +_8_8_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +885{ return _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +886 │ │ │ │ +_8_8_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___e_n_d(_F_a_c_e_H_a_n_d_l_e │ │ │ │ +_fh) │ │ │ │ +888{ return _F_a_c_e_F_a_c_e_I_t_e_r(*this, _fh, true); } │ │ │ │ +889 │ │ │ │ +_8_9_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +891{ return _F_a_c_e_F_a_c_e_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +892 │ │ │ │ +_8_9_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ +894{ return _F_a_c_e_F_a_c_e_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +895 │ │ │ │ +_8_9_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___e_n_d │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +897{ return _H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r(*this, _heh, true); } │ │ │ │ +898 │ │ │ │ +_8_9_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_w_e_n_d │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +900{ return _H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r(*this, _heh, true); } │ │ │ │ +901 │ │ │ │ +_9_0_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_c_w_e_n_d │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ +903{ return _H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r(*this, _heh, true); } │ │ │ │ +904 │ │ │ │ +905 │ │ │ │ +_9_0_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +907{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r(*this, _fh, true); } │ │ │ │ +908 │ │ │ │ +_9_0_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +910{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +911 │ │ │ │ +_9_1_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +913{ return _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +914 │ │ │ │ +_9_1_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +916{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _fh, true); } │ │ │ │ +917 │ │ │ │ +_9_1_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +919{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +920 │ │ │ │ +_9_2_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_f_h___c_c_w_e_n_d(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +922{ return _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +923 │ │ │ │ +_9_2_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +925{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r(*this, _fh, true); } │ │ │ │ +926 │ │ │ │ +_9_2_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +928{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +929 │ │ │ │ +_9_3_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +931{ return _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +932 │ │ │ │ +_9_3_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +934{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r(*this, _fh, true); } │ │ │ │ +935 │ │ │ │ +_9_3_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +937{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +938 │ │ │ │ +_9_3_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_e_n_d │ │ │ │ +(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ +940{ return _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r(*this, _fh, true); } │ │ │ │ +941 │ │ │ │ +_9_4_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___e_n_d │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +943{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r(*this, _heh, true); } │ │ │ │ +944 │ │ │ │ +_9_4_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_w_e_n_d │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +946{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r(*this, _heh, true); } │ │ │ │ +947 │ │ │ │ +_9_4_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ +_c_h_l___c_c_w_e_n_d(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ +949{ return _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r(*this, _heh, true); } │ │ │ │ +950 │ │ │ │ +951 │ │ │ │ +_9_5_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___e_n_d(_E_d_g_e_H_a_n_d_l_e │ │ │ │ +_eh) │ │ │ │ +953{ return _E_d_g_e_V_e_r_t_e_x_I_t_e_r(*this, _eh, true); } │ │ │ │ +954 │ │ │ │ +_9_5_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___e_n_d │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ +956{ return _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _eh, true); } │ │ │ │ +957 │ │ │ │ +_9_5_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___e_n_d(_E_d_g_e_H_a_n_d_l_e │ │ │ │ +_eh) │ │ │ │ +959{ return _E_d_g_e_F_a_c_e_I_t_e_r(*this, _eh, true); } │ │ │ │ +960 │ │ │ │ +961 │ │ │ │ +_9_6_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___e_n_d │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +963{ return _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r(*this, _eh, true); } │ │ │ │ +964 │ │ │ │ +_9_6_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___e_n_d │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +966{ return _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r(*this, _eh, true); } │ │ │ │ +967 │ │ │ │ +_9_6_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___e_n_d │ │ │ │ +(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ +969{ return _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r(*this, _eh, true); } │ │ │ │ +970 │ │ │ │ +971 │ │ │ │ +_9_7_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_f_a_c_e_s() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_f___r_a_n_g_e (*this); } │ │ │ │ +_9_7_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_f_a_c_e_s___c_w │ │ │ │ +() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_f___c_w___r_a_n_g_e (*this); } │ │ │ │ +_9_7_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_f_a_c_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_f___c_c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +975 │ │ │ │ +_9_7_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_e_d_g_e_s() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_e___r_a_n_g_e (*this); } │ │ │ │ +_9_7_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_e_d_g_e_s___c_w │ │ │ │ +() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_e___c_w___r_a_n_g_e (*this); } │ │ │ │ +_9_7_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_e_d_g_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_e___c_c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +979 │ │ │ │ +_9_8_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s │ │ │ │ +() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_v___r_a_n_g_e (*this); } │ │ │ │ +_9_8_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_v_e_r_t_i_c_e_s___c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_v___c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +_9_8_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_v_e_r_t_i_c_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_v_v___c_c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +983 │ │ │ │ +_9_8_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_v_i_h___r_a_n_g_e (*this); } │ │ │ │ +_9_8_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s___c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_v_i_h___c_w___r_a_n_g_e (*this); } │ │ │ │ +_9_8_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_v_i_h___c_c_w___r_a_n_g_e(*this); } │ │ │ │ +987 │ │ │ │ +_9_8_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s (_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); │ │ │ │ +return _m_e_s_h()->_v_i_h___r_a_n_g_e (_heh); } │ │ │ │ +_9_8_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s___c_w (_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); │ │ │ │ +return _m_e_s_h()->_v_i_h___c_w___r_a_n_g_e (_heh); } │ │ │ │ +_9_9_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s___c_c_w(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); │ │ │ │ +return _m_e_s_h()->_v_i_h___c_c_w___r_a_n_g_e(_heh); } │ │ │ │ +991 │ │ │ │ +_9_9_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_v_o_h___r_a_n_g_e (*this); } │ │ │ │ +_9_9_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s___c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_v_o_h___c_w___r_a_n_g_e (*this); } │ │ │ │ +_9_9_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_v_o_h___c_c_w___r_a_n_g_e(*this); } │ │ │ │ +995 │ │ │ │ +_9_9_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s (_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); │ │ │ │ +return _m_e_s_h()->_v_o_h___r_a_n_g_e (_heh); } │ │ │ │ +_9_9_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s___c_w (_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); │ │ │ │ +return _m_e_s_h()->_v_o_h___c_w___r_a_n_g_e (_heh); } │ │ │ │ +_9_9_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_: │ │ │ │ +_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s___c_c_w(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); │ │ │ │ +return _m_e_s_h()->_v_o_h___c_c_w___r_a_n_g_e(_heh); } │ │ │ │ +999 │ │ │ │ +1000 │ │ │ │ +_1_0_0_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_l_o_o_p() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_h_l___r_a_n_g_e (*this); } │ │ │ │ +_1_0_0_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_: │ │ │ │ +_l_o_o_p___c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_h_l___c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +_1_0_0_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_: │ │ │ │ +_l_o_o_p___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_h_l___c_c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +1004 │ │ │ │ +1005 │ │ │ │ +_1_0_0_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_v___r_a_n_g_e (*this); } │ │ │ │ +_1_0_0_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_: │ │ │ │ +_v_e_r_t_i_c_e_s___c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_v___c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +_1_0_0_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_: │ │ │ │ +_v_e_r_t_i_c_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_v___c_c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +1009 │ │ │ │ +_1_0_1_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s │ │ │ │ +() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_h___r_a_n_g_e (*this); } │ │ │ │ +_1_0_1_1inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_: │ │ │ │ +_h_a_l_f_e_d_g_e_s___c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_h___c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +_1_0_1_2inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_: │ │ │ │ +_h_a_l_f_e_d_g_e_s___c_c_w() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_h___c_c_w___r_a_n_g_e │ │ │ │ +(*this); } │ │ │ │ +1013 │ │ │ │ +_1_0_1_4inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_e_d_g_e_s() const │ │ │ │ +{ assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_e___r_a_n_g_e (*this); } │ │ │ │ +_1_0_1_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_e_d_g_e_s___c_w() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_e___c_w___r_a_n_g_e (*this); } │ │ │ │ +_1_0_1_6inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_e_d_g_e_s___c_c_w() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_e___c_c_w___r_a_n_g_e(*this); } │ │ │ │ +1017 │ │ │ │ +_1_0_1_8inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_f_a_c_e_s() const │ │ │ │ +{ assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_f___r_a_n_g_e (*this); } │ │ │ │ +_1_0_1_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_f_a_c_e_s___c_w() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_f___c_w___r_a_n_g_e (*this); } │ │ │ │ +_1_0_2_0inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_f_a_c_e_s___c_c_w() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_f_f___c_c_w___r_a_n_g_e(*this); } │ │ │ │ +1021 │ │ │ │ +1022 │ │ │ │ +_1_0_2_3inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s() │ │ │ │ +const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_e_v___r_a_n_g_e (*this); } │ │ │ │ +1024 │ │ │ │ +_1_0_2_5inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s │ │ │ │ +() const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_e_h___r_a_n_g_e (*this); } │ │ │ │ +1026 │ │ │ │ +_1_0_2_7inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s │ │ │ │ +(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const { assert(_m_e_s_h() != nullptr); return _m_e_s_h()- │ │ │ │ +>_e_h___r_a_n_g_e (_heh); } │ │ │ │ +1028 │ │ │ │ +_1_0_2_9inline _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_f_a_c_e_s() const │ │ │ │ +{ assert(_m_e_s_h() != nullptr); return _m_e_s_h()->_e_f___r_a_n_g_e (*this); } │ │ │ │ +1030 │ │ │ │ +1031}//namespace OpenMesh │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ -osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ -Adapter for osg vector member computing a scalar product. │ │ │ │ -DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_a_n_g_l_e │ │ │ │ -T angle(T _cos_angle, T _sin_angle) │ │ │ │ -returns the angle determined by its cos and the sign of its sin result is │ │ │ │ -positive if the angle is in... │ │ │ │ -DDeeffiinniittiioonn MathDefs.hh:140 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_m_e_s_h___c_a_s_t │ │ │ │ -LHS mesh_cast(PolyMeshT< KERNEL > &rhs) │ │ │ │ -Cast a mesh with different but identical traits into each other. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:636 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_s_a_n_e___a_a_r_g │ │ │ │ -T sane_aarg(T _aarg) │ │ │ │ -Trigonometry/angles - related. │ │ │ │ -DDeeffiinniittiioonn MathDefs.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_M_e_s_h_C_a_s_t │ │ │ │ -Cast a mesh with different but identical traits into each other. │ │ │ │ -DDeeffiinniittiioonn FinalMeshItemsT.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___v_e_r_t_i_c_e_s │ │ │ │ +size_t n_vertices() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:345 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___e_d_g_e_s │ │ │ │ +size_t n_edges() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:347 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ +VertexHandle new_vertex() │ │ │ │ +Add a new vertex. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:216 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___f_a_c_e_s │ │ │ │ +size_t n_faces() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:348 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___h_a_l_f_e_d_g_e_s │ │ │ │ +size_t n_halfedges() const override │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn ArrayKernel.hh:346 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ +Generic class for iterator ranges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:305 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ +DDeeffiinniittiioonn CirculatorsT.hh:483 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Handle for a vertex entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ Handle for a halfedge entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ Handle for a edge entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ Handle for a face entity. │ │ │ │ DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ -Handle type for meshes to simplify some template programming. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ -Base type for a polygonal mesh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x │ │ │ │ -Kernel::Vertex Vertex │ │ │ │ -Vertex type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:124 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::FaceEdgeIter FaceEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:169 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d │ │ │ │ -void calc_face_centroid(FaceHandle _fh, Point &_pt) const │ │ │ │ -calculates the average of the vertices defining _fh │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:282 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceIter ConstFaceIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:151 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Kernel::VertexHandle VertexHandle │ │ │ │ -Handle for referencing the corresponding item. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ -Kernel::Scalar Scalar │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstVertexVertexIter ConstVertexVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:172 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ -void calc_edge_vector(HalfedgeHandle _heh, Normal &_edge_vec) const │ │ │ │ -Calculates the edge vector as the difference of the the points defined by │ │ │ │ -to_vertex_handle() and from... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:403 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ -SmartVertexHandle new_vertex(const Point _p) │ │ │ │ -Adds a new vertex initialized to a custom position. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:210 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:178 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::EdgeHandle EdgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::VertexFaceIter VertexFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:166 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstFaceVertexIter ConstFaceVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:177 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e │ │ │ │ -Kernel::Halfedge Halfedge │ │ │ │ -Halfedge type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:126 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t │ │ │ │ -void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const │ │ │ │ -Different methods for calculation of the normal at _vh: │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:497 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t │ │ │ │ -void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:507 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ -PolyMeshT() │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:185 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e │ │ │ │ -Scalar calc_dihedral_angle(EdgeHandle _eh) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:580 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_i_s___p_o_l_y_m_e_s_h │ │ │ │ -static constexpr bool is_polymesh() │ │ │ │ -Determine whether this is a PolyMeshT or TriMeshT (This function does not check │ │ │ │ -the per face vertex c... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:100 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::FaceIter FaceIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ -Kernel::Normal Normal │ │ │ │ -Normal type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::FaceVertexIter FaceVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:167 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t │ │ │ │ -Point calc_edge_midpoint(EdgeHandle _eh) const │ │ │ │ -Calculates the midpoint of the edge _eh, defined by the positions of the two │ │ │ │ -incident vertices. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:446 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ -SmartVertexHandle new_vertex() │ │ │ │ -Uses default copy and assignment operator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:201 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::VertexIHalfedgeIter VertexIHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:164 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:592 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ -PolyMeshT(const T &t) │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:187 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ -Kernel::TexCoord2D TexCoord2D │ │ │ │ -TexCoord2D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:120 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___a_r_e_a │ │ │ │ -Scalar calc_sector_area(HalfedgeHandle _in_heh) const │ │ │ │ -calculates the area of the face sector defined by the angle < │ │ │ │ -(_in_heh,next_halfedge(_in_heh)) NOTE: s... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:524 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s │ │ │ │ -void update_face_normals() │ │ │ │ -Update normal vectors for all faces. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:335 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s │ │ │ │ -void update_halfedge_normals(const double _feature_angle=0.8) │ │ │ │ -Update normal vectors for all halfedges. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:350 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s │ │ │ │ -unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0)) │ │ │ │ -tags an edge as a feature if its dihedral angle is larger than _angle_tresh │ │ │ │ -returns the number of the... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l │ │ │ │ -virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double │ │ │ │ -_feature_angle=0.8) const │ │ │ │ -Calculate halfedge normal for one specific halfedge. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:365 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___a_n_g_l_e │ │ │ │ -Scalar calc_sector_angle(HalfedgeHandle _in_heh) const │ │ │ │ -calculates the sector angle. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:469 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceEdgeIter ConstFaceEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:179 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ -Kernel::TexCoord3D TexCoord3D │ │ │ │ -TexCoord3D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l_s │ │ │ │ -void update_normals() │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:317 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexFaceIter ConstVertexFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::VertexOHalfedgeIter VertexOHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:163 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___c_e_n_t_r_o_i_d │ │ │ │ -Point calc_centroid(FaceHandle _fh) const │ │ │ │ -Computes and returns the average of the vertices defining _fh (same as │ │ │ │ -calc_face_centroid) │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:267 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::VertexEdgeIter VertexEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:165 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e │ │ │ │ -Scalar calc_dihedral_angle(HalfedgeHandle _heh) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:558 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e │ │ │ │ -Kernel::Face Face │ │ │ │ -Face type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:130 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:174 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ -virtual Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ -Calculate normal vector for face _fh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___l_e_n_g_t_h │ │ │ │ -Scalar calc_edge_length(EdgeHandle _eh) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:417 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstHalfedgeIter ConstHalfedgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:149 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l │ │ │ │ -void update_normal(VertexHandle _vh) │ │ │ │ -Update normal for vertex _vh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:341 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___v_e_c_t_o_r_s │ │ │ │ -void calc_sector_vectors(HalfedgeHandle _in_heh, Normal &_vec0, Normal &_vec1) │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn IteratorsT.hh:82 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_n_t_i_t_y_R_a_n_g_e │ │ │ │ +Generic class for vertex/halfedge/edge/face ranges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w___r_a_n_g_e │ │ │ │ +ConstFaceHalfedgeCWRange fh_cw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:239 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_w_b_e_g_i_n │ │ │ │ +ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const │ │ │ │ +const vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:611 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w_i_t_e_r │ │ │ │ +FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh) │ │ │ │ +face - halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:483 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1268 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d │ │ │ │ +EdgeIter edges_end() │ │ │ │ +End iterator for edges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:338 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, │ │ │ │ +FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity:: │ │ │ │ +cfv_end > > ConstFaceVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1273 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1288 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___b_e_g_i_n │ │ │ │ +VertexVertexIter vv_begin(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:562 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ +EdgeIter ConstEdgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:146 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_e_n_d │ │ │ │ +ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:939 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w_i_t_e_r │ │ │ │ +VertexVertexCCWIter vv_ccwiter(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:387 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___e_n_d │ │ │ │ +VertexVertexIter vv_end(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:768 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter │ │ │ │ +Enumerates incident edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:258 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w_i_t_e_r │ │ │ │ +FaceEdgeCWIter fe_cwiter(FaceHandle _fh) │ │ │ │ +face - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:492 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r │ │ │ │ +HalfedgeLoopCWIter ConstHalfedgeLoopCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:433 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w_i_t_e_r │ │ │ │ +FaceFaceCCWIter ff_ccwiter(FaceHandle _fh) │ │ │ │ +face - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:504 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___b_e_g_i_n │ │ │ │ +EdgeVertexIter ev_begin(EdgeHandle _eh) │ │ │ │ +edge - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:746 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, │ │ │ │ +FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity:: │ │ │ │ +cff_cwend > > ConstFaceFaceCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1290 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d │ │ │ │ +HalfedgeIter halfedges_end() │ │ │ │ +End iterator for halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:326 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___b_e_g_i_n │ │ │ │ +VertexFaceIter vf_begin(VertexHandle _vh) │ │ │ │ +vertex - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:598 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_e_n_d │ │ │ │ +ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const │ │ │ │ +const face - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:927 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___e_n_d │ │ │ │ +ConstFaceFaceIter cff_end(FaceHandle _fh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:933 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___r_a_n_g_e │ │ │ │ +ConstEdgeFaceRange ef_range(EdgeHandle _eh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:198 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w_i_t_e_r │ │ │ │ +FaceFaceCWIter ff_cwiter(FaceHandle _fh) │ │ │ │ +face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:501 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_c_w_e_n_d │ │ │ │ +VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:783 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___r_a_n_g_e │ │ │ │ +ConstHalfedgeLoopRange hl_range(HalfedgeHandle _heh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:202 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w_b_e_g_i_n │ │ │ │ +VertexFaceCWIter vf_cwbegin(VertexHandle _vh) │ │ │ │ +vertex - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:601 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:140 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w_b_e_g_i_n │ │ │ │ +FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh) │ │ │ │ +face - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:678 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w___r_a_n_g_e │ │ │ │ +ConstVertexVertexCWRange vv_cw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:207 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___i_t_e_r │ │ │ │ +ConstVertexVertexIter cvv_iter(VertexHandle _vh) const │ │ │ │ +const vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:426 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1299 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1293 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w_e_n_d │ │ │ │ +FaceHalfedgeCWIter fh_cwend(FaceHandle _fh) │ │ │ │ +face - halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:872 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +VertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:285 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___e_n_d │ │ │ │ +ConstFaceEdgeIter cfe_end(FaceHandle _fh) const │ │ │ │ +const face - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:924 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w_b_e_g_i_n │ │ │ │ +VertexEdgeCWIter ve_cwbegin(VertexHandle _vh) │ │ │ │ +vertex - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:592 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_c_w_i_t_e_r │ │ │ │ +ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:441 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +FaceFaceIter ConstFaceFaceIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:378 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:180 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n │ │ │ │ +VertexIter vertices_sbegin() │ │ │ │ +Begin iterator for vertices. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:357 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___e_n_d │ │ │ │ +FaceHalfedgeIter fh_end(FaceHandle _fh) │ │ │ │ +face - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:869 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w_i_t_e_r │ │ │ │ +VertexFaceCWIter vf_cwiter(VertexHandle _vh) │ │ │ │ +vertex - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:420 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___b_e_g_i_n │ │ │ │ +ConstEdgeFaceIter cef_begin(EdgeHandle _eh) const │ │ │ │ +const edge - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:762 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n │ │ │ │ +HalfedgeIter halfedges_sbegin() │ │ │ │ +Begin iterator for halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:363 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___e_n_d │ │ │ │ +ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:915 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_e_n_d │ │ │ │ +ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:936 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter │ │ │ │ +Enumerate incident vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:316 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w_b_e_g_i_n │ │ │ │ +FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh) │ │ │ │ +face - halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:669 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_c_w_b_e_g_i_n │ │ │ │ +HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh) │ │ │ │ +halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:696 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n │ │ │ │ +HalfedgeIter halfedges_begin() │ │ │ │ +Begin iterator for halfedges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:320 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:57 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___i_t_e_r │ │ │ │ +ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:516 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r │ │ │ │ +FaceFaceCWIter ConstFaceFaceCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:379 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_b_e_g_i_n │ │ │ │ +ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const │ │ │ │ +const face - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:733 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_w_i_t_e_r │ │ │ │ +ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:519 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:374 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n │ │ │ │ +EdgeIter edges_sbegin() │ │ │ │ +Begin iterator for edges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:369 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1282 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1295 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > │ │ │ │ +> ConstEdgeRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1189 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w_e_n_d │ │ │ │ +VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:780 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n │ │ │ │ +EdgeIter edges_begin() │ │ │ │ +Begin iterator for edges. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:332 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w_i_t_e_r │ │ │ │ +FaceVertexCWIter fv_cwiter(FaceHandle _fh) │ │ │ │ +face - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:474 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___r_a_n_g_e │ │ │ │ +ConstFaceFaceRange ff_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:182 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_w_e_n_d │ │ │ │ +ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:826 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s___e_d_g_e___h_a_n_d_l_e │ │ │ │ +static SmartEdgeHandle s_edge_handle(SmartHalfedgeHandle _heh) │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:62 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_c_w_b_e_g_i_n │ │ │ │ +ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:641 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_w_e_n_d │ │ │ │ +ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const │ │ │ │ +const vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:817 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___r_a_n_g_e │ │ │ │ +ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:154 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___b_e_g_i_n │ │ │ │ +FaceVertexIter fv_begin(FaceHandle _fh) │ │ │ │ +face - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:654 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1287 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w_e_n_d │ │ │ │ +VertexEdgeCWIter ve_cwend(VertexHandle _vh) │ │ │ │ +vertex - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:798 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w_i_t_e_r │ │ │ │ +FaceVertexCCWIter fv_ccwiter(FaceHandle _fh) │ │ │ │ +face - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:477 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_c_w_b_e_g_i_n │ │ │ │ +ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const │ │ │ │ +const vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:614 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___i_t_e_r │ │ │ │ +EdgeVertexIter ev_iter(EdgeHandle _eh) │ │ │ │ +edge - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:543 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___b_e_g_i_n │ │ │ │ +ConstEdgeVertexIter cev_begin(EdgeHandle _eh) const │ │ │ │ +const edge - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:756 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_w_b_e_g_i_n │ │ │ │ +HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh) │ │ │ │ +halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:693 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w_e_n_d │ │ │ │ +FaceFaceCWIter ff_cwend(FaceHandle _fh) │ │ │ │ +face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:890 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +VertexVertexCCWIter ConstVertexVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:281 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1269 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___i_t_e_r │ │ │ │ +FaceFaceIter ff_iter(FaceHandle _fh) │ │ │ │ +face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:498 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___e_n_d │ │ │ │ +ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:942 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w_e_n_d │ │ │ │ +FaceVertexCWIter fv_cwend(FaceHandle _fh) │ │ │ │ +face - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:863 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_w_e_n_d │ │ │ │ +ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const │ │ │ │ +const face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:945 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:139 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > │ │ │ │ +ConstFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1194 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w_i_t_e_r │ │ │ │ +VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:402 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_c_w_e_n_d │ │ │ │ +ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const │ │ │ │ +const face - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:948 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, │ │ │ │ +FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity:: │ │ │ │ +cff_ccwend > > ConstFaceFaceCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1301 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1283 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_c_w___r_a_n_g_e │ │ │ │ +ConstHalfedgeLoopCCWRange hl_ccw_range(HalfedgeHandle _heh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_c_w_b_e_g_i_n │ │ │ │ +ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:715 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___b_e_g_i_n │ │ │ │ +HalfedgeLoopIter hl_begin(HalfedgeHandle _heh) │ │ │ │ +halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:690 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > │ │ │ │ +VertexIHalfedgeIter │ │ │ │ +Enumerates incoming half edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:213 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity:: │ │ │ │ +vertices_end > > ConstVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1164 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +FaceFaceCCWIter ConstFaceFaceCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:380 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:283 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r │ │ │ │ +FaceEdgeCWIter ConstFaceEdgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:376 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___r_a_n_g_e │ │ │ │ +ConstFaceEdgeRange fe_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:178 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_c_w_i_t_e_r │ │ │ │ +VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:405 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1284 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_i_t_e_r │ │ │ │ +ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const │ │ │ │ +const face - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:528 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r │ │ │ │ +HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:434 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_p_r_e_v___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle prev_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:56 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_i_t_e_r │ │ │ │ +ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:465 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w_b_e_g_i_n │ │ │ │ +FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh) │ │ │ │ +face - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:660 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___i_t_e_r │ │ │ │ +ConstFaceVertexIter cfv_iter(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:507 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___b_e_g_i_n │ │ │ │ +VertexOHalfedgeIter voh_begin(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:580 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +VertexEdgeIter ConstVertexEdgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:291 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter │ │ │ │ +Enumerate incident half edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:321 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, │ │ │ │ +FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity:: │ │ │ │ +cfe_end > > ConstFaceEdgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1275 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > │ │ │ │ +VertexOHalfedgeIter │ │ │ │ +Enumerates outgoing half edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:194 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_e_n_d │ │ │ │ +ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const │ │ │ │ +const face - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:930 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___b_e_g_i_n │ │ │ │ +ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:709 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w___r_a_n_g_e │ │ │ │ +ConstFaceFaceCWRange ff_cw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:247 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r │ │ │ │ +HalfedgeLoopIter ConstHalfedgeLoopIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:432 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w___r_a_n_g_e │ │ │ │ +ConstVertexIHalfedgeCWRange vih_cw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:211 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___i_t_e_r │ │ │ │ +ConstFaceFaceIter cff_iter(FaceHandle _fh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:534 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_c_w_b_e_g_i_n │ │ │ │ +ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:650 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___e_n_d │ │ │ │ +ConstEdgeHalfedgeIter ceh_end(EdgeHandle _eh) const │ │ │ │ +const edge - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:965 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_c_w_i_t_e_r │ │ │ │ +ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:513 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1280 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w___r_a_n_g_e │ │ │ │ +ConstVertexEdgeCCWRange ve_ccw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:277 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +EdgeVertexIter ConstEdgeVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:425 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___b_e_g_i_n │ │ │ │ +ConstEdgeHalfedgeIter ceh_begin(EdgeHandle _eh) const │ │ │ │ +const edge - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:759 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_c_w_i_t_e_r │ │ │ │ +ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:450 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +VertexFaceIter ConstVertexFaceIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:288 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity:: │ │ │ │ +cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1285 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___b_e_g_i_n │ │ │ │ +EdgeFaceIter ef_begin(EdgeHandle _eh) │ │ │ │ +edge - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:752 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___h_a_l_f_e_d_g_e_s │ │ │ │ +ConstHalfedgeRange all_halfedges() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:126 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity:: │ │ │ │ +cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1296 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w_b_e_g_i_n │ │ │ │ +VertexVertexCWIter vv_cwbegin(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:565 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ +VertexIter ConstVertexIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:144 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_c_w_i_t_e_r │ │ │ │ +ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const │ │ │ │ +const vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:432 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter │ │ │ │ +Enumerates incident edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:253 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +FaceVertexIter ConstFaceVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:369 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___i_t_e_r │ │ │ │ +VertexVertexIter vv_iter(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:381 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_w_b_e_g_i_n │ │ │ │ +ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:629 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_c_w_b_e_g_i_n │ │ │ │ +ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:623 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s │ │ │ │ +ConstEdgeRangeSkipping edges() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:127 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, │ │ │ │ +FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity:: │ │ │ │ +cfe_cwend > > ConstFaceEdgeCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1289 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___e_n_d │ │ │ │ +EdgeVertexIter ev_end(EdgeHandle _eh) │ │ │ │ +edge - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:952 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:287 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r │ │ │ │ +VertexFaceCWIter ConstVertexFaceCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:289 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w___r_a_n_g_e │ │ │ │ +ConstVertexFaceCWRange vf_cw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:231 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w_b_e_g_i_n │ │ │ │ +VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:574 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, │ │ │ │ +VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity:: │ │ │ │ +cve_end > > ConstVertexEdgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1271 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___e_n_d │ │ │ │ +ConstEdgeFaceIter cef_end(EdgeHandle _eh) const │ │ │ │ +const edge - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:968 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___e_n_d │ │ │ │ +VertexIHalfedgeIter vih_end(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:777 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___r_a_n_g_e │ │ │ │ +ConstVertexEdgeRange ve_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:162 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r │ │ │ │ +EdgeFaceIter ConstEdgeFaceIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:427 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w___r_a_n_g_e │ │ │ │ +ConstVertexOHalfedgeCWRange voh_cw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:219 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter │ │ │ │ +Enumerate the halfedges of an edge. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:410 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_b_e_g_i_n │ │ │ │ +ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const │ │ │ │ +const face - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:724 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_c_w_i_t_e_r │ │ │ │ +ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:468 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w___r_a_n_g_e │ │ │ │ +ConstFaceEdgeCCWRange fe_ccw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:293 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w_i_t_e_r │ │ │ │ +VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh) │ │ │ │ +vertex - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:414 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___e_d_g_e_s │ │ │ │ +ConstEdgeRange all_edges() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w_e_n_d │ │ │ │ +VertexEdgeCCWIter ve_ccwend(VertexHandle _vh) │ │ │ │ +vertex - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:801 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_s___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +static SmartHalfedgeHandle s_halfedge_handle(SmartEdgeHandle _eh, unsigned int │ │ │ │ +_i=0) │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:61 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___e_n_d │ │ │ │ +VertexEdgeIter ve_end(VertexHandle _vh) │ │ │ │ +vertex - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:795 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w___r_a_n_g_e │ │ │ │ +ConstFaceEdgeCWRange fe_cw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:243 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_w___r_a_n_g_e │ │ │ │ +ConstHalfedgeLoopCWRange hl_cw_range(HalfedgeHandle _heh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:251 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n │ │ │ │ +FaceIter faces_sbegin() │ │ │ │ +Begin iterator for faces. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:375 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > │ │ │ │ +VertexOHalfedgeCCWIter │ │ │ │ +Enumerates outgoing half edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:200 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___e_n_d │ │ │ │ +FaceVertexIter fv_end(FaceHandle _fh) │ │ │ │ +face - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:860 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w_e_n_d │ │ │ │ +VertexFaceCCWIter vf_ccwend(VertexHandle _vh) │ │ │ │ +vertex - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:810 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter │ │ │ │ +Enumerates incident faces in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:233 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, │ │ │ │ +&ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:141 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_v___r_a_n_g_e │ │ │ │ +ConstEdgeVertexRange ev_range(EdgeHandle _eh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:186 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_c_w___r_a_n_g_e │ │ │ │ +ConstVertexIHalfedgeCCWRange vih_ccw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:261 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___b_e_g_i_n │ │ │ │ +ConstFaceVertexIter cfv_begin(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:700 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_n_e_x_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle next_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:55 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +EdgeHalfedgeIter ConstEdgeHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:426 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___i_t_e_r │ │ │ │ +ConstVertexEdgeIter cve_iter(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:453 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_i_t_e_r │ │ │ │ +ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const │ │ │ │ +const face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:537 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_w_e_n_d │ │ │ │ +VertexFaceCWIter vf_cwend(VertexHandle _vh) │ │ │ │ +vertex - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:807 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___e_n_d │ │ │ │ +ConstEdgeVertexIter cev_end(EdgeHandle _eh) const │ │ │ │ +const edge - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:962 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___i_t_e_r │ │ │ │ +ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const │ │ │ │ +const face - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:525 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_c_w_e_n_d │ │ │ │ +ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:912 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w_b_e_g_i_n │ │ │ │ +FaceEdgeCWIter fe_cwbegin(FaceHandle _fh) │ │ │ │ +face - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:675 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_w_i_t_e_r │ │ │ │ +VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:393 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w_i_t_e_r │ │ │ │ +FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh) │ │ │ │ +face - halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:486 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___b_e_g_i_n │ │ │ │ +ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const │ │ │ │ +const face - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:718 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter │ │ │ │ +Identical to FaceHalfedgeIter. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:277 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_w_b_e_g_i_n │ │ │ │ +FaceFaceCWIter ff_cwbegin(FaceHandle _fh) │ │ │ │ +face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:684 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:362 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_c_w___r_o_t_a_t_e_d___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle ccw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:58 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_i_t_e_r │ │ │ │ +ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:540 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___e_n_d │ │ │ │ +HalfedgeLoopIter hl_end(HalfedgeHandle _heh) │ │ │ │ +face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:896 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +FaceEdgeCCWIter ConstFaceEdgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:377 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___b_e_g_i_n │ │ │ │ +EdgeHalfedgeIter eh_begin(EdgeHandle _eh) │ │ │ │ +edge - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:749 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w___r_a_n_g_e │ │ │ │ +ConstVertexFaceCCWRange vf_ccw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:281 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_c_w_e_n_d │ │ │ │ +VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:792 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_i_t_e_r │ │ │ │ +ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:456 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_c_w_b_e_g_i_n │ │ │ │ +VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh) │ │ │ │ +vertex - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:595 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___i_t_e_r │ │ │ │ +VertexOHalfedgeIter voh_iter(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:399 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_i_t_e_r │ │ │ │ +ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:510 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_c_w_b_e_g_i_n │ │ │ │ +ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:632 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s │ │ │ │ +ConstHalfedgeRangeSkipping halfedges() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:125 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w___r_a_n_g_e │ │ │ │ +ConstVertexEdgeCWRange ve_cw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:227 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter │ │ │ │ +Identical to FaceHalfedgeIter. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:272 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > │ │ │ │ +ConstEdgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1184 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___b_e_g_i_n │ │ │ │ +FaceEdgeIter fe_begin(FaceHandle _fh) │ │ │ │ +face - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:672 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w_b_e_g_i_n │ │ │ │ +VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:583 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___i_t_e_r │ │ │ │ +EdgeFaceIter ef_iter(EdgeHandle _eh) │ │ │ │ +edge - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:549 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, │ │ │ │ +FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity:: │ │ │ │ +cfe_ccwend > > ConstFaceEdgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1300 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:284 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___e_n_d │ │ │ │ +FaceEdgeIter fe_end(FaceHandle _fh) │ │ │ │ +face - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:878 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___e_n_d │ │ │ │ +FaceFaceIter ff_end(FaceHandle _fh) │ │ │ │ +face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:887 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity:: │ │ │ │ +halfedges_end > > ConstHalfedgeRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1179 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e___h_a_n_d_l_e │ │ │ │ +SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___b_e_g_i_n │ │ │ │ +ConstFaceFaceIter cff_begin(FaceHandle _fh) const │ │ │ │ +const face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:727 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +FaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:372 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_c_w_e_n_d │ │ │ │ +ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:856 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter │ │ │ │ +Enumerate incident vertices in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:310 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_c_w_e_n_d │ │ │ │ +ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const │ │ │ │ +const vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:820 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___e_n_d │ │ │ │ +VertexOHalfedgeIter voh_end(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:786 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___i_t_e_r │ │ │ │ +FaceEdgeIter fe_iter(FaceHandle _fh) │ │ │ │ +face - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:489 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n │ │ │ │ +VertexIter vertices_begin() │ │ │ │ +Begin iterator for vertices. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:308 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity:: │ │ │ │ +cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1286 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:234 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +HalfedgeIter ConstHalfedgeIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:145 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_c_w_e_n_d │ │ │ │ +ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:847 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___i_t_e_r │ │ │ │ +ConstEdgeFaceIter cef_iter(EdgeHandle _eh) const │ │ │ │ +const edge - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:558 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___r_a_n_g_e │ │ │ │ +ConstFaceVertexRange fv_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:170 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___e_n_d │ │ │ │ +ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:823 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_w_i_t_e_r │ │ │ │ +ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:447 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___i_t_e_r │ │ │ │ +ConstVertexFaceIter cvf_iter(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:462 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_b_e_g_i_n │ │ │ │ +ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const │ │ │ │ +const face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:730 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > │ │ │ │ +VertexIHalfedgeCCWIter │ │ │ │ +Enumerates incoming half edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:219 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +FaceVertexCCWIter ConstFaceVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:371 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1270 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1278 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_c_w_i_t_e_r │ │ │ │ +ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:522 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity:: │ │ │ │ +vertices_end > > ConstVertexRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___v_e_r_t_i_c_e_s │ │ │ │ +ConstVertexRange all_vertices() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:254 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___e_n_d │ │ │ │ +EdgeHalfedgeIter eh_end(EdgeHandle _eh) │ │ │ │ +edge - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:955 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___e_n_d │ │ │ │ +ConstVertexVertexIter cvv_end(VertexHandle _vh) const │ │ │ │ +const vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:814 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w_e_n_d │ │ │ │ +VertexVertexCCWIter vv_ccwend(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:774 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w___r_a_n_g_e │ │ │ │ +ConstFaceFaceCCWRange ff_ccw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:297 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___r_a_n_g_e │ │ │ │ +ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:146 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +FaceEdgeIter ConstFaceEdgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:375 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle add_vertex() │ │ │ │ +Add a new vertex. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:53 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___b_e_g_i_n │ │ │ │ +ConstVertexFaceIter cvf_begin(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:644 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___i_t_e_r │ │ │ │ +ConstEdgeVertexIter cev_iter(EdgeHandle _eh) const │ │ │ │ +const edge - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:552 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:322 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_c_w_i_t_e_r │ │ │ │ +ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:459 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > │ │ │ │ +VertexIHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:214 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d │ │ │ │ +FaceIter faces_end() │ │ │ │ +End iterator for faces. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, │ │ │ │ +VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity:: │ │ │ │ +cvf_end > > ConstVertexFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1272 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w_b_e_g_i_n │ │ │ │ +FaceVertexCWIter fv_cwbegin(FaceHandle _fh) │ │ │ │ +face - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:657 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_w_e_n_d │ │ │ │ +ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:918 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w_i_t_e_r │ │ │ │ +FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh) │ │ │ │ +face - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:495 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_w_b_e_g_i_n │ │ │ │ +ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:620 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1294 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:311 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___b_e_g_i_n │ │ │ │ +ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const │ │ │ │ +const halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:736 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w_e_n_d │ │ │ │ +FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh) │ │ │ │ +face - halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:875 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___i_t_e_r │ │ │ │ +ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:444 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +VertexFaceCCWIter ConstVertexFaceCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:290 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_b_e_g_i_n │ │ │ │ +ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const │ │ │ │ +const face - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:721 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w___r_a_n_g_e │ │ │ │ +ConstVertexVertexCCWRange vv_ccw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:257 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s │ │ │ │ +ConstFaceRangeSkipping faces() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:129 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___b_e_g_i_n │ │ │ │ +FaceFaceIter ff_begin(FaceHandle _fh) │ │ │ │ +face - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:681 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___b_e_g_i_n │ │ │ │ +ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:617 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___b_e_g_i_n │ │ │ │ +ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:626 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +VertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:282 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_c_w_b_e_g_i_n │ │ │ │ +VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:568 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w_b_e_g_i_n │ │ │ │ +VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh) │ │ │ │ +vertex - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:604 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ +FaceIter ConstFaceIter │ │ │ │ +Linear iterator. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:147 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s │ │ │ │ +ConstVertexRangeSkipping vertices() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:123 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w_e_n_d │ │ │ │ +FaceVertexCCWIter fv_ccwend(FaceHandle _fh) │ │ │ │ +face - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:866 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_b_e_g_i_n │ │ │ │ +ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:647 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_w_i_t_e_r │ │ │ │ +ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const │ │ │ │ +const vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:429 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:286 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r │ │ │ │ +VertexEdgeCWIter ConstVertexEdgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:292 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:175 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, │ │ │ │ +EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity:: │ │ │ │ +cef_end > > ConstEdgeFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1279 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:65 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___c_c_w_i_t_e_r │ │ │ │ +VertexFaceCCWIter vf_ccwiter(VertexHandle _vh) │ │ │ │ +vertex - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:423 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w_i_t_e_r │ │ │ │ +VertexVertexCWIter vv_cwiter(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:384 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_c_w_e_n_d │ │ │ │ +ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:838 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___e_n_d │ │ │ │ +ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:832 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___b_e_g_i_n │ │ │ │ +VertexEdgeIter ve_begin(VertexHandle _vh) │ │ │ │ +vertex - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:589 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity:: │ │ │ │ +halfedges_end > > ConstHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter │ │ │ │ +Enumerate incident half edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:327 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_w_b_e_g_i_n │ │ │ │ +ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const │ │ │ │ +const halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:739 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +VertexVertexCWIter ConstVertexVertexCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:280 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___r_a_n_g_e │ │ │ │ +ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:174 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_b_e_g_i_n │ │ │ │ +ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:638 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_c_w_b_e_g_i_n │ │ │ │ +ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const │ │ │ │ +const halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:742 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +VertexEdgeCCWIter ConstVertexEdgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:293 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_c_w_b_e_g_i_n │ │ │ │ +ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:706 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ +VertexVertexIter ConstVertexVertexIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:279 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_c_w___r_a_n_g_e │ │ │ │ +ConstVertexOHalfedgeCCWRange voh_ccw_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:269 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___f_a_c_e___h_a_n_d_l_e │ │ │ │ +SmartFaceHandle opposite_face_handle(HalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:71 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w_e_n_d │ │ │ │ +FaceFaceCCWIter ff_ccwend(FaceHandle _fh) │ │ │ │ +face - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:893 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_w_e_n_d │ │ │ │ +ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const │ │ │ │ +const vertex - outgoing halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:835 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter │ │ │ │ +Enumerate adjacent faces in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:361 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_w___r_o_t_a_t_e_d___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle cw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +FaceHalfedgeCWIter ConstFaceHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:373 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1274 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter │ │ │ │ +Enumerate faces incident to an edge. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:423 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_w_e_n_d │ │ │ │ +HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh) │ │ │ │ +face - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:899 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_c_w_e_n_d │ │ │ │ +FaceEdgeCCWIter fe_ccwend(FaceHandle _fh) │ │ │ │ +face - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:884 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, │ │ │ │ +EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity:: │ │ │ │ +cev_end > > ConstEdgeVertexRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1277 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_c_w___r_a_n_g_e │ │ │ │ +ConstFaceHalfedgeCCWRange fh_ccw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:289 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:273 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_e_n_d │ │ │ │ +ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:909 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter │ │ │ │ +Enumerate adjacent faces in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:367 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_c_w_i_t_e_r │ │ │ │ +VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:396 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_f___c_c_w_b_e_g_i_n │ │ │ │ +FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh) │ │ │ │ +face - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:687 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___i_t_e_r │ │ │ │ +VertexIHalfedgeIter vih_iter(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:390 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter │ │ │ │ +Enumerate incident edges in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:341 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___b_e_g_i_n │ │ │ │ +ConstVertexVertexIter cvv_begin(VertexHandle _vh) const │ │ │ │ +const vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:608 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d │ │ │ │ +VertexIter vertices_end() │ │ │ │ +End iterator for vertices. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:314 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter │ │ │ │ +Enumerate incident edges in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:347 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___i_t_e_r │ │ │ │ +ConstEdgeHalfedgeIter ceh_iter(EdgeHandle _eh) const │ │ │ │ +const edge - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:555 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter │ │ │ │ +Enumerate vertices incident to an edge. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:397 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter │ │ │ │ +Enumerates incident faces in a counter clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:239 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___i_t_e_r │ │ │ │ +FaceHalfedgeIter fh_iter(FaceHandle _fh) │ │ │ │ +face - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:480 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___c_w_b_e_g_i_n │ │ │ │ +FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh) │ │ │ │ +face - halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:666 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___e_n_d │ │ │ │ +ConstVertexFaceIter cvf_end(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:850 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___i_t_e_r │ │ │ │ +VertexEdgeIter ve_iter(VertexHandle _vh) │ │ │ │ +vertex - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:408 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, │ │ │ │ +FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity:: │ │ │ │ +cff_end > > ConstFaceFaceRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1276 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n │ │ │ │ +FaceIter faces_begin() │ │ │ │ +Begin iterator for faces. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:344 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ +chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1291 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___e_n_d │ │ │ │ +ConstFaceVertexIter cfv_end(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:906 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_c_w_b_e_g_i_n │ │ │ │ +VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:586 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___r_a_n_g_e │ │ │ │ +ConstEdgeHalfedgeRange eh_range(EdgeHandle _eh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:190 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_h___b_e_g_i_n │ │ │ │ +FaceHalfedgeIter fh_begin(FaceHandle _fh) │ │ │ │ +face - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:663 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___b_e_g_i_n │ │ │ │ +ConstVertexEdgeIter cve_begin(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:635 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:342 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_i_t_e_r │ │ │ │ +ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const │ │ │ │ +const face - edge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:531 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_w_b_e_g_i_n │ │ │ │ +ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:712 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_w___r_a_n_g_e │ │ │ │ +ConstFaceVertexCWRange fv_cw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:235 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___r_a_n_g_e │ │ │ │ +ConstVertexVertexRange vv_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_l___c_c_w_e_n_d │ │ │ │ +HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh) │ │ │ │ +face - face circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:902 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity:: │ │ │ │ +cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1297 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_b_e_g_i_n │ │ │ │ +ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const │ │ │ │ +const face - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:703 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___i_t_e_r │ │ │ │ +FaceVertexIter fv_iter(FaceHandle _fh) │ │ │ │ +face - vertex circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:471 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e___c_w_i_t_e_r │ │ │ │ +VertexEdgeCWIter ve_cwiter(VertexHandle _vh) │ │ │ │ +vertex - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:411 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_c_w_e_n_d │ │ │ │ +ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const │ │ │ │ +const face - halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:921 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_o_h___c_w_e_n_d │ │ │ │ +VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh) │ │ │ │ +vertex - outgoing halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:789 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_w_i_t_e_r │ │ │ │ +ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:438 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_e_n_d │ │ │ │ +ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const │ │ │ │ +const vertex - face circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:853 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_e___c_w_e_n_d │ │ │ │ +FaceEdgeCWIter fe_cwend(FaceHandle _fh) │ │ │ │ +face - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:881 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___i_t_e_r │ │ │ │ +ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:435 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_h___i_t_e_r │ │ │ │ +EdgeHalfedgeIter eh_iter(EdgeHandle _eh) │ │ │ │ +edge - halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:546 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_f___e_n_d │ │ │ │ +EdgeFaceIter ef_end(EdgeHandle _eh) │ │ │ │ +edge - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:958 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ +EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ +ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > │ │ │ │ +> ConstFaceRangeSkipping │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1199 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___b_e_g_i_n │ │ │ │ +VertexIHalfedgeIter vih_begin(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:571 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___e_n_d │ │ │ │ +VertexFaceIter vf_end(VertexHandle _vh) │ │ │ │ +vertex - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:804 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___f_a_c_e_s │ │ │ │ +ConstFaceRange all_faces() const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:130 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_i_h___c_c_w_b_e_g_i_n │ │ │ │ +VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh) │ │ │ │ +vertex - incoming halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:577 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ +SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i=0) │ │ │ │ const │ │ │ │ -defines a consistent representation of a sector geometry: the halfedge _in_heh │ │ │ │ -defines the sector ori... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:458 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x___d_i_r_t_y │ │ │ │ -SmartVertexHandle add_vertex_dirty(const Point _p) │ │ │ │ -Alias for new_vertex_dirty(). │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:242 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::FaceFaceIter FaceFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:170 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e │ │ │ │ -bool is_estimated_feature_edge(HalfedgeHandle _heh, const double │ │ │ │ -_feature_angle) const │ │ │ │ -identifies feature edges w.r.t. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:452 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ -Normal calc_edge_vector(EdgeHandle _eh) const │ │ │ │ -Calculates the edge vector as the vector defined by the halfedge with id #0 │ │ │ │ -(see below) │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:396 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_~_P_o_l_y_M_e_s_h_T │ │ │ │ -virtual ~PolyMeshT() │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:188 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexEdgeIter ConstVertexEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:175 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h │ │ │ │ -Scalar calc_edge_sqr_length(HalfedgeHandle _heh) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:428 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ -SmartVertexHandle add_vertex(const Point _p) │ │ │ │ -Alias for new_vertex(const Point&). │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:238 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ -void calc_edge_vector(EdgeHandle _eh, Normal &_edge_vec) const │ │ │ │ -Calculates the edge vector as the vector defined by the halfedge with id #0 │ │ │ │ -(see below) │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:389 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e │ │ │ │ -Kernel::Edge Edge │ │ │ │ -Edge type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Kernel::FaceHandle FaceHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l │ │ │ │ -void update_normal(FaceHandle _fh) │ │ │ │ -Update normal for face _fh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:261 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t │ │ │ │ -Scalar calc_dihedral_angle_fast(EdgeHandle _eh) const │ │ │ │ -calculates the dihedral angle on the edge _eh │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:554 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p │ │ │ │ -void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:538 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(EdgeHandle _eh, const Point &_p) │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:595 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::EdgeIter EdgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l │ │ │ │ -void update_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) │ │ │ │ -Update normal for halfedge _heh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:305 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstEdgeIter ConstEdgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:150 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstVertexIter ConstVertexIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:148 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s │ │ │ │ -void update_vertex_normals() │ │ │ │ -Update normal vectors for all vertices. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:572 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___n_o_r_m_a_l │ │ │ │ -void calc_sector_normal(HalfedgeHandle _in_heh, Normal &_sector_normal) const │ │ │ │ -calculates the normal (non-normalized) of the face sector defined by the angle │ │ │ │ -<(_in_heh,... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:514 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:173 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___v_e_c_t_o_r │ │ │ │ -Normal calc_edge_vector(HalfedgeHandle _heh) const │ │ │ │ -Calculates the edge vector as the difference of the the points defined by │ │ │ │ -to_vertex_handle() and from... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:410 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___s_q_r___l_e_n_g_t_h │ │ │ │ -Scalar calc_edge_sqr_length(EdgeHandle _eh) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:425 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___m_i_d_p_o_i_n_t │ │ │ │ -Point calc_edge_midpoint(HalfedgeHandle _heh) const │ │ │ │ -Calculates the midpoint of the halfedge _heh, defined by the positions of the │ │ │ │ -two incident vertices. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:437 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::VertexVertexIter VertexVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:162 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:598 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::HalfedgeIter HalfedgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:144 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___e_d_g_e___l_e_n_g_t_h │ │ │ │ -Scalar calc_edge_length(HalfedgeHandle _heh) const │ │ │ │ -Calculates the length of the edge _heh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:422 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::FaceHalfedgeIter FaceHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:168 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ -Kernel::Point Point │ │ │ │ -Coordinate type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_h_i_s │ │ │ │ -PolyMeshT< Kernel > This │ │ │ │ -Self type. Used to specify iterators/circulators. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceFaceIter ConstFaceFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:180 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(FaceHandle _fh, const Point &_p) │ │ │ │ -Face split (= 1-to-n split) │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:589 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ -Kernel::Color Color │ │ │ │ -Color type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_1_D │ │ │ │ -Kernel::TexCoord1D TexCoord1D │ │ │ │ -TexCoord1D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:118 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___n_o_r_m_a_l │ │ │ │ -Normal calc_normal(FaceHandle _fh) const │ │ │ │ -same as calc_face_normal │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:187 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::VertexIter VertexIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x___d_i_r_t_y │ │ │ │ -SmartVertexHandle new_vertex_dirty(const Point _p) │ │ │ │ -Same as new_vertex(const Point&) but never shrinks, only enlarges the vertex │ │ │ │ -property vectors. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:228 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___d_i_h_e_d_r_a_l___a_n_g_l_e___f_a_s_t │ │ │ │ -Scalar calc_dihedral_angle_fast(HalfedgeHandle _heh) const │ │ │ │ -calculates the dihedral angle on the halfedge _heh │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:533 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l │ │ │ │ -Normal calc_vertex_normal(VertexHandle _vh) const │ │ │ │ -Calculate vertex normal for one specific vertex. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:483 │ │ │ │ +returns the face handle of the opposite halfedge │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:64 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e │ │ │ │ +CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ +ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ +cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:1298 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_v___c_w_e_n_d │ │ │ │ +VertexVertexCWIter vv_cwend(VertexHandle _vh) │ │ │ │ +vertex - vertex circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:771 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___i_t_e_r │ │ │ │ +VertexFaceIter vf_iter(VertexHandle _vh) │ │ │ │ +vertex - face circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:417 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_v___c_c_w___r_a_n_g_e │ │ │ │ +ConstFaceVertexCCWRange fv_ccw_range(FaceHandle _fh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:285 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_e_n_d │ │ │ │ +ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator cw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:844 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___e_n_d │ │ │ │ +ConstVertexEdgeIter cve_end(VertexHandle _vh) const │ │ │ │ +const vertex - edge circulator │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:841 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ +FaceVertexCWIter ConstFaceVertexCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:370 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ +Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > │ │ │ │ +VertexOHalfedgeCWIter │ │ │ │ +Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:195 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_c_w_e_n_d │ │ │ │ +ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const │ │ │ │ +const vertex - incoming halfedge circulator ccw │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:829 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_f___r_a_n_g_e │ │ │ │ +ConstVertexFaceRange vf_range(VertexHandle _vh) const │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:166 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_B_a_s_e_H_a_n_d_l_e_:_:_m_e_s_h │ │ │ │ +const PolyConnectivity * mesh() const │ │ │ │ +Get the underlying mesh of this handle. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:69 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ allows easier access t... │ │ │ │ DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_e_d_g_e_s___c_w │ │ │ │ +PolyConnectivity::ConstVertexEdgeCWRange edges_cw() const │ │ │ │ +Returns a range of edges incident to the vertex (PolyConnectivity::ve_cw_range │ │ │ │ +()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:977 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_f_a_c_e_s___c_w │ │ │ │ +PolyConnectivity::ConstVertexFaceCWRange faces_cw() const │ │ │ │ +Returns a range of faces incident to the vertex (PolyConnectivity::vf_cw_range │ │ │ │ +()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:973 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s │ │ │ │ +PolyConnectivity::ConstVertexIHalfedgeRange incoming_halfedges() const │ │ │ │ +Returns a range of outgoing halfedges incident to the vertex │ │ │ │ +(PolyConnectivity::voh_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:984 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s___c_w │ │ │ │ +PolyConnectivity::ConstVertexIHalfedgeCWRange incoming_halfedges_cw() const │ │ │ │ +Returns a range of outgoing halfedges incident to the vertex │ │ │ │ +(PolyConnectivity::voh_cw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:985 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstVertexVertexCCWRange vertices_ccw() const │ │ │ │ +Returns a range of vertices adjacent to the vertex (PolyConnectivity:: │ │ │ │ +vv_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:982 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s___c_w │ │ │ │ +PolyConnectivity::ConstVertexVertexCWRange vertices_cw() const │ │ │ │ +Returns a range of vertices adjacent to the vertex (PolyConnectivity:: │ │ │ │ +vv_cw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:981 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s │ │ │ │ +PolyConnectivity::ConstVertexVertexRange vertices() const │ │ │ │ +Returns a range of vertices adjacent to the vertex (PolyConnectivity::vv_range │ │ │ │ +()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:980 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_e_d_g_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstVertexEdgeCCWRange edges_ccw() const │ │ │ │ +Returns a range of edges incident to the vertex (PolyConnectivity::ve_ccw_range │ │ │ │ +()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:978 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n_c_o_m_i_n_g___h_a_l_f_e_d_g_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstVertexIHalfedgeCCWRange incoming_halfedges_ccw() const │ │ │ │ +Returns a range of outgoing halfedges incident to the vertex │ │ │ │ +(PolyConnectivity::voh_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:986 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_f_a_c_e_s │ │ │ │ +PolyConnectivity::ConstVertexFaceRange faces() const │ │ │ │ +Returns a range of faces incident to the vertex (PolyConnectivity::vf_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:972 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s │ │ │ │ +PolyConnectivity::ConstVertexOHalfedgeRange outgoing_halfedges() const │ │ │ │ +Returns a range of incoming halfedges incident to the vertex │ │ │ │ +(PolyConnectivity::voh_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:992 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s___c_w │ │ │ │ +PolyConnectivity::ConstVertexOHalfedgeCWRange outgoing_halfedges_cw() const │ │ │ │ +Returns a range of incoming halfedges incident to the vertex │ │ │ │ +(PolyConnectivity::voh_cw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:993 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_f_a_c_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstVertexFaceCCWRange faces_ccw() const │ │ │ │ +Returns a range of faces incident to the vertex (PolyConnectivity::vf_ccw_range │ │ │ │ +()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:974 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t_g_o_i_n_g___h_a_l_f_e_d_g_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstVertexOHalfedgeCCWRange outgoing_halfedges_ccw() const │ │ │ │ +Returns a range of incoming halfedges incident to the vertex │ │ │ │ +(PolyConnectivity::voh_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:994 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_e_d_g_e_s │ │ │ │ +PolyConnectivity::ConstVertexEdgeRange edges() const │ │ │ │ +Returns a range of edges incident to the vertex (PolyConnectivity::ve_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:976 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:170 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_l_o_o_p │ │ │ │ +PolyConnectivity::ConstHalfedgeLoopRange loop() const │ │ │ │ +Returns a range of halfedges in the face of the halfedge (or along the │ │ │ │ +boundary) (PolyConnectivity::h... │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1001 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_l_o_o_p___c_c_w │ │ │ │ +PolyConnectivity::ConstHalfedgeLoopCCWRange loop_ccw() const │ │ │ │ +Returns a range of halfedges in the face of the halfedge (or along the │ │ │ │ +boundary) (PolyConnectivity::h... │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1003 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_l_o_o_p___c_w │ │ │ │ +PolyConnectivity::ConstHalfedgeLoopCWRange loop_cw() const │ │ │ │ +Returns a range of halfedges in the face of the halfedge (or along the │ │ │ │ +boundary) (PolyConnectivity::h... │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1002 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:197 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s │ │ │ │ +PolyConnectivity::ConstEdgeHalfedgeRange halfedges() const │ │ │ │ +Returns a range of halfedges of the edge (PolyConnectivity::eh_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1025 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_f_a_c_e_s │ │ │ │ +PolyConnectivity::ConstEdgeFaceRange faces() const │ │ │ │ +Returns a range of faces incident to the edge (PolyConnectivity::ef_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1029 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s │ │ │ │ +PolyConnectivity::ConstEdgeVertexRange vertices() const │ │ │ │ +Returns a range of vertices incident to the edge (PolyConnectivity::ev_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1023 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:228 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_f_a_c_e_s___c_w │ │ │ │ +PolyConnectivity::ConstFaceFaceCWRange faces_cw() const │ │ │ │ +Returns a range adjacent faces of the face (PolyConnectivity::ff_cw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1019 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_e_d_g_e_s │ │ │ │ +PolyConnectivity::ConstFaceEdgeRange edges() const │ │ │ │ +Returns a range of edges of the face (PolyConnectivity::fv_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1014 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s___c_w │ │ │ │ +PolyConnectivity::ConstFaceHalfedgeCWRange halfedges_cw() const │ │ │ │ +Returns a range of halfedges of the face (PolyConnectivity::fh_cw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1011 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_f_a_c_e_s │ │ │ │ +PolyConnectivity::ConstFaceFaceRange faces() const │ │ │ │ +Returns a range adjacent faces of the face (PolyConnectivity::ff_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1018 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s │ │ │ │ +PolyConnectivity::ConstFaceVertexRange vertices() const │ │ │ │ +Returns a range of vertices incident to the face (PolyConnectivity::fv_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1006 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_f_a_c_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstFaceFaceCCWRange faces_ccw() const │ │ │ │ +Returns a range adjacent faces of the face (PolyConnectivity::ff_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1020 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_e_d_g_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstFaceEdgeCCWRange edges_ccw() const │ │ │ │ +Returns a range of edges of the face (PolyConnectivity::fv_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1016 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_e_d_g_e_s___c_w │ │ │ │ +PolyConnectivity::ConstFaceEdgeCWRange edges_cw() const │ │ │ │ +Returns a range of edges of the face (PolyConnectivity::fv_cw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1015 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstFaceHalfedgeCCWRange halfedges_ccw() const │ │ │ │ +Returns a range of halfedges of the face (PolyConnectivity::fh_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1012 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e_s │ │ │ │ +PolyConnectivity::ConstFaceHalfedgeRange halfedges() const │ │ │ │ +Returns a range of halfedges of the face (PolyConnectivity::fh_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1010 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s___c_w │ │ │ │ +PolyConnectivity::ConstFaceVertexCWRange vertices_cw() const │ │ │ │ +Returns a range of vertices incident to the face (PolyConnectivity::fv_cw_range │ │ │ │ +()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1007 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_e_r_t_i_c_e_s___c_c_w │ │ │ │ +PolyConnectivity::ConstFaceVertexCCWRange vertices_ccw() const │ │ │ │ +Returns a range of vertices incident to the face (PolyConnectivity:: │ │ │ │ +fv_ccw_range()) │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:1008 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_R_a_n_g_e_T │ │ │ │ +Base class for all smart range types. │ │ │ │ +DDeeffiinniittiioonn SmartRange.hh:74 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00680_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/PolyConnectivity.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Templates/bla.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │
│ │ │ -
PolyConnectivity.hh
│ │ │ +
bla.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -138,1327 +138,71 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44#ifndef OPENMESH_POLYCONNECTIVITY_HH
│ │ │ -
45#define OPENMESH_POLYCONNECTIVITY_HH
│ │ │ -
46
│ │ │ -
47#include <OpenMesh/Core/Mesh/ArrayKernel.hh>
│ │ │ -
48#include <OpenMesh/Core/Mesh/SmartRange.hh>
│ │ │ -
49
│ │ │ -
50namespace OpenMesh
│ │ │ -
51{
│ │ │ +
44//=============================================================================
│ │ │ +
45//
│ │ │ +
46// CLASS bla
│ │ │ +
47//
│ │ │ +
48//=============================================================================
│ │ │ +
49#ifndef DOXY_IGNORE_THIS
│ │ │ +
50#ifndef OPENMESH_NEWCLASST_HH
│ │ │ +
51#define OPENMESH_NEWCLASST_HH
│ │ │
52
│ │ │ -
53namespace Iterators
│ │ │ -
54{
│ │ │ -
55 template <class Mesh, class ValueHandle, class MemberOwner, bool (MemberOwner::*PrimitiveStatusMember)() const, size_t (MemberOwner::*PrimitiveCountMember)() const>
│ │ │ -
56 class GenericIteratorT;
│ │ │ -
57
│ │ │ -
58 template<class Mesh>
│ │ │ -
59 class GenericCirculatorBaseT;
│ │ │ -
60
│ │ │ -
61 template<typename Traits>
│ │ │ -
62 class GenericCirculatorT_DEPRECATED;
│ │ │ +
53
│ │ │ +
54//== INCLUDES =================================================================
│ │ │ +
55
│ │ │ +
56
│ │ │ +
57//== FORWARDDECLARATIONS ======================================================
│ │ │ +
58
│ │ │ +
59
│ │ │ +
60//== NAMESPACES ===============================================================
│ │ │ +
61
│ │ │ +
62namespace OpenMesh {
│ │ │
63
│ │ │ -
64 template<typename Traits, bool CW>
│ │ │ -
65 class GenericCirculatorT;
│ │ │ -
66}
│ │ │ +
64
│ │ │ +
65//== CLASS DEFINITION =========================================================
│ │ │ +
66
│ │ │
67
│ │ │ -
68template <typename RangeTraitT>
│ │ │ -
69class EntityRange;
│ │ │ -
70
│ │ │ -
71template<
│ │ │ -
72 typename CONTAINER_T,
│ │ │ -
73 typename ITER_T,
│ │ │ -
74 ITER_T (CONTAINER_T::*begin_fn)() const,
│ │ │ -
75 ITER_T (CONTAINER_T::*end_fn)() const>
│ │ │ -
│ │ │ - │ │ │ -
77{
│ │ │ -
78 using CONTAINER_TYPE = CONTAINER_T;
│ │ │ -
79 using ITER_TYPE = ITER_T;
│ │ │ -
80 static ITER_TYPE begin(const CONTAINER_TYPE& _container) { return (_container.*begin_fn)(); }
│ │ │ -
81 static ITER_TYPE end(const CONTAINER_TYPE& _container) { return (_container.*end_fn)(); }
│ │ │ -
82};
│ │ │ -
│ │ │ -
83
│ │ │ +
68
│ │ │ +
69
│ │ │ +
77template <>
│ │ │ +
78class blaT
│ │ │ +
79{
│ │ │ +
80public:
│ │ │ +
81
│ │ │ +
83 blaT() {}
│ │ │
84
│ │ │ -
85template <typename CirculatorRangeTraitT>
│ │ │ -
86class CirculatorRange;
│ │ │ +
86 ~blaT() {}
│ │ │
87
│ │ │ -
88template<
│ │ │ -
89 typename CONTAINER_T,
│ │ │ -
90 typename ITER_T,
│ │ │ -
91 typename CENTER_ENTITY_T,
│ │ │ -
92 typename TO_ENTITY_T,
│ │ │ -
93 ITER_T (CONTAINER_T::*begin_fn)(CENTER_ENTITY_T) const,
│ │ │ -
94 ITER_T (CONTAINER_T::*end_fn)(CENTER_ENTITY_T) const>
│ │ │ -
│ │ │ - │ │ │ -
96{
│ │ │ -
97 using CONTAINER_TYPE = CONTAINER_T;
│ │ │ -
98 using ITER_TYPE = ITER_T;
│ │ │ -
99 using CENTER_ENTITY_TYPE = CENTER_ENTITY_T;
│ │ │ -
100 using TO_ENTITYE_TYPE = TO_ENTITY_T;
│ │ │ -
101 static ITER_TYPE begin(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*begin_fn)(_ce); }
│ │ │ -
102 static ITER_TYPE begin(const CONTAINER_TYPE& _container, HalfedgeHandle _heh, int) { return ITER_TYPE(_container, _heh); }
│ │ │ -
103 static ITER_TYPE end(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE _ce) { return (_container.*end_fn)(_ce); }
│ │ │ -
104 static ITER_TYPE end(const CONTAINER_TYPE& _container, HalfedgeHandle _heh, int) { return ITER_TYPE(_container, _heh, true); }
│ │ │ -
105};
│ │ │ -
│ │ │ -
106
│ │ │ -
107struct SmartVertexHandle;
│ │ │ - │ │ │ -
109struct SmartEdgeHandle;
│ │ │ -
110struct SmartFaceHandle;
│ │ │ -
111
│ │ │ -
│ │ │ -
114class OPENMESHDLLEXPORT PolyConnectivity : public ArrayKernel
│ │ │ -
115{
│ │ │ -
116public:
│ │ │ -
118
│ │ │ -
119
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
128
│ │ │ - │ │ │ -
130
│ │ │ -
131 //--- iterators ---
│ │ │ -
132
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
143
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
149
│ │ │ -
150 //--- circulators ---
│ │ │ -
151
│ │ │ -
157
│ │ │ -
158 /*
│ │ │ -
159 * Vertex-centered circulators
│ │ │ -
160 */
│ │ │ -
161
│ │ │ -
│ │ │ - │ │ │ -
163 {
│ │ │ -
164 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
167 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->to_vertex_handle(_heh);}
│ │ │ -
168 };
│ │ │ -
│ │ │ -
169
│ │ │ -
170
│ │ │ - │ │ │ - │ │ │ -
176
│ │ │ - │ │ │ -
181
│ │ │ -
182
│ │ │ -
│ │ │ - │ │ │ -
184 {
│ │ │ -
185 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
188 static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh;}
│ │ │ -
189 };
│ │ │ -
│ │ │ -
190
│ │ │ - │ │ │ - │ │ │ -
196
│ │ │ - │ │ │ -
201
│ │ │ -
│ │ │ - │ │ │ -
203 {
│ │ │ -
204 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
207 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return _mesh->opposite_halfedge_handle(_heh); }
│ │ │ -
208 };
│ │ │ -
│ │ │ -
209
│ │ │ - │ │ │ - │ │ │ -
215
│ │ │ - │ │ │ -
220
│ │ │ -
221
│ │ │ -
│ │ │ - │ │ │ -
223 {
│ │ │ -
224 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
227 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
│ │ │ -
228 };
│ │ │ -
│ │ │ -
229
│ │ │ - │ │ │ - │ │ │ -
235
│ │ │ - │ │ │ -
240
│ │ │ -
241
│ │ │ -
│ │ │ - │ │ │ -
243 {
│ │ │ -
244 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
247 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
│ │ │ -
248 };
│ │ │ -
│ │ │ -
249
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
259
│ │ │ -
260
│ │ │ -
│ │ │ - │ │ │ -
262 {
│ │ │ -
263 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
266 static ValueHandle toHandle(const Mesh* const /*_mesh*/, This::HalfedgeHandle _heh) { return _heh; }
│ │ │ -
267 };
│ │ │ -
│ │ │ -
268
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
278
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
294
│ │ │ -
295 /*
│ │ │ -
296 * Face-centered circulators
│ │ │ -
297 */
│ │ │ -
298
│ │ │ -
│ │ │ - │ │ │ -
300 {
│ │ │ -
301 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
304 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->to_vertex_handle(_heh); }
│ │ │ -
305 };
│ │ │ -
│ │ │ -
306
│ │ │ - │ │ │ - │ │ │ -
312
│ │ │ - │ │ │ -
317
│ │ │ - │ │ │ - │ │ │ -
323
│ │ │ - │ │ │ -
328
│ │ │ -
329
│ │ │ -
│ │ │ - │ │ │ -
331 {
│ │ │ -
332 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
335 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->edge_handle(_heh); }
│ │ │ -
336 };
│ │ │ -
│ │ │ -
337
│ │ │ - │ │ │ - │ │ │ -
343
│ │ │ - │ │ │ -
348
│ │ │ -
349
│ │ │ -
│ │ │ - │ │ │ -
351 {
│ │ │ -
352 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
355 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_mesh->opposite_halfedge_handle(_heh)); }
│ │ │ -
356 };
│ │ │ -
│ │ │ -
357
│ │ │ - │ │ │ - │ │ │ -
363
│ │ │ - │ │ │ -
368
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
381
│ │ │ -
382 /*
│ │ │ -
383 * Edge-centered circulators
│ │ │ -
384 */
│ │ │ -
385
│ │ │ -
│ │ │ - │ │ │ -
387 {
│ │ │ -
388 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
391 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->from_vertex_handle(_heh); }
│ │ │ -
392 };
│ │ │ -
│ │ │ -
393
│ │ │ - │ │ │ -
398
│ │ │ -
│ │ │ - │ │ │ -
400 {
│ │ │ -
401 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
404 static ValueHandle toHandle(const Mesh* const /* _mesh */, This::HalfedgeHandle _heh) { return _heh; }
│ │ │ -
405 };
│ │ │ -
│ │ │ -
406
│ │ │ - │ │ │ -
411
│ │ │ -
│ │ │ - │ │ │ -
413 {
│ │ │ -
414 using Mesh = This;
│ │ │ - │ │ │ - │ │ │ -
417 static ValueHandle toHandle(const Mesh* const _mesh, This::HalfedgeHandle _heh) { return static_cast<const ArrayKernel*>(_mesh)->face_handle(_heh); }
│ │ │ -
418 };
│ │ │ -
│ │ │ -
419
│ │ │ - │ │ │ -
424
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
428
│ │ │ -
429 /*
│ │ │ -
430 * Halfedge circulator
│ │ │ -
431 */
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
435
│ │ │ -
437
│ │ │ -
438 // --- shortcuts
│ │ │ -
439
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
449
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
454
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
459
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
488
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
520
│ │ │ -
521public:
│ │ │ -
522
│ │ │ - │ │ │ -
524 virtual ~PolyConnectivity() {}
│ │ │ -
525
│ │ │ -
│ │ │ -
526 inline static bool is_triangles()
│ │ │ -
527 { return false; }
│ │ │ -
│ │ │ -
528
│ │ │ -
│ │ │ -
531 inline void assign_connectivity(const PolyConnectivity& _other)
│ │ │ - │ │ │ -
│ │ │ -
533
│ │ │ -
537
│ │ │ -
539 inline SmartVertexHandle add_vertex();
│ │ │ -
540
│ │ │ -
548 SmartFaceHandle add_face(const std::vector<VertexHandle>& _vhandles);
│ │ │ -
549
│ │ │ -
557 SmartFaceHandle add_face(const std::vector<SmartVertexHandle>& _vhandles);
│ │ │ -
558
│ │ │ -
559
│ │ │ -
569 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2);
│ │ │ -
570
│ │ │ -
581 SmartFaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3);
│ │ │ -
582
│ │ │ -
591 SmartFaceHandle add_face(const VertexHandle* _vhandles, size_t _vhs_size);
│ │ │ -
592
│ │ │ -
594
│ │ │ -
596
│ │ │ -
597
│ │ │ -
602 bool is_collapse_ok(HalfedgeHandle _he);
│ │ │ -
603
│ │ │ -
604
│ │ │ -
610 void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true);
│ │ │ -
611
│ │ │ -
620 void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true);
│ │ │ -
621
│ │ │ -
632 void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true);
│ │ │ -
633
│ │ │ -
634
│ │ │ -
636
│ │ │ -
640
│ │ │ -
641 using ArrayKernel::next_halfedge_handle;
│ │ │ -
642 using ArrayKernel::prev_halfedge_handle;
│ │ │ -
643 using ArrayKernel::opposite_halfedge_handle;
│ │ │ -
644 using ArrayKernel::ccw_rotated_halfedge_handle;
│ │ │ -
645 using ArrayKernel::cw_rotated_halfedge_handle;
│ │ │ -
646
│ │ │ -
647 inline SmartHalfedgeHandle next_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ -
648 inline SmartHalfedgeHandle prev_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ -
649 inline SmartHalfedgeHandle opposite_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ -
650 inline SmartHalfedgeHandle ccw_rotated_halfedge_handle(SmartHalfedgeHandle _heh) const;
│ │ │ -
651 inline SmartHalfedgeHandle cw_rotated_halfedge_handle (SmartHalfedgeHandle _heh) const;
│ │ │ -
652
│ │ │ -
653 using ArrayKernel::s_halfedge_handle;
│ │ │ -
654 using ArrayKernel::s_edge_handle;
│ │ │ -
655
│ │ │ -
656 static SmartHalfedgeHandle s_halfedge_handle(SmartEdgeHandle _eh, unsigned int _i = 0);
│ │ │ -
657 static SmartEdgeHandle s_edge_handle(SmartHalfedgeHandle _heh);
│ │ │ -
658
│ │ │ -
659 using ArrayKernel::halfedge_handle;
│ │ │ -
660 using ArrayKernel::edge_handle;
│ │ │ -
661 using ArrayKernel::face_handle;
│ │ │ -
662
│ │ │ -
663 inline SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i = 0) const;
│ │ │ -
664 inline SmartHalfedgeHandle halfedge_handle(SmartFaceHandle _fh) const;
│ │ │ -
665 inline SmartHalfedgeHandle halfedge_handle(SmartVertexHandle _vh) const;
│ │ │ -
666 inline SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const;
│ │ │ -
667 inline SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const;
│ │ │ -
668
│ │ │ -
670 inline SmartFaceHandle opposite_face_handle(HalfedgeHandle _heh) const;
│ │ │ -
671
│ │ │ -
673
│ │ │ -
677
│ │ │ -
679 VertexIter vertices_begin();
│ │ │ -
681 ConstVertexIter vertices_begin() const;
│ │ │ -
683 VertexIter vertices_end();
│ │ │ -
685 ConstVertexIter vertices_end() const;
│ │ │ -
686
│ │ │ -
688 HalfedgeIter halfedges_begin();
│ │ │ -
690 ConstHalfedgeIter halfedges_begin() const;
│ │ │ -
692 HalfedgeIter halfedges_end();
│ │ │ -
694 ConstHalfedgeIter halfedges_end() const;
│ │ │ -
695
│ │ │ -
697 EdgeIter edges_begin();
│ │ │ -
699 ConstEdgeIter edges_begin() const;
│ │ │ -
701 EdgeIter edges_end();
│ │ │ -
703 ConstEdgeIter edges_end() const;
│ │ │ -
704
│ │ │ -
706 FaceIter faces_begin();
│ │ │ -
708 ConstFaceIter faces_begin() const;
│ │ │ -
710 FaceIter faces_end();
│ │ │ -
712 ConstFaceIter faces_end() const;
│ │ │ -
714
│ │ │ -
715
│ │ │ -
719
│ │ │ -
721 VertexIter vertices_sbegin();
│ │ │ -
723 ConstVertexIter vertices_sbegin() const;
│ │ │ -
724
│ │ │ -
726 HalfedgeIter halfedges_sbegin();
│ │ │ -
728 ConstHalfedgeIter halfedges_sbegin() const;
│ │ │ -
729
│ │ │ -
731 EdgeIter edges_sbegin();
│ │ │ -
733 ConstEdgeIter edges_sbegin() const;
│ │ │ -
734
│ │ │ -
736 FaceIter faces_sbegin();
│ │ │ -
738 ConstFaceIter faces_sbegin() const;
│ │ │ -
739
│ │ │ -
741
│ │ │ -
742 //--- circulators ---
│ │ │ -
743
│ │ │ -
747
│ │ │ -
749 VertexVertexIter vv_iter(VertexHandle _vh);
│ │ │ -
751 VertexVertexCWIter vv_cwiter(VertexHandle _vh);
│ │ │ -
753 VertexVertexCCWIter vv_ccwiter(VertexHandle _vh);
│ │ │ -
755 VertexIHalfedgeIter vih_iter(VertexHandle _vh);
│ │ │ -
757 VertexIHalfedgeCWIter vih_cwiter(VertexHandle _vh);
│ │ │ -
759 VertexIHalfedgeCCWIter vih_ccwiter(VertexHandle _vh);
│ │ │ -
761 VertexOHalfedgeIter voh_iter(VertexHandle _vh);
│ │ │ -
763 VertexOHalfedgeCWIter voh_cwiter(VertexHandle _vh);
│ │ │ -
765 VertexOHalfedgeCCWIter voh_ccwiter(VertexHandle _vh);
│ │ │ -
767 VertexEdgeIter ve_iter(VertexHandle _vh);
│ │ │ -
769 VertexEdgeCWIter ve_cwiter(VertexHandle _vh);
│ │ │ -
771 VertexEdgeCCWIter ve_ccwiter(VertexHandle _vh);
│ │ │ -
773 VertexFaceIter vf_iter(VertexHandle _vh);
│ │ │ -
775 VertexFaceCWIter vf_cwiter(VertexHandle _vh);
│ │ │ -
777 VertexFaceCCWIter vf_ccwiter(VertexHandle _vh);
│ │ │ -
778
│ │ │ -
780 ConstVertexVertexIter cvv_iter(VertexHandle _vh) const;
│ │ │ -
782 ConstVertexVertexCWIter cvv_cwiter(VertexHandle _vh) const;
│ │ │ -
784 ConstVertexVertexCCWIter cvv_ccwiter(VertexHandle _vh) const;
│ │ │ -
786 ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const;
│ │ │ -
788 ConstVertexIHalfedgeCWIter cvih_cwiter(VertexHandle _vh) const;
│ │ │ -
790 ConstVertexIHalfedgeCCWIter cvih_ccwiter(VertexHandle _vh) const;
│ │ │ -
792 ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const;
│ │ │ -
794 ConstVertexOHalfedgeCWIter cvoh_cwiter(VertexHandle _vh) const;
│ │ │ -
796 ConstVertexOHalfedgeCCWIter cvoh_ccwiter(VertexHandle _vh) const;
│ │ │ -
798 ConstVertexEdgeIter cve_iter(VertexHandle _vh) const;
│ │ │ -
800 ConstVertexEdgeCWIter cve_cwiter(VertexHandle _vh) const;
│ │ │ -
802 ConstVertexEdgeCCWIter cve_ccwiter(VertexHandle _vh) const;
│ │ │ -
804 ConstVertexFaceIter cvf_iter(VertexHandle _vh) const;
│ │ │ -
806 ConstVertexFaceCWIter cvf_cwiter(VertexHandle _vh) const;
│ │ │ -
808 ConstVertexFaceCCWIter cvf_ccwiter(VertexHandle _vh) const;
│ │ │ -
809
│ │ │ -
811 FaceVertexIter fv_iter(FaceHandle _fh);
│ │ │ -
813 FaceVertexCWIter fv_cwiter(FaceHandle _fh);
│ │ │ -
815 FaceVertexCCWIter fv_ccwiter(FaceHandle _fh);
│ │ │ -
817 FaceHalfedgeIter fh_iter(FaceHandle _fh);
│ │ │ -
819 FaceHalfedgeCWIter fh_cwiter(FaceHandle _fh);
│ │ │ -
821 FaceHalfedgeCCWIter fh_ccwiter(FaceHandle _fh);
│ │ │ -
823 FaceEdgeIter fe_iter(FaceHandle _fh);
│ │ │ -
825 FaceEdgeCWIter fe_cwiter(FaceHandle _fh);
│ │ │ -
827 FaceEdgeCCWIter fe_ccwiter(FaceHandle _fh);
│ │ │ -
829 FaceFaceIter ff_iter(FaceHandle _fh);
│ │ │ -
831 FaceFaceCWIter ff_cwiter(FaceHandle _fh);
│ │ │ -
833 FaceFaceCCWIter ff_ccwiter(FaceHandle _fh);
│ │ │ -
834
│ │ │ -
836 ConstFaceVertexIter cfv_iter(FaceHandle _fh) const;
│ │ │ -
838 ConstFaceVertexCWIter cfv_cwiter(FaceHandle _fh) const;
│ │ │ -
840 ConstFaceVertexCCWIter cfv_ccwiter(FaceHandle _fh) const;
│ │ │ -
842 ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const;
│ │ │ -
844 ConstFaceHalfedgeCWIter cfh_cwiter(FaceHandle _fh) const;
│ │ │ -
846 ConstFaceHalfedgeCCWIter cfh_ccwiter(FaceHandle _fh) const;
│ │ │ -
848 ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const;
│ │ │ -
850 ConstFaceEdgeCWIter cfe_cwiter(FaceHandle _fh) const;
│ │ │ -
852 ConstFaceEdgeCCWIter cfe_ccwiter(FaceHandle _fh) const;
│ │ │ -
854 ConstFaceFaceIter cff_iter(FaceHandle _fh) const;
│ │ │ -
856 ConstFaceFaceCWIter cff_cwiter(FaceHandle _fh) const;
│ │ │ -
858 ConstFaceFaceCCWIter cff_ccwiter(FaceHandle _fh) const;
│ │ │ -
859
│ │ │ -
861 EdgeVertexIter ev_iter(EdgeHandle _eh);
│ │ │ -
863 EdgeHalfedgeIter eh_iter(EdgeHandle _eh);
│ │ │ -
865 EdgeFaceIter ef_iter(EdgeHandle _eh);
│ │ │ -
866
│ │ │ -
868 ConstEdgeVertexIter cev_iter(EdgeHandle _eh) const;
│ │ │ -
870 ConstEdgeHalfedgeIter ceh_iter(EdgeHandle _eh) const;
│ │ │ -
872 ConstEdgeFaceIter cef_iter(EdgeHandle _eh) const;
│ │ │ -
873
│ │ │ -
874 // 'begin' circulators
│ │ │ -
875
│ │ │ -
877 VertexVertexIter vv_begin(VertexHandle _vh);
│ │ │ -
879 VertexVertexCWIter vv_cwbegin(VertexHandle _vh);
│ │ │ -
881 VertexVertexCCWIter vv_ccwbegin(VertexHandle _vh);
│ │ │ -
883 VertexIHalfedgeIter vih_begin(VertexHandle _vh);
│ │ │ -
885 VertexIHalfedgeCWIter vih_cwbegin(VertexHandle _vh);
│ │ │ -
887 VertexIHalfedgeCCWIter vih_ccwbegin(VertexHandle _vh);
│ │ │ -
889 VertexOHalfedgeIter voh_begin(VertexHandle _vh);
│ │ │ -
891 VertexOHalfedgeCWIter voh_cwbegin(VertexHandle _vh);
│ │ │ -
893 VertexOHalfedgeCCWIter voh_ccwbegin(VertexHandle _vh);
│ │ │ -
895 VertexEdgeIter ve_begin(VertexHandle _vh);
│ │ │ -
897 VertexEdgeCWIter ve_cwbegin(VertexHandle _vh);
│ │ │ -
899 VertexEdgeCCWIter ve_ccwbegin(VertexHandle _vh);
│ │ │ -
901 VertexFaceIter vf_begin(VertexHandle _vh);
│ │ │ -
903 VertexFaceCWIter vf_cwbegin(VertexHandle _vh);
│ │ │ -
905 VertexFaceCCWIter vf_ccwbegin(VertexHandle _vh);
│ │ │ -
906
│ │ │ -
907
│ │ │ -
909 ConstVertexVertexIter cvv_begin(VertexHandle _vh) const;
│ │ │ -
911 ConstVertexVertexCWIter cvv_cwbegin(VertexHandle _vh) const;
│ │ │ -
913 ConstVertexVertexCCWIter cvv_ccwbegin(VertexHandle _vh) const;
│ │ │ -
915 ConstVertexIHalfedgeIter cvih_begin(VertexHandle _vh) const;
│ │ │ -
917 ConstVertexIHalfedgeCWIter cvih_cwbegin(VertexHandle _vh) const;
│ │ │ -
919 ConstVertexIHalfedgeCCWIter cvih_ccwbegin(VertexHandle _vh) const;
│ │ │ -
921 ConstVertexOHalfedgeIter cvoh_begin(VertexHandle _vh) const;
│ │ │ -
923 ConstVertexOHalfedgeCWIter cvoh_cwbegin(VertexHandle _vh) const;
│ │ │ -
925 ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(VertexHandle _vh) const;
│ │ │ -
927 ConstVertexEdgeIter cve_begin(VertexHandle _vh) const;
│ │ │ -
929 ConstVertexEdgeCWIter cve_cwbegin(VertexHandle _vh) const;
│ │ │ -
931 ConstVertexEdgeCCWIter cve_ccwbegin(VertexHandle _vh) const;
│ │ │ -
933 ConstVertexFaceIter cvf_begin(VertexHandle _vh) const;
│ │ │ -
935 ConstVertexFaceCWIter cvf_cwbegin(VertexHandle _vh) const;
│ │ │ -
937 ConstVertexFaceCCWIter cvf_ccwbegin(VertexHandle _vh) const;
│ │ │ -
938
│ │ │ -
940 FaceVertexIter fv_begin(FaceHandle _fh);
│ │ │ -
942 FaceVertexCWIter fv_cwbegin(FaceHandle _fh);
│ │ │ -
944 FaceVertexCCWIter fv_ccwbegin(FaceHandle _fh);
│ │ │ -
946 FaceHalfedgeIter fh_begin(FaceHandle _fh);
│ │ │ -
948 FaceHalfedgeCWIter fh_cwbegin(FaceHandle _fh);
│ │ │ -
950 FaceHalfedgeCCWIter fh_ccwbegin(FaceHandle _fh);
│ │ │ -
952 FaceEdgeIter fe_begin(FaceHandle _fh);
│ │ │ -
954 FaceEdgeCWIter fe_cwbegin(FaceHandle _fh);
│ │ │ -
956 FaceEdgeCCWIter fe_ccwbegin(FaceHandle _fh);
│ │ │ -
958 FaceFaceIter ff_begin(FaceHandle _fh);
│ │ │ -
960 FaceFaceCWIter ff_cwbegin(FaceHandle _fh);
│ │ │ -
962 FaceFaceCCWIter ff_ccwbegin(FaceHandle _fh);
│ │ │ -
964 HalfedgeLoopIter hl_begin(HalfedgeHandle _heh);
│ │ │ -
966 HalfedgeLoopCWIter hl_cwbegin(HalfedgeHandle _heh);
│ │ │ -
968 HalfedgeLoopCCWIter hl_ccwbegin(HalfedgeHandle _heh);
│ │ │ -
969
│ │ │ -
971 ConstFaceVertexIter cfv_begin(FaceHandle _fh) const;
│ │ │ -
973 ConstFaceVertexCWIter cfv_cwbegin(FaceHandle _fh) const;
│ │ │ -
975 ConstFaceVertexCCWIter cfv_ccwbegin(FaceHandle _fh) const;
│ │ │ -
977 ConstFaceHalfedgeIter cfh_begin(FaceHandle _fh) const;
│ │ │ -
979 ConstFaceHalfedgeCWIter cfh_cwbegin(FaceHandle _fh) const;
│ │ │ -
981 ConstFaceHalfedgeCCWIter cfh_ccwbegin(FaceHandle _fh) const;
│ │ │ -
983 ConstFaceEdgeIter cfe_begin(FaceHandle _fh) const;
│ │ │ -
985 ConstFaceEdgeCWIter cfe_cwbegin(FaceHandle _fh) const;
│ │ │ -
987 ConstFaceEdgeCCWIter cfe_ccwbegin(FaceHandle _fh) const;
│ │ │ -
989 ConstFaceFaceIter cff_begin(FaceHandle _fh) const;
│ │ │ -
991 ConstFaceFaceCWIter cff_cwbegin(FaceHandle _fh) const;
│ │ │ -
993 ConstFaceFaceCCWIter cff_ccwbegin(FaceHandle _fh) const;
│ │ │ -
995 ConstHalfedgeLoopIter chl_begin(HalfedgeHandle _heh) const;
│ │ │ -
997 ConstHalfedgeLoopCWIter chl_cwbegin(HalfedgeHandle _heh) const;
│ │ │ -
999 ConstHalfedgeLoopCCWIter chl_ccwbegin(HalfedgeHandle _heh) const;
│ │ │ -
1000
│ │ │ -
1002 EdgeVertexIter ev_begin(EdgeHandle _eh);
│ │ │ -
1004 EdgeHalfedgeIter eh_begin(EdgeHandle _eh);
│ │ │ -
1006 EdgeFaceIter ef_begin(EdgeHandle _eh);
│ │ │ -
1007
│ │ │ -
1009 ConstEdgeVertexIter cev_begin(EdgeHandle _eh) const;
│ │ │ -
1011 ConstEdgeHalfedgeIter ceh_begin(EdgeHandle _eh) const;
│ │ │ -
1013 ConstEdgeFaceIter cef_begin(EdgeHandle _eh) const;
│ │ │ -
1014
│ │ │ -
1015 // 'end' circulators
│ │ │ -
1016
│ │ │ -
1018 VertexVertexIter vv_end(VertexHandle _vh);
│ │ │ -
1020 VertexVertexCWIter vv_cwend(VertexHandle _vh);
│ │ │ -
1022 VertexVertexCCWIter vv_ccwend(VertexHandle _vh);
│ │ │ -
1024 VertexIHalfedgeIter vih_end(VertexHandle _vh);
│ │ │ -
1026 VertexIHalfedgeCWIter vih_cwend(VertexHandle _vh);
│ │ │ -
1028 VertexIHalfedgeCCWIter vih_ccwend(VertexHandle _vh);
│ │ │ -
1030 VertexOHalfedgeIter voh_end(VertexHandle _vh);
│ │ │ -
1032 VertexOHalfedgeCWIter voh_cwend(VertexHandle _vh);
│ │ │ -
1034 VertexOHalfedgeCCWIter voh_ccwend(VertexHandle _vh);
│ │ │ -
1036 VertexEdgeIter ve_end(VertexHandle _vh);
│ │ │ -
1038 VertexEdgeCWIter ve_cwend(VertexHandle _vh);
│ │ │ -
1040 VertexEdgeCCWIter ve_ccwend(VertexHandle _vh);
│ │ │ -
1042 VertexFaceIter vf_end(VertexHandle _vh);
│ │ │ -
1044 VertexFaceCWIter vf_cwend(VertexHandle _vh);
│ │ │ -
1046 VertexFaceCCWIter vf_ccwend(VertexHandle _vh);
│ │ │ -
1047
│ │ │ -
1049 ConstVertexVertexIter cvv_end(VertexHandle _vh) const;
│ │ │ -
1051 ConstVertexVertexCWIter cvv_cwend(VertexHandle _vh) const;
│ │ │ -
1053 ConstVertexVertexCCWIter cvv_ccwend(VertexHandle _vh) const;
│ │ │ -
1055 ConstVertexIHalfedgeIter cvih_end(VertexHandle _vh) const;
│ │ │ -
1057 ConstVertexIHalfedgeCWIter cvih_cwend(VertexHandle _vh) const;
│ │ │ -
1059 ConstVertexIHalfedgeCCWIter cvih_ccwend(VertexHandle _vh) const;
│ │ │ -
1061 ConstVertexOHalfedgeIter cvoh_end(VertexHandle _vh) const;
│ │ │ -
1063 ConstVertexOHalfedgeCWIter cvoh_cwend(VertexHandle _vh) const;
│ │ │ -
1065 ConstVertexOHalfedgeCCWIter cvoh_ccwend(VertexHandle _vh) const;
│ │ │ -
1067 ConstVertexEdgeIter cve_end(VertexHandle _vh) const;
│ │ │ -
1069 ConstVertexEdgeCWIter cve_cwend(VertexHandle _vh) const;
│ │ │ -
1071 ConstVertexEdgeCCWIter cve_ccwend(VertexHandle _vh) const;
│ │ │ -
1073 ConstVertexFaceIter cvf_end(VertexHandle _vh) const;
│ │ │ -
1075 ConstVertexFaceCWIter cvf_cwend(VertexHandle _vh) const;
│ │ │ -
1077 ConstVertexFaceCCWIter cvf_ccwend(VertexHandle _vh) const;
│ │ │ -
1078
│ │ │ -
1080 FaceVertexIter fv_end(FaceHandle _fh);
│ │ │ -
1082 FaceVertexCWIter fv_cwend(FaceHandle _fh);
│ │ │ -
1084 FaceVertexCCWIter fv_ccwend(FaceHandle _fh);
│ │ │ -
1086 FaceHalfedgeIter fh_end(FaceHandle _fh);
│ │ │ -
1088 FaceHalfedgeCWIter fh_cwend(FaceHandle _fh);
│ │ │ -
1090 FaceHalfedgeCCWIter fh_ccwend(FaceHandle _fh);
│ │ │ -
1092 FaceEdgeIter fe_end(FaceHandle _fh);
│ │ │ -
1094 FaceEdgeCWIter fe_cwend(FaceHandle _fh);
│ │ │ -
1096 FaceEdgeCCWIter fe_ccwend(FaceHandle _fh);
│ │ │ -
1098 FaceFaceIter ff_end(FaceHandle _fh);
│ │ │ -
1100 FaceFaceCWIter ff_cwend(FaceHandle _fh);
│ │ │ -
1102 FaceFaceCCWIter ff_ccwend(FaceHandle _fh);
│ │ │ -
1104 HalfedgeLoopIter hl_end(HalfedgeHandle _heh);
│ │ │ -
1106 HalfedgeLoopCWIter hl_cwend(HalfedgeHandle _heh);
│ │ │ -
1108 HalfedgeLoopCCWIter hl_ccwend(HalfedgeHandle _heh);
│ │ │ -
1109
│ │ │ -
1111 ConstFaceVertexIter cfv_end(FaceHandle _fh) const;
│ │ │ -
1113 ConstFaceVertexCWIter cfv_cwend(FaceHandle _fh) const;
│ │ │ -
1115 ConstFaceVertexCCWIter cfv_ccwend(FaceHandle _fh) const;
│ │ │ -
1117 ConstFaceHalfedgeIter cfh_end(FaceHandle _fh) const;
│ │ │ -
1119 ConstFaceHalfedgeCWIter cfh_cwend(FaceHandle _fh) const;
│ │ │ -
1121 ConstFaceHalfedgeCCWIter cfh_ccwend(FaceHandle _fh) const;
│ │ │ -
1123 ConstFaceEdgeIter cfe_end(FaceHandle _fh) const;
│ │ │ -
1125 ConstFaceEdgeCWIter cfe_cwend(FaceHandle _fh) const;
│ │ │ -
1127 ConstFaceEdgeCCWIter cfe_ccwend(FaceHandle _fh) const;
│ │ │ -
1129 ConstFaceFaceIter cff_end(FaceHandle _fh) const;
│ │ │ -
1131 ConstFaceFaceCWIter cff_cwend(FaceHandle _fh) const;
│ │ │ -
1133 ConstFaceFaceCCWIter cff_ccwend(FaceHandle _fh) const;
│ │ │ -
1135 ConstHalfedgeLoopIter chl_end(HalfedgeHandle _heh) const;
│ │ │ -
1137 ConstHalfedgeLoopCWIter chl_cwend(HalfedgeHandle _heh) const;
│ │ │ -
1139 ConstHalfedgeLoopCCWIter chl_ccwend(HalfedgeHandle _heh) const;
│ │ │ -
1140
│ │ │ -
1142 EdgeVertexIter ev_end(EdgeHandle _eh);
│ │ │ -
1144 EdgeHalfedgeIter eh_end(EdgeHandle _eh);
│ │ │ -
1146 EdgeFaceIter ef_end(EdgeHandle _eh);
│ │ │ -
1147
│ │ │ -
1149 ConstEdgeVertexIter cev_end(EdgeHandle _eh) const;
│ │ │ -
1151 ConstEdgeHalfedgeIter ceh_end(EdgeHandle _eh) const;
│ │ │ -
1153 ConstEdgeFaceIter cef_end(EdgeHandle _eh) const;
│ │ │ -
1154
│ │ │ -
1156
│ │ │ -
1159
│ │ │ -
1160 typedef EntityRange<RangeTraitT<
│ │ │ -
1161 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1165 typedef EntityRange<RangeTraitT<
│ │ │ -
1166 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1170 typedef EntityRange<RangeTraitT<
│ │ │ -
1171 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1175 typedef EntityRange<RangeTraitT<
│ │ │ -
1176 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1180 typedef EntityRange<RangeTraitT<
│ │ │ -
1181 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1185 typedef EntityRange<RangeTraitT<
│ │ │ -
1186 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1190 typedef EntityRange<RangeTraitT<
│ │ │ -
1191 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1195 typedef EntityRange<RangeTraitT<
│ │ │ -
1196 const PolyConnectivity,
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
1200
│ │ │ -
1201
│ │ │ -
1202 template <typename HandleType>
│ │ │ - │ │ │ -
1204
│ │ │ -
1209 ConstVertexRangeSkipping vertices() const;
│ │ │ -
1210
│ │ │ -
1215 ConstVertexRange all_vertices() const;
│ │ │ -
1216
│ │ │ -
1221 ConstHalfedgeRangeSkipping halfedges() const;
│ │ │ -
1222
│ │ │ -
1227 ConstHalfedgeRange all_halfedges() const;
│ │ │ -
1228
│ │ │ -
1233 ConstEdgeRangeSkipping edges() const;
│ │ │ -
1234
│ │ │ -
1239 ConstEdgeRange all_edges() const;
│ │ │ -
1240
│ │ │ -
1245 ConstFaceRangeSkipping faces() const;
│ │ │ -
1246
│ │ │ -
1251 ConstFaceRange all_faces() const;
│ │ │ -
1252
│ │ │ -
1257 template <typename HandleType>
│ │ │ - │ │ │ -
1259
│ │ │ -
1264 template <typename HandleType>
│ │ │ - │ │ │ -
1266
│ │ │ -
1267
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
1281
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
1292
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
1303
│ │ │ -
1308 ConstVertexVertexRange vv_range(VertexHandle _vh) const;
│ │ │ -
1309
│ │ │ -
1314 ConstVertexIHalfedgeRange vih_range(VertexHandle _vh) const;
│ │ │ -
1315
│ │ │ -
1321 ConstVertexIHalfedgeRange vih_range(HalfedgeHandle _heh) const;
│ │ │ -
1322
│ │ │ -
1327 ConstVertexOHalfedgeRange voh_range(VertexHandle _vh) const;
│ │ │ -
1328
│ │ │ -
1334 ConstVertexOHalfedgeRange voh_range(HalfedgeHandle _heh) const;
│ │ │ -
1335
│ │ │ -
1340 ConstVertexEdgeRange ve_range(VertexHandle _vh) const ;
│ │ │ -
1341
│ │ │ -
1346 ConstVertexFaceRange vf_range(VertexHandle _vh) const;
│ │ │ -
1347
│ │ │ -
1352 ConstFaceVertexRange fv_range(FaceHandle _fh) const;
│ │ │ -
1353
│ │ │ -
1358 ConstFaceHalfedgeRange fh_range(FaceHandle _fh) const;
│ │ │ -
1359
│ │ │ -
1364 ConstFaceEdgeRange fe_range(FaceHandle _fh) const;
│ │ │ -
1365
│ │ │ -
1370 ConstFaceFaceRange ff_range(FaceHandle _fh) const;
│ │ │ -
1371
│ │ │ -
1376 ConstEdgeVertexRange ev_range(EdgeHandle _eh) const;
│ │ │ -
1377
│ │ │ -
1382 ConstEdgeHalfedgeRange eh_range(EdgeHandle _eh) const;
│ │ │ -
1383
│ │ │ -
1389 ConstEdgeHalfedgeRange eh_range(HalfedgeHandle _heh) const;
│ │ │ -
1390
│ │ │ -
1395 ConstEdgeFaceRange ef_range(EdgeHandle _eh) const;
│ │ │ -
1396
│ │ │ -
1401 ConstHalfedgeLoopRange hl_range(HalfedgeHandle _heh) const;
│ │ │ -
1402
│ │ │ -
1403
│ │ │ -
1408 ConstVertexVertexCWRange vv_cw_range(VertexHandle _vh) const;
│ │ │ -
1409
│ │ │ -
1414 ConstVertexIHalfedgeCWRange vih_cw_range(VertexHandle _vh) const;
│ │ │ -
1415
│ │ │ -
1421 ConstVertexIHalfedgeCWRange vih_cw_range(HalfedgeHandle _heh) const;
│ │ │ -
1422
│ │ │ -
1427 ConstVertexOHalfedgeCWRange voh_cw_range(VertexHandle _vh) const;
│ │ │ -
1428
│ │ │ -
1434 ConstVertexOHalfedgeCWRange voh_cw_range(HalfedgeHandle _heh) const;
│ │ │ -
1435
│ │ │ -
1440 ConstVertexEdgeCWRange ve_cw_range(VertexHandle _vh) const;
│ │ │ -
1441
│ │ │ -
1446 ConstVertexFaceCWRange vf_cw_range(VertexHandle _vh) const;
│ │ │ -
1447
│ │ │ -
1452 ConstFaceVertexCWRange fv_cw_range(FaceHandle _fh) const;
│ │ │ -
1453
│ │ │ -
1458 ConstFaceHalfedgeCWRange fh_cw_range(FaceHandle _fh) const;
│ │ │ -
1459
│ │ │ -
1464 ConstFaceEdgeCWRange fe_cw_range(FaceHandle _fh) const;
│ │ │ -
1465
│ │ │ -
1470 ConstFaceFaceCWRange ff_cw_range(FaceHandle _fh) const;
│ │ │ -
1471
│ │ │ -
1476 ConstHalfedgeLoopCWRange hl_cw_range(HalfedgeHandle _heh) const;
│ │ │ -
1477
│ │ │ -
1478
│ │ │ -
1483 ConstVertexVertexCCWRange vv_ccw_range(VertexHandle _vh) const;
│ │ │ -
1484
│ │ │ -
1489 ConstVertexIHalfedgeCCWRange vih_ccw_range(VertexHandle _vh) const;
│ │ │ -
1490
│ │ │ -
1496 ConstVertexIHalfedgeCCWRange vih_ccw_range(HalfedgeHandle _heh) const;
│ │ │ -
1497
│ │ │ -
1502 ConstVertexOHalfedgeCCWRange voh_ccw_range(VertexHandle _vh) const;
│ │ │ -
1503
│ │ │ -
1509 ConstVertexOHalfedgeCCWRange voh_ccw_range(HalfedgeHandle _heh) const;
│ │ │ -
1510
│ │ │ -
1515 ConstVertexEdgeCCWRange ve_ccw_range(VertexHandle _vh) const ;
│ │ │ -
1516
│ │ │ -
1521 ConstVertexFaceCCWRange vf_ccw_range(VertexHandle _vh) const;
│ │ │ -
1522
│ │ │ -
1527 ConstFaceVertexCCWRange fv_ccw_range(FaceHandle _fh) const;
│ │ │ -
1528
│ │ │ -
1533 ConstFaceHalfedgeCCWRange fh_ccw_range(FaceHandle _fh) const;
│ │ │ -
1534
│ │ │ -
1539 ConstFaceEdgeCCWRange fe_ccw_range(FaceHandle _fh) const;
│ │ │ -
1540
│ │ │ -
1545 ConstFaceFaceCCWRange ff_ccw_range(FaceHandle _fh) const;
│ │ │ -
1546
│ │ │ -
1547
│ │ │ -
1552 ConstHalfedgeLoopCCWRange hl_ccw_range(HalfedgeHandle _heh) const;
│ │ │ -
1553
│ │ │ -
1555
│ │ │ -
1556 //===========================================================================
│ │ │ -
1559 //===========================================================================
│ │ │ -
1560
│ │ │ -
│ │ │ - │ │ │ -
1569 { return ArrayKernel::is_boundary(_heh); }
│ │ │ -
│ │ │ -
1570
│ │ │ -
│ │ │ -
1579 bool is_boundary(EdgeHandle _eh) const
│ │ │ -
1580 {
│ │ │ -
1581 return (is_boundary(halfedge_handle(_eh, 0)) ||
│ │ │ -
1582 is_boundary(halfedge_handle(_eh, 1)));
│ │ │ -
1583 }
│ │ │ -
│ │ │ -
1584
│ │ │ -
│ │ │ - │ │ │ -
1597 {
│ │ │ -
1598 HalfedgeHandle heh(halfedge_handle(_vh));
│ │ │ -
1599 return (!(heh.is_valid() && face_handle(heh).is_valid()));
│ │ │ -
1600 }
│ │ │ -
│ │ │ -
1601
│ │ │ -
1611 bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const;
│ │ │ -
1612
│ │ │ -
1623 bool is_manifold(VertexHandle _vh) const;
│ │ │ -
1624
│ │ │ -
1627 // --- misc ---
│ │ │ -
1628
│ │ │ -
1632 void adjust_outgoing_halfedge(VertexHandle _vh);
│ │ │ -
1633
│ │ │ -
1635 SmartHalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const;
│ │ │ -
1637 uint valence(VertexHandle _vh) const;
│ │ │ -
1639 uint valence(FaceHandle _fh) const;
│ │ │ -
1640
│ │ │ -
1641 // --- connectivity operattions
│ │ │ -
1642
│ │ │ -
1657 void collapse(HalfedgeHandle _heh);
│ │ │ -
1662 bool is_simple_link(EdgeHandle _eh) const;
│ │ │ -
1667 bool is_simply_connected(FaceHandle _fh) const;
│ │ │ -
1680 FaceHandle remove_edge(EdgeHandle _eh);
│ │ │ -
1684 void reinsert_edge(EdgeHandle _eh);
│ │ │ -
1694 HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh);
│ │ │ -
1695
│ │ │ -
1708 void split(FaceHandle _fh, VertexHandle _vh);
│ │ │ -
1709
│ │ │ -
1723 void split_copy(FaceHandle _fh, VertexHandle _vh);
│ │ │ -
1724
│ │ │ -
1738 void triangulate(FaceHandle _fh);
│ │ │ -
1739
│ │ │ -
1742 void triangulate();
│ │ │ -
1743
│ │ │ -
1754 void split_edge(EdgeHandle _eh, VertexHandle _vh);
│ │ │ -
1755
│ │ │ -
1767 void split_edge_copy(EdgeHandle _eh, VertexHandle _vh);
│ │ │ -
1768
│ │ │ -
1769
│ │ │ -
1776 const Vertex& deref(VertexHandle _h) const { return vertex(_h); }
│ │ │ -
1777 Vertex& deref(VertexHandle _h) { return vertex(_h); }
│ │ │ -
1778 const Halfedge& deref(HalfedgeHandle _h) const { return halfedge(_h); }
│ │ │ -
1779 Halfedge& deref(HalfedgeHandle _h) { return halfedge(_h); }
│ │ │ -
1780 const Edge& deref(EdgeHandle _h) const { return edge(_h); }
│ │ │ -
1781 Edge& deref(EdgeHandle _h) { return edge(_h); }
│ │ │ -
1782 const Face& deref(FaceHandle _h) const { return face(_h); }
│ │ │ -
1783 Face& deref(FaceHandle _h) { return face(_h); }
│ │ │ -
1785
│ │ │ -
1786protected:
│ │ │ -
1788 void collapse_edge(HalfedgeHandle _hh);
│ │ │ -
1790 void collapse_loop(HalfedgeHandle _hh);
│ │ │ -
1791
│ │ │ -
1792
│ │ │ -
1793
│ │ │ -
1794private: // Working storage for add_face()
│ │ │ -
1795 struct AddFaceEdgeInfo
│ │ │ -
1796 {
│ │ │ -
1797 HalfedgeHandle halfedge_handle;
│ │ │ -
1798 bool is_new;
│ │ │ -
1799 bool needs_adjust;
│ │ │ -
1800 };
│ │ │ -
1801 std::vector<AddFaceEdgeInfo> edgeData_; //
│ │ │ -
1802 std::vector<std::pair<HalfedgeHandle, HalfedgeHandle> > next_cache_; // cache for set_next_halfedge and vertex' set_halfedge
│ │ │ -
1803
│ │ │ -
1804};
│ │ │ -
│ │ │ -
1805
│ │ │ -
1806template <>
│ │ │ -
│ │ │ - │ │ │ -
1808{
│ │ │ -
1809 using Range = ConstVertexRange;
│ │ │ - │ │ │ -
1811};
│ │ │ -
│ │ │ -
1812
│ │ │ -
1813template <>
│ │ │ -
│ │ │ - │ │ │ -
1815{
│ │ │ -
1816 using Range = ConstHalfedgeRange;
│ │ │ - │ │ │ -
1818};
│ │ │ -
│ │ │ -
1819
│ │ │ -
1820template <>
│ │ │ -
│ │ │ - │ │ │ -
1822{
│ │ │ -
1823 using Range = ConstEdgeRange;
│ │ │ - │ │ │ -
1825};
│ │ │ -
│ │ │ -
1826
│ │ │ -
1827template <>
│ │ │ -
│ │ │ - │ │ │ -
1829{
│ │ │ -
1830 using Range = ConstFaceRange;
│ │ │ - │ │ │ -
1832};
│ │ │ -
│ │ │ -
1833
│ │ │ -
1834}//namespace OpenMesh
│ │ │ -
1835
│ │ │ -
1836#define OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ -
1837#include <OpenMesh/Core/Mesh/SmartHandles.hh>
│ │ │ -
1838#include <OpenMesh/Core/Mesh/PolyConnectivity_inline_impl.hh>
│ │ │ -
1839#undef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ -
1840
│ │ │ -
1841#endif//OPENMESH_POLYCONNECTIVITY_HH
│ │ │ +
88
│ │ │ +
89private:
│ │ │ +
90
│ │ │ +
92 blaT(const blaT& _rhs);
│ │ │ +
93
│ │ │ +
95 blaT& operator=(const blaT& _rhs);
│ │ │ +
96
│ │ │ +
97};
│ │ │ +
98
│ │ │ +
99
│ │ │ +
100//=============================================================================
│ │ │ +
101} // namespace OpenMesh
│ │ │ +
102//=============================================================================
│ │ │ +
103#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_BLA_C)
│ │ │ +
104#define OPENMESH_BLA_TEMPLATES
│ │ │ +
105#include "blaT_impl.hh"
│ │ │ +
106#endif
│ │ │ +
107//=============================================================================
│ │ │ +
108#endif // OPENMESH_NEWCLASST_HH defined
│ │ │ +
109#endif // DOXY_IGNORE_THIS
│ │ │ +
110//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Mesh kernel using arrays for mesh item storage.
Definition ArrayKernel.hh:88
│ │ │ -
bool is_boundary(HalfedgeHandle _heh) const
Is halfedge _heh a boundary halfedge (is its face handle invalid) ?
Definition ArrayKernel.hh:400
│ │ │ -
void assign_connectivity(const ArrayKernel &_other)
ArrayKernel uses the default copy constructor and assignment operator, which means that the connectiv...
Definition ArrayKernel.cc:71
│ │ │ -
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ -
Definition CirculatorsT.hh:305
│ │ │ - │ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Definition IteratorsT.hh:82
│ │ │ -
Generic class for vertex/halfedge/edge/face ranges.
Definition PolyConnectivity_inline_impl.hh:76
│ │ │ -
Definition PolyConnectivity.hh:77
│ │ │ -
Definition PolyConnectivity.hh:96
│ │ │ -
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ -
const Halfedge & deref(HalfedgeHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1778
│ │ │ -
VertexVertexCWIter VVCWIter
Alias typedef.
Definition PolyConnectivity.hh:461
│ │ │ -
ConstVertexVertexIter CVVIter
Alias typedef.
Definition PolyConnectivity.hh:489
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange
Definition PolyConnectivity.hh:1268
│ │ │ -
EdgeIter edges_end()
End iterator for edges.
Definition PolyConnectivity_inline_impl.hh:338
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity::cfv_end > > ConstFaceVertexRange
Definition PolyConnectivity.hh:1273
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange
Definition PolyConnectivity.hh:1288
│ │ │ -
EdgeIter ConstEdgeIter
Linear iterator.
Definition PolyConnectivity.hh:146
│ │ │ -
EdgeIter EIter
Alias typedef.
Definition PolyConnectivity.hh:452
│ │ │ -
VertexVertexIter VVIter
Alias typedef.
Definition PolyConnectivity.hh:460
│ │ │ -
Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter
Enumerates incident edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:258
│ │ │ -
VertexVertexCCWIter VVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:462
│ │ │ -
ConstVertexIHalfedgeCCWIter CVIHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:497
│ │ │ -
HalfedgeLoopCWIter ConstHalfedgeLoopCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:433
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity::cff_cwend > > ConstFaceFaceCWRange
Definition PolyConnectivity.hh:1290
│ │ │ -
Edge & deref(EdgeHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1781
│ │ │ -
HalfedgeIter halfedges_end()
End iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:326
│ │ │ -
ConstFaceHalfedgeCCWIter CFHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:509
│ │ │ -
VertexHandle VHandle
Alias typedef.
Definition PolyConnectivity.hh:445
│ │ │ -
ConstFaceVertexCCWIter CFVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:506
│ │ │ -
PolyConnectivity This
Invalid handle.
Definition PolyConnectivity.hh:129
│ │ │ -
Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, &ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter
Linear iterator.
Definition PolyConnectivity.hh:140
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange
Definition PolyConnectivity.hh:1299
│ │ │ -
ConstVertexFaceCCWIter CVFCCWIter
Alias typedef.
Definition PolyConnectivity.hh:503
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange
Definition PolyConnectivity.hh:1293
│ │ │ -
VertexIHalfedgeIter ConstVertexIHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:285
│ │ │ -
VertexFaceCCWIter VFCCWIter
Alias typedef.
Definition PolyConnectivity.hh:474
│ │ │ -
FaceFaceIter ConstFaceFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:378
│ │ │ -
FaceEdgeCWIter FECWIter
Alias typedef.
Definition PolyConnectivity.hh:482
│ │ │ -
Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter
Enumerates 1-ring vertices in a counter clockwise fashion.
Definition PolyConnectivity.hh:180
│ │ │ -
VertexIter vertices_sbegin()
Begin iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:357
│ │ │ -
HalfedgeIter halfedges_sbegin()
Begin iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:363
│ │ │ -
FaceVertexCCWIter FVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:477
│ │ │ -
ConstVertexIter CVIter
Alias typedef.
Definition PolyConnectivity.hh:455
│ │ │ -
ConstHalfedgeIter CHIter
Alias typedef.
Definition PolyConnectivity.hh:456
│ │ │ -
Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter
Enumerate incident vertices in a clockwise fashion.
Definition PolyConnectivity.hh:316
│ │ │ -
HalfedgeIter halfedges_begin()
Begin iterator for halfedges.
Definition PolyConnectivity_inline_impl.hh:320
│ │ │ -
static const HalfedgeHandle InvalidHalfedgeHandle
Invalid handle.
Definition PolyConnectivity.hh:122
│ │ │ -
SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
Definition PolyConnectivity_inline_impl.hh:57
│ │ │ -
FaceFaceCWIter ConstFaceFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:379
│ │ │ -
FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:374
│ │ │ -
EdgeIter edges_sbegin()
Begin iterator for edges.
Definition PolyConnectivity_inline_impl.hh:369
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity::cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange
Definition PolyConnectivity.hh:1282
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange
Definition PolyConnectivity.hh:1295
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > > ConstEdgeRangeSkipping
Definition PolyConnectivity.hh:1189
│ │ │ -
EdgeIter edges_begin()
Begin iterator for edges.
Definition PolyConnectivity_inline_impl.hh:332
│ │ │ -
ConstFaceEdgeCCWIter CFECCWIter
Alias typedef.
Definition PolyConnectivity.hh:512
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange
Definition PolyConnectivity.hh:1302
│ │ │ -
ConstEdgeIter CEIter
Alias typedef.
Definition PolyConnectivity.hh:457
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange
Definition PolyConnectivity.hh:1287
│ │ │ -
ElementRange< HandleType >::Range all_elements() const
│ │ │ -
ConstFaceVertexIter CFVIter
Alias typedef.
Definition PolyConnectivity.hh:504
│ │ │ -
VertexVertexCCWIter ConstVertexVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:281
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange
Definition PolyConnectivity.hh:1269
│ │ │ -
ConstVertexOHalfedgeIter CVOHIter
Alias typedef.
Definition PolyConnectivity.hh:492
│ │ │ -
Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, &ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter
Linear iterator.
Definition PolyConnectivity.hh:139
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > ConstFaceRange
Definition PolyConnectivity.hh:1194
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity::cff_ccwend > > ConstFaceFaceCCWRange
Definition PolyConnectivity.hh:1301
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange
Definition PolyConnectivity.hh:1283
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > VertexIHalfedgeIter
Enumerates incoming half edges in a clockwise fashion.
Definition PolyConnectivity.hh:213
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity::vertices_end > > ConstVertexRange
Definition PolyConnectivity.hh:1164
│ │ │ -
FaceFaceCCWIter ConstFaceFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:380
│ │ │ -
ConstFaceEdgeIter CFEIter
Alias typedef.
Definition PolyConnectivity.hh:510
│ │ │ -
PolyConnectivity()
Alias typedef.
Definition PolyConnectivity.hh:523
│ │ │ -
VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:283
│ │ │ -
FaceEdgeCWIter ConstFaceEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:376
│ │ │ -
ConstVertexIHalfedgeCWIter CVIHCWIter
Alias typedef.
Definition PolyConnectivity.hh:496
│ │ │ -
ConstFaceHalfedgeIter CFHIter
Alias typedef.
Definition PolyConnectivity.hh:507
│ │ │ -
ConstFaceVertexCWIter CFVCWIter
Alias typedef.
Definition PolyConnectivity.hh:505
│ │ │ -
VertexFaceIter VFIter
Alias typedef.
Definition PolyConnectivity.hh:472
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:174
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange
Definition PolyConnectivity.hh:1284
│ │ │ -
HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:434
│ │ │ -
ConstVertexOHalfedgeCCWIter CVOHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:494
│ │ │ -
HalfedgeIter HIter
Alias typedef.
Definition PolyConnectivity.hh:451
│ │ │ -
VertexEdgeIter ConstVertexEdgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:291
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter
Enumerate incident half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:321
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity::cfe_end > > ConstFaceEdgeRange
Definition PolyConnectivity.hh:1275
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > VertexOHalfedgeIter
Enumerates outgoing half edges in a clockwise fashion.
Definition PolyConnectivity.hh:194
│ │ │ -
HalfedgeLoopIter ConstHalfedgeLoopIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:432
│ │ │ -
HalfedgeHandle HHandle
Alias typedef.
Definition PolyConnectivity.hh:446
│ │ │ -
static bool is_triangles()
Alias typedef.
Definition PolyConnectivity.hh:526
│ │ │ -
ConstFaceFaceCWIter CFFCWIter
Alias typedef.
Definition PolyConnectivity.hh:514
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange
Definition PolyConnectivity.hh:1280
│ │ │ -
VertexIHalfedgeIter VIHIter
Alias typedef.
Definition PolyConnectivity.hh:466
│ │ │ -
EdgeVertexIter ConstEdgeVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:425
│ │ │ -
VertexFaceIter ConstVertexFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:288
│ │ │ -
VertexIter VIter
Alias typedef.
Definition PolyConnectivity.hh:450
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange
Definition PolyConnectivity.hh:1285
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange
Definition PolyConnectivity.hh:1296
│ │ │ -
VertexIter ConstVertexIter
Linear iterator.
Definition PolyConnectivity.hh:144
│ │ │ -
Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, &ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter
Linear iterator.
Definition PolyConnectivity.hh:142
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter
Enumerates incident edges in a clockwise fashion.
Definition PolyConnectivity.hh:253
│ │ │ -
FaceVertexIter ConstFaceVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:369
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity::cfe_cwend > > ConstFaceEdgeCWRange
Definition PolyConnectivity.hh:1289
│ │ │ -
VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:287
│ │ │ -
ConstVertexEdgeCWIter CVECWIter
Alias typedef.
Definition PolyConnectivity.hh:499
│ │ │ -
VertexFaceCWIter ConstVertexFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:289
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity::cve_end > > ConstVertexEdgeRange
Definition PolyConnectivity.hh:1271
│ │ │ -
ConstEdgeVertexIter CEVIter
Alias typedef.
Definition PolyConnectivity.hh:516
│ │ │ -
EdgeFaceIter ConstEdgeFaceIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:427
│ │ │ -
FaceEdgeCCWIter FECWWIter
Alias typedef.
Definition PolyConnectivity.hh:483
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter
Enumerate the halfedges of an edge.
Definition PolyConnectivity.hh:410
│ │ │ -
FaceHalfedgeIter FHIter
Alias typedef.
Definition PolyConnectivity.hh:478
│ │ │ -
EdgeHalfedgeIter EHIter
Alias typedef.
Definition PolyConnectivity.hh:486
│ │ │ -
ElementRange< HandleType >::RangeSkipping elements() const
│ │ │ -
bool is_boundary(EdgeHandle _eh) const
Is the edge a boundary edge?
Definition PolyConnectivity.hh:1579
│ │ │ -
const Edge & deref(EdgeHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1780
│ │ │ -
FaceIter faces_sbegin()
Begin iterator for faces.
Definition PolyConnectivity_inline_impl.hh:375
│ │ │ -
virtual ~PolyConnectivity()
Alias typedef.
Definition PolyConnectivity.hh:524
│ │ │ -
Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > VertexOHalfedgeCCWIter
Enumerates outgoing half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:200
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter
Enumerates incident faces in a clockwise fashion.
Definition PolyConnectivity.hh:233
│ │ │ -
VertexEdgeCWIter VECWIter
Alias typedef.
Definition PolyConnectivity.hh:470
│ │ │ -
static const FaceHandle InvalidFaceHandle
Invalid handle.
Definition PolyConnectivity.hh:126
│ │ │ -
Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, &ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter
Linear iterator.
Definition PolyConnectivity.hh:141
│ │ │ -
ConstVertexEdgeCCWIter CVECCWIter
Alias typedef.
Definition PolyConnectivity.hh:500
│ │ │ -
EdgeHalfedgeIter ConstEdgeHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:426
│ │ │ -
EdgeVertexIter EVIter
Alias typedef.
Definition PolyConnectivity.hh:485
│ │ │ -
ConstVertexVertexCCWIter CVVCCWIter
Alias typedef.
Definition PolyConnectivity.hh:491
│ │ │ -
FaceHalfedgeCCWIter FHCWWIter
Alias typedef.
Definition PolyConnectivity.hh:480
│ │ │ -
bool is_boundary(VertexHandle _vh) const
Is vertex _vh a boundary vertex ?
Definition PolyConnectivity.hh:1596
│ │ │ -
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter
Identical to FaceHalfedgeIter.
Definition PolyConnectivity.hh:277
│ │ │ -
Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:362
│ │ │ -
FaceEdgeCCWIter ConstFaceEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:377
│ │ │ -
ConstVertexVertexCWIter CVVCWIter
Alias typedef.
Definition PolyConnectivity.hh:490
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter
Identical to FaceHalfedgeIter.
Definition PolyConnectivity.hh:272
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > ConstEdgeRange
Definition PolyConnectivity.hh:1184
│ │ │ -
ConstEdgeFaceIter CEFIter
Alias typedef.
Definition PolyConnectivity.hh:518
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity::cfe_ccwend > > ConstFaceEdgeCCWRange
Definition PolyConnectivity.hh:1300
│ │ │ -
VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:284
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRangeSkipping
Definition PolyConnectivity.hh:1179
│ │ │ -
ConstVertexOHalfedgeCWIter CVOHCWIter
Alias typedef.
Definition PolyConnectivity.hh:493
│ │ │ -
FaceHalfedgeIter ConstFaceHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:372
│ │ │ -
VertexOHalfedgeCWIter VOHCWIter
Alias typedef.
Definition PolyConnectivity.hh:464
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter
Enumerate incident vertices in a counter clockwise fashion.
Definition PolyConnectivity.hh:310
│ │ │ -
FaceVertexCWIter FVCWIter
Alias typedef.
Definition PolyConnectivity.hh:476
│ │ │ -
Face & deref(FaceHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1783
│ │ │ -
EdgeFaceIter EFIter
Alias typedef.
Definition PolyConnectivity.hh:487
│ │ │ -
static const VertexHandle InvalidVertexHandle
Invalid handle.
Definition PolyConnectivity.hh:120
│ │ │ -
VertexIter vertices_begin()
Begin iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:308
│ │ │ -
ConstFaceIter CFIter
Alias typedef.
Definition PolyConnectivity.hh:458
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange
Definition PolyConnectivity.hh:1286
│ │ │ -
Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:234
│ │ │ -
HalfedgeIter ConstHalfedgeIter
Linear iterator.
Definition PolyConnectivity.hh:145
│ │ │ -
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > VertexIHalfedgeCCWIter
Enumerates incoming half edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:219
│ │ │ -
FaceVertexCCWIter ConstFaceVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:371
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange
Definition PolyConnectivity.hh:1270
│ │ │ -
static const EdgeHandle InvalidEdgeHandle
Invalid handle.
Definition PolyConnectivity.hh:124
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity::ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange
Definition PolyConnectivity.hh:1278
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity::vertices_end > > ConstVertexRangeSkipping
Definition PolyConnectivity.hh:1169
│ │ │ -
Halfedge & deref(HalfedgeHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1779
│ │ │ -
Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:254
│ │ │ -
FaceEdgeIter FEIter
Alias typedef.
Definition PolyConnectivity.hh:481
│ │ │ -
FaceEdgeIter ConstFaceEdgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:375
│ │ │ -
ConstVertexEdgeIter CVEIter
Alias typedef.
Definition PolyConnectivity.hh:498
│ │ │ -
Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:322
│ │ │ -
Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > VertexIHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:214
│ │ │ -
FaceIter faces_end()
End iterator for faces.
Definition PolyConnectivity_inline_impl.hh:350
│ │ │ -
void assign_connectivity(const PolyConnectivity &_other)
assign_connectivity() method.
Definition PolyConnectivity.hh:531
│ │ │ -
VertexOHalfedgeCCWIter VOHCCWIter
Alias typedef.
Definition PolyConnectivity.hh:465
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity::cvf_end > > ConstVertexFaceRange
Definition PolyConnectivity.hh:1272
│ │ │ -
EdgeHandle EHandle
Alias typedef.
Definition PolyConnectivity.hh:447
│ │ │ -
FaceHandle FHandle
Alias typedef.
Definition PolyConnectivity.hh:448
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity::cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange
Definition PolyConnectivity.hh:1294
│ │ │ -
Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:311
│ │ │ -
ConstFaceEdgeCWIter CFECWIter
Alias typedef.
Definition PolyConnectivity.hh:511
│ │ │ -
ConstFaceFaceIter CFFIter
Alias typedef.
Definition PolyConnectivity.hh:513
│ │ │ -
VertexFaceCCWIter ConstVertexFaceCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:290
│ │ │ -
ConstEdgeHalfedgeIter CEHIter
Alias typedef.
Definition PolyConnectivity.hh:517
│ │ │ -
VertexOHalfedgeIter ConstVertexOHalfedgeIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:282
│ │ │ -
VertexIHalfedgeCWIter VIHICWter
Alias typedef.
Definition PolyConnectivity.hh:467
│ │ │ -
VertexEdgeIter VEIter
Alias typedef.
Definition PolyConnectivity.hh:469
│ │ │ -
FaceIter ConstFaceIter
Linear iterator.
Definition PolyConnectivity.hh:147
│ │ │ -
VertexOHalfedgeIter VOHIter
Alias typedef.
Definition PolyConnectivity.hh:463
│ │ │ -
VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:286
│ │ │ -
VertexEdgeCWIter ConstVertexEdgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:292
│ │ │ -
Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:175
│ │ │ -
ConstVertexFaceCWIter CVFCWIter
Alias typedef.
Definition PolyConnectivity.hh:502
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity::cef_end > > ConstEdgeFaceRange
Definition PolyConnectivity.hh:1279
│ │ │ -
bool is_boundary(HalfedgeHandle _heh) const
Check if the halfedge is at the boundary.
Definition PolyConnectivity.hh:1568
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity::halfedges_end > > ConstHalfedgeRange
Definition PolyConnectivity.hh:1174
│ │ │ -
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter
Enumerate incident half edges in a clockwise fashion.
Definition PolyConnectivity.hh:327
│ │ │ -
VertexVertexCWIter ConstVertexVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:280
│ │ │ -
VertexEdgeCCWIter ConstVertexEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:293
│ │ │ -
VertexVertexIter ConstVertexVertexIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:279
│ │ │ -
VertexFaceCWIter VFCWIter
Alias typedef.
Definition PolyConnectivity.hh:473
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter
Enumerate adjacent faces in a counter clockwise fashion.
Definition PolyConnectivity.hh:361
│ │ │ -
FaceHalfedgeCWIter ConstFaceHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:373
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity::cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange
Definition PolyConnectivity.hh:1274
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter
Enumerate faces incident to an edge.
Definition PolyConnectivity.hh:423
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity::cev_end > > ConstEdgeVertexRange
Definition PolyConnectivity.hh:1277
│ │ │ -
Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:273
│ │ │ -
const Vertex & deref(VertexHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1776
│ │ │ -
Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter
Enumerate adjacent faces in a clockwise fashion.
Definition PolyConnectivity.hh:367
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter
Enumerate incident edges in a counter clockwise fashion.
Definition PolyConnectivity.hh:341
│ │ │ -
VertexIter vertices_end()
End iterator for vertices.
Definition PolyConnectivity_inline_impl.hh:314
│ │ │ -
Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter
Enumerate incident edges in a clockwise fashion.
Definition PolyConnectivity.hh:347
│ │ │ -
Vertex & deref(VertexHandle _h)
Get item from handle.
Definition PolyConnectivity.hh:1777
│ │ │ -
Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter
Enumerate vertices incident to an edge.
Definition PolyConnectivity.hh:397
│ │ │ -
Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter
Enumerates incident faces in a counter clockwise fashion.
Definition PolyConnectivity.hh:239
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity::cff_end > > ConstFaceFaceRange
Definition PolyConnectivity.hh:1276
│ │ │ -
ConstFaceHalfedgeCWIter CFHCWIter
Alias typedef.
Definition PolyConnectivity.hh:508
│ │ │ -
const Face & deref(FaceHandle _h) const
Get item from handle.
Definition PolyConnectivity.hh:1782
│ │ │ -
FaceIter faces_begin()
Begin iterator for faces.
Definition PolyConnectivity_inline_impl.hh:344
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity::chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange
Definition PolyConnectivity.hh:1291
│ │ │ -
FaceVertexIter FVIter
Alias typedef.
Definition PolyConnectivity.hh:475
│ │ │ -
FaceFaceIter FFIter
Alias typedef.
Definition PolyConnectivity.hh:484
│ │ │ -
FaceHalfedgeCWIter FHCWIter
Alias typedef.
Definition PolyConnectivity.hh:479
│ │ │ -
Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:342
│ │ │ -
ConstFaceFaceCCWIter CFFCCWIter
Alias typedef.
Definition PolyConnectivity.hh:515
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity::cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange
Definition PolyConnectivity.hh:1297
│ │ │ -
VertexIHalfedgeCCWIter VIHICCWter
Alias typedef.
Definition PolyConnectivity.hh:468
│ │ │ -
EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity::ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > > ConstFaceRangeSkipping
Definition PolyConnectivity.hh:1199
│ │ │ -
ConstVertexIHalfedgeIter CVIHIter
Alias typedef.
Definition PolyConnectivity.hh:495
│ │ │ -
CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity::cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange
Definition PolyConnectivity.hh:1298
│ │ │ -
VertexEdgeCCWIter VECCWIter
Alias typedef.
Definition PolyConnectivity.hh:471
│ │ │ -
FaceVertexCWIter ConstFaceVertexCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:370
│ │ │ -
FaceIter FIter
Alias typedef.
Definition PolyConnectivity.hh:453
│ │ │ -
Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > VertexOHalfedgeCWIter
Enumerates 1-ring vertices in a clockwise fashion.
Definition PolyConnectivity.hh:195
│ │ │ -
ConstVertexFaceIter CVFIter
Alias typedef.
Definition PolyConnectivity.hh:501
│ │ │ -
Definition PolyConnectivity.hh:163
│ │ │ -
Definition PolyConnectivity.hh:184
│ │ │ - │ │ │ -
Definition PolyConnectivity.hh:223
│ │ │ -
Definition PolyConnectivity.hh:243
│ │ │ -
Definition PolyConnectivity.hh:262
│ │ │ -
Definition PolyConnectivity.hh:300
│ │ │ -
Definition PolyConnectivity.hh:331
│ │ │ -
Definition PolyConnectivity.hh:351
│ │ │ -
Definition PolyConnectivity.hh:387
│ │ │ -
Definition PolyConnectivity.hh:400
│ │ │ -
Definition PolyConnectivity.hh:413
│ │ │ -
Definition PolyConnectivity.hh:1203
│ │ │ -
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ -
Definition SmartHandles.hh:170
│ │ │ -
Definition SmartHandles.hh:197
│ │ │ -
Definition SmartHandles.hh:228
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,16 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -PolyConnectivity.hh │ │ │ │ +bla.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -47,2174 +47,80 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44#ifndef OPENMESH_POLYCONNECTIVITY_HH │ │ │ │ -45#define OPENMESH_POLYCONNECTIVITY_HH │ │ │ │ -46 │ │ │ │ -47#include │ │ │ │ -48#include │ │ │ │ -49 │ │ │ │ -50namespace _O_p_e_n_M_e_s_h │ │ │ │ -51{ │ │ │ │ +44// │ │ │ │ +============================================================================= │ │ │ │ +45// │ │ │ │ +46// CLASS bla │ │ │ │ +47// │ │ │ │ +48// │ │ │ │ +============================================================================= │ │ │ │ +49#ifndef DOXY_IGNORE_THIS │ │ │ │ +50#ifndef OPENMESH_NEWCLASST_HH │ │ │ │ +51#define OPENMESH_NEWCLASST_HH │ │ │ │ 52 │ │ │ │ -53namespace Iterators │ │ │ │ -54{ │ │ │ │ -55 template │ │ │ │ -56 class GenericIteratorT; │ │ │ │ -57 │ │ │ │ -58 template │ │ │ │ -59 class GenericCirculatorBaseT; │ │ │ │ -60 │ │ │ │ -61 template │ │ │ │ -62 class GenericCirculatorT_DEPRECATED; │ │ │ │ +53 │ │ │ │ +54//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +55 │ │ │ │ +56 │ │ │ │ +57//== FORWARDDECLARATIONS │ │ │ │ +====================================================== │ │ │ │ +58 │ │ │ │ +59 │ │ │ │ +60//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +61 │ │ │ │ +62namespace _O_p_e_n_M_e_s_h { │ │ │ │ 63 │ │ │ │ -64 template │ │ │ │ -65 class GenericCirculatorT; │ │ │ │ -66} │ │ │ │ +64 │ │ │ │ +65//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +66 │ │ │ │ 67 │ │ │ │ -68template │ │ │ │ -69class EntityRange; │ │ │ │ -70 │ │ │ │ -71template< │ │ │ │ -72 typename CONTAINER_T, │ │ │ │ -73 typename ITER_T, │ │ │ │ -74 ITER_T (CONTAINER_T::*begin_fn)() const, │ │ │ │ -75 ITER_T (CONTAINER_T::*end_fn)() const> │ │ │ │ -_7_6struct _R_a_n_g_e_T_r_a_i_t_T │ │ │ │ -77{ │ │ │ │ -78 using CONTAINER_TYPE = CONTAINER_T; │ │ │ │ -79 using ITER_TYPE = ITER_T; │ │ │ │ -80 static ITER_TYPE begin(const CONTAINER_TYPE& _container) { return │ │ │ │ -(_container.*begin_fn)(); } │ │ │ │ -81 static ITER_TYPE end(const CONTAINER_TYPE& _container) { return │ │ │ │ -(_container.*end_fn)(); } │ │ │ │ -82}; │ │ │ │ -83 │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +77template <> │ │ │ │ +78class blaT │ │ │ │ +79{ │ │ │ │ +80public: │ │ │ │ +81 │ │ │ │ +83 blaT() {} │ │ │ │ 84 │ │ │ │ -85template │ │ │ │ -86class _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ +86 ~blaT() {} │ │ │ │ 87 │ │ │ │ -88template< │ │ │ │ -89 typename CONTAINER_T, │ │ │ │ -90 typename ITER_T, │ │ │ │ -91 typename CENTER_ENTITY_T, │ │ │ │ -92 typename TO_ENTITY_T, │ │ │ │ -93 ITER_T (CONTAINER_T::*begin_fn)(CENTER_ENTITY_T) const, │ │ │ │ -94 ITER_T (CONTAINER_T::*end_fn)(CENTER_ENTITY_T) const> │ │ │ │ -_9_5struct _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T │ │ │ │ -96{ │ │ │ │ -97 using CONTAINER_TYPE = CONTAINER_T; │ │ │ │ -98 using ITER_TYPE = ITER_T; │ │ │ │ -99 using CENTER_ENTITY_TYPE = CENTER_ENTITY_T; │ │ │ │ -100 using TO_ENTITYE_TYPE = TO_ENTITY_T; │ │ │ │ -101 static ITER_TYPE begin(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE │ │ │ │ -_ce) { return (_container.*begin_fn)(_ce); } │ │ │ │ -102 static ITER_TYPE begin(const CONTAINER_TYPE& _container, _H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh, int) { return ITER_TYPE(_container, _heh); } │ │ │ │ -103 static ITER_TYPE end(const CONTAINER_TYPE& _container, CENTER_ENTITY_TYPE │ │ │ │ -_ce) { return (_container.*end_fn)(_ce); } │ │ │ │ -104 static ITER_TYPE end(const CONTAINER_TYPE& _container, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, │ │ │ │ -int) { return ITER_TYPE(_container, _heh, true); } │ │ │ │ -105}; │ │ │ │ -106 │ │ │ │ -107struct _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -108struct _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -109struct _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -110struct _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -111 │ │ │ │ -_1_1_4class OPENMESHDLLEXPORT _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y : public _A_r_r_a_y_K_e_r_n_e_l │ │ │ │ -115{ │ │ │ │ -116public: │ │ │ │ -118 │ │ │ │ -119 │ │ │ │ -_1_2_0 static const _V_e_r_t_e_x_H_a_n_d_l_e _I_n_v_a_l_i_d_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -_1_2_2 static const _H_a_l_f_e_d_g_e_H_a_n_d_l_e _I_n_v_a_l_i_d_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -_1_2_4 static const _E_d_g_e_H_a_n_d_l_e _I_n_v_a_l_i_d_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -_1_2_6 static const _F_a_c_e_H_a_n_d_l_e _I_n_v_a_l_i_d_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -128 │ │ │ │ -_1_2_9 typedef _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y _T_h_i_s; │ │ │ │ -130 │ │ │ │ -131 //--- iterators --- │ │ │ │ -132 │ │ │ │ -_1_3_9 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l_ _, │ │ │ │ -_&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___v_e_r_t_e_x___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___v_e_r_t_i_c_e_s_> _V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_4_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l │ │ │ │ -_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___h_a_l_f_e_d_g_e___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___h_a_l_f_e_d_g_e_s_> _H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_4_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l_ _, │ │ │ │ -_&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___e_d_g_e___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___e_d_g_e_s_> _E_d_g_e_I_t_e_r; │ │ │ │ -_1_4_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T_<_T_h_i_s_,_ _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e_,_ _A_r_r_a_y_K_e_r_n_e_l_ _, │ │ │ │ -_&_A_r_r_a_y_K_e_r_n_e_l_:_:_h_a_s___f_a_c_e___s_t_a_t_u_s_,_ _&_A_r_r_a_y_K_e_r_n_e_l_:_:_n___f_a_c_e_s_> _F_a_c_e_I_t_e_r; │ │ │ │ -143 │ │ │ │ -_1_4_4 typedef _V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_4_5 typedef _H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_4_6 typedef _E_d_g_e_I_t_e_r _C_o_n_s_t_E_d_g_e_I_t_e_r; │ │ │ │ -_1_4_7 typedef _F_a_c_e_I_t_e_r _C_o_n_s_t_F_a_c_e_I_t_e_r; │ │ │ │ -149 │ │ │ │ -150 //--- circulators --- │ │ │ │ -151 │ │ │ │ -157 │ │ │ │ -158 /* │ │ │ │ -159 * Vertex-centered circulators │ │ │ │ -160 */ │ │ │ │ -161 │ │ │ │ -_1_6_2 struct _V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ -163 { │ │ │ │ -164 using _M_e_s_h = _T_h_i_s; │ │ │ │ -165 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -166 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -167 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return _mesh->to_vertex_handle(_heh);} │ │ │ │ -168 }; │ │ │ │ -169 │ │ │ │ -170 │ │ │ │ -_1_7_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s_> │ │ │ │ -_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_1_7_5 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ -176 │ │ │ │ -_1_8_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ -181 │ │ │ │ -182 │ │ │ │ -_1_8_3 struct _V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -184 { │ │ │ │ -185 using _M_e_s_h = _T_h_i_s; │ │ │ │ -186 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -187 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -188 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const /*_mesh*/, _T_h_i_s_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { return _heh;} │ │ │ │ -189 }; │ │ │ │ -190 │ │ │ │ -_1_9_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_1_9_5 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ -196 │ │ │ │ -_2_0_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -201 │ │ │ │ -_2_0_2 struct _V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -203 { │ │ │ │ -204 using _M_e_s_h = _T_h_i_s; │ │ │ │ -205 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -206 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -207 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return _mesh->_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh); } │ │ │ │ -208 }; │ │ │ │ -209 │ │ │ │ -_2_1_3 typedef _I_t_e_r_a_t_o_r_s_:_: │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_2_1_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ -215 │ │ │ │ -_2_1_9 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -220 │ │ │ │ -221 │ │ │ │ -_2_2_2 struct _V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s │ │ │ │ -223 { │ │ │ │ -224 using _M_e_s_h = _T_h_i_s; │ │ │ │ -225 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -226 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -227 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->face_handle(_heh); } │ │ │ │ -228 }; │ │ │ │ -229 │ │ │ │ -_2_3_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s_> │ │ │ │ -_V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ -_2_3_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r; │ │ │ │ -235 │ │ │ │ -_2_3_9 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ -240 │ │ │ │ -241 │ │ │ │ -_2_4_2 struct _V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s │ │ │ │ -243 { │ │ │ │ -244 using _M_e_s_h = _T_h_i_s; │ │ │ │ -245 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -246 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -247 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->edge_handle(_heh); } │ │ │ │ -248 }; │ │ │ │ -249 │ │ │ │ -_2_5_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ -_2_5_4 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r; │ │ │ │ -_2_5_8 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -259 │ │ │ │ -260 │ │ │ │ -_2_6_1 struct _F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -262 { │ │ │ │ -263 using _M_e_s_h = _T_h_i_s; │ │ │ │ -264 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -265 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -266 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const /*_mesh*/, _T_h_i_s_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { return _heh; } │ │ │ │ -267 }; │ │ │ │ -268 │ │ │ │ -_2_7_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r; │ │ │ │ -_2_7_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r; │ │ │ │ -_2_7_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r; │ │ │ │ -278 │ │ │ │ -_2_7_9 typedef _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_2_8_0 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ -_2_8_1 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ -_2_8_2 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_2_8_3 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ -_2_8_4 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -_2_8_5 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_2_8_6 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ -_2_8_7 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -_2_8_8 typedef _V_e_r_t_e_x_F_a_c_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r; │ │ │ │ -_2_8_9 typedef _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r; │ │ │ │ -_2_9_0 typedef _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ -_2_9_1 typedef _V_e_r_t_e_x_E_d_g_e_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r; │ │ │ │ -_2_9_2 typedef _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r; │ │ │ │ -_2_9_3 typedef _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -294 │ │ │ │ -295 /* │ │ │ │ -296 * Face-centered circulators │ │ │ │ -297 */ │ │ │ │ -298 │ │ │ │ -_2_9_9 struct _F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ -300 { │ │ │ │ -301 using _M_e_s_h = _T_h_i_s; │ │ │ │ -302 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -303 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -304 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->to_vertex_handle(_heh); │ │ │ │ -} │ │ │ │ -305 }; │ │ │ │ -306 │ │ │ │ -_3_1_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s_> │ │ │ │ -_F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_3_1_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ -312 │ │ │ │ -_3_1_6 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ -317 │ │ │ │ -_3_2_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_3_2_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -323 │ │ │ │ -_3_2_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ -328 │ │ │ │ -329 │ │ │ │ -_3_3_0 struct _F_a_c_e_E_d_g_e_T_r_a_i_t_s │ │ │ │ -331 { │ │ │ │ -332 using _M_e_s_h = _T_h_i_s; │ │ │ │ -333 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -334 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -335 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->edge_handle(_heh); } │ │ │ │ -336 }; │ │ │ │ -337 │ │ │ │ -_3_4_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_E_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ -_3_4_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_E_d_g_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -343 │ │ │ │ -_3_4_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_E_d_g_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_F_a_c_e_E_d_g_e_C_W_I_t_e_r; │ │ │ │ -348 │ │ │ │ -349 │ │ │ │ -_3_5_0 struct _F_a_c_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ -351 { │ │ │ │ -352 using _M_e_s_h = _T_h_i_s; │ │ │ │ -353 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -354 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -355 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->face_handle(_mesh- │ │ │ │ ->_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e(_heh)); } │ │ │ │ -356 }; │ │ │ │ -357 │ │ │ │ -_3_6_1 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_F_a_c_e_F_a_c_e_T_r_a_i_t_s_> │ │ │ │ -_F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ -_3_6_2 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_F_a_c_e_T_r_a_i_t_s_,_ _t_r_u_e_> │ │ │ │ -_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ -363 │ │ │ │ -_3_6_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_F_a_c_e_F_a_c_e_T_r_a_i_t_s_,_ _f_a_l_s_e_> │ │ │ │ -_F_a_c_e_F_a_c_e_C_W_I_t_e_r; │ │ │ │ -368 │ │ │ │ -_3_6_9 typedef _F_a_c_e_V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_3_7_0 typedef _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r; │ │ │ │ -_3_7_1 typedef _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r; │ │ │ │ -_3_7_2 typedef _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_3_7_3 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r; │ │ │ │ -_3_7_4 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -_3_7_5 typedef _F_a_c_e_E_d_g_e_I_t_e_r _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r; │ │ │ │ -_3_7_6 typedef _F_a_c_e_E_d_g_e_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r; │ │ │ │ -_3_7_7 typedef _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r; │ │ │ │ -_3_7_8 typedef _F_a_c_e_F_a_c_e_I_t_e_r _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r; │ │ │ │ -_3_7_9 typedef _F_a_c_e_F_a_c_e_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r; │ │ │ │ -_3_8_0 typedef _F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r; │ │ │ │ -381 │ │ │ │ -382 /* │ │ │ │ -383 * Edge-centered circulators │ │ │ │ -384 */ │ │ │ │ -385 │ │ │ │ -_3_8_6 struct _E_d_g_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ -387 { │ │ │ │ -388 using _M_e_s_h = _T_h_i_s; │ │ │ │ -389 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -390 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -391 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->from_vertex_handle │ │ │ │ -(_heh); } │ │ │ │ -392 }; │ │ │ │ -393 │ │ │ │ -_3_9_7 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_E_d_g_e_V_e_r_t_e_x_T_r_a_i_t_s_> │ │ │ │ -_E_d_g_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -398 │ │ │ │ -_3_9_9 struct _E_d_g_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -400 { │ │ │ │ -401 using _M_e_s_h = _T_h_i_s; │ │ │ │ -402 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -403 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -404 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const /* _mesh */, _T_h_i_s_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) { return _heh; } │ │ │ │ -405 }; │ │ │ │ -406 │ │ │ │ -_4_1_0 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_E_d_g_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s_> │ │ │ │ -_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -411 │ │ │ │ -_4_1_2 struct _E_d_g_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ -413 { │ │ │ │ -414 using _M_e_s_h = _T_h_i_s; │ │ │ │ -415 using _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e = _T_h_i_s_:_:_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -416 using _V_a_l_u_e_H_a_n_d_l_e = _T_h_i_s_:_:_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -417 static _V_a_l_u_e_H_a_n_d_l_e toHandle(const _M_e_s_h* const _mesh, _T_h_i_s_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) { return static_cast(_mesh)->face_handle(_heh); } │ │ │ │ -418 }; │ │ │ │ -419 │ │ │ │ -_4_2_3 typedef _I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_<_E_d_g_e_F_a_c_e_T_r_a_i_t_s_> │ │ │ │ -_E_d_g_e_F_a_c_e_I_t_e_r; │ │ │ │ -424 │ │ │ │ -_4_2_5 typedef _E_d_g_e_V_e_r_t_e_x_I_t_e_r _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r; │ │ │ │ -_4_2_6 typedef _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r; │ │ │ │ -_4_2_7 typedef _E_d_g_e_F_a_c_e_I_t_e_r _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r; │ │ │ │ -428 │ │ │ │ -429 /* │ │ │ │ -430 * Halfedge circulator │ │ │ │ -431 */ │ │ │ │ -_4_3_2 typedef _H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r; │ │ │ │ -_4_3_3 typedef _H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r; │ │ │ │ -_4_3_4 typedef _H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r; │ │ │ │ -435 │ │ │ │ -437 │ │ │ │ -438 // --- shortcuts │ │ │ │ -439 │ │ │ │ -_4_4_5 typedef _V_e_r_t_e_x_H_a_n_d_l_e _V_H_a_n_d_l_e; │ │ │ │ -_4_4_6 typedef _H_a_l_f_e_d_g_e_H_a_n_d_l_e _H_H_a_n_d_l_e; │ │ │ │ -_4_4_7 typedef _E_d_g_e_H_a_n_d_l_e _E_H_a_n_d_l_e; │ │ │ │ -_4_4_8 typedef _F_a_c_e_H_a_n_d_l_e _F_H_a_n_d_l_e; │ │ │ │ -449 │ │ │ │ -_4_5_0 typedef _V_e_r_t_e_x_I_t_e_r _V_I_t_e_r; │ │ │ │ -_4_5_1 typedef _H_a_l_f_e_d_g_e_I_t_e_r _H_I_t_e_r; │ │ │ │ -_4_5_2 typedef _E_d_g_e_I_t_e_r _E_I_t_e_r; │ │ │ │ -_4_5_3 typedef _F_a_c_e_I_t_e_r _F_I_t_e_r; │ │ │ │ -454 │ │ │ │ -_4_5_5 typedef _C_o_n_s_t_V_e_r_t_e_x_I_t_e_r _C_V_I_t_e_r; │ │ │ │ -_4_5_6 typedef _C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r _C_H_I_t_e_r; │ │ │ │ -_4_5_7 typedef _C_o_n_s_t_E_d_g_e_I_t_e_r _C_E_I_t_e_r; │ │ │ │ -_4_5_8 typedef _C_o_n_s_t_F_a_c_e_I_t_e_r _C_F_I_t_e_r; │ │ │ │ -459 │ │ │ │ -_4_6_0 typedef _V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _V_V_I_t_e_r; │ │ │ │ -_4_6_1 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _V_V_C_W_I_t_e_r; │ │ │ │ -_4_6_2 typedef _V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _V_V_C_C_W_I_t_e_r; │ │ │ │ -_4_6_3 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _V_O_H_I_t_e_r; │ │ │ │ -_4_6_4 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _V_O_H_C_W_I_t_e_r; │ │ │ │ -_4_6_5 typedef _V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _V_O_H_C_C_W_I_t_e_r; │ │ │ │ -_4_6_6 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _V_I_H_I_t_e_r; │ │ │ │ -_4_6_7 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _V_I_H_I_C_W_t_e_r; │ │ │ │ -_4_6_8 typedef _V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _V_I_H_I_C_C_W_t_e_r; │ │ │ │ -_4_6_9 typedef _V_e_r_t_e_x_E_d_g_e_I_t_e_r _V_E_I_t_e_r; │ │ │ │ -_4_7_0 typedef _V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _V_E_C_W_I_t_e_r; │ │ │ │ -_4_7_1 typedef _V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _V_E_C_C_W_I_t_e_r; │ │ │ │ -_4_7_2 typedef _V_e_r_t_e_x_F_a_c_e_I_t_e_r _V_F_I_t_e_r; │ │ │ │ -_4_7_3 typedef _V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _V_F_C_W_I_t_e_r; │ │ │ │ -_4_7_4 typedef _V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _V_F_C_C_W_I_t_e_r; │ │ │ │ -_4_7_5 typedef _F_a_c_e_V_e_r_t_e_x_I_t_e_r _F_V_I_t_e_r; │ │ │ │ -_4_7_6 typedef _F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _F_V_C_W_I_t_e_r; │ │ │ │ -_4_7_7 typedef _F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _F_V_C_C_W_I_t_e_r; │ │ │ │ -_4_7_8 typedef _F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _F_H_I_t_e_r; │ │ │ │ -_4_7_9 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _F_H_C_W_I_t_e_r; │ │ │ │ -_4_8_0 typedef _F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _F_H_C_W_W_I_t_e_r; │ │ │ │ -_4_8_1 typedef _F_a_c_e_E_d_g_e_I_t_e_r _F_E_I_t_e_r; │ │ │ │ -_4_8_2 typedef _F_a_c_e_E_d_g_e_C_W_I_t_e_r _F_E_C_W_I_t_e_r; │ │ │ │ -_4_8_3 typedef _F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _F_E_C_W_W_I_t_e_r; │ │ │ │ -_4_8_4 typedef _F_a_c_e_F_a_c_e_I_t_e_r _F_F_I_t_e_r; │ │ │ │ -_4_8_5 typedef _E_d_g_e_V_e_r_t_e_x_I_t_e_r _E_V_I_t_e_r; │ │ │ │ -_4_8_6 typedef _E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _E_H_I_t_e_r; │ │ │ │ -_4_8_7 typedef _E_d_g_e_F_a_c_e_I_t_e_r _E_F_I_t_e_r; │ │ │ │ -488 │ │ │ │ -_4_8_9 typedef _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r _C_V_V_I_t_e_r; │ │ │ │ -_4_9_0 typedef _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r _C_V_V_C_W_I_t_e_r; │ │ │ │ -_4_9_1 typedef _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r _C_V_V_C_C_W_I_t_e_r; │ │ │ │ -_4_9_2 typedef _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r _C_V_O_H_I_t_e_r; │ │ │ │ -_4_9_3 typedef _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_V_O_H_C_W_I_t_e_r; │ │ │ │ -_4_9_4 typedef _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_V_O_H_C_C_W_I_t_e_r; │ │ │ │ -_4_9_5 typedef _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r _C_V_I_H_I_t_e_r; │ │ │ │ -_4_9_6 typedef _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_V_I_H_C_W_I_t_e_r; │ │ │ │ -_4_9_7 typedef _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_V_I_H_C_C_W_I_t_e_r; │ │ │ │ -_4_9_8 typedef _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r _C_V_E_I_t_e_r; │ │ │ │ -_4_9_9 typedef _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r _C_V_E_C_W_I_t_e_r; │ │ │ │ -_5_0_0 typedef _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r _C_V_E_C_C_W_I_t_e_r; │ │ │ │ -_5_0_1 typedef _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r _C_V_F_I_t_e_r; │ │ │ │ -_5_0_2 typedef _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r _C_V_F_C_W_I_t_e_r; │ │ │ │ -_5_0_3 typedef _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r _C_V_F_C_C_W_I_t_e_r; │ │ │ │ -_5_0_4 typedef _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r _C_F_V_I_t_e_r; │ │ │ │ -_5_0_5 typedef _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r _C_F_V_C_W_I_t_e_r; │ │ │ │ -_5_0_6 typedef _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r _C_F_V_C_C_W_I_t_e_r; │ │ │ │ -_5_0_7 typedef _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r _C_F_H_I_t_e_r; │ │ │ │ -_5_0_8 typedef _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r _C_F_H_C_W_I_t_e_r; │ │ │ │ -_5_0_9 typedef _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r _C_F_H_C_C_W_I_t_e_r; │ │ │ │ -_5_1_0 typedef _C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r _C_F_E_I_t_e_r; │ │ │ │ -_5_1_1 typedef _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r _C_F_E_C_W_I_t_e_r; │ │ │ │ -_5_1_2 typedef _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r _C_F_E_C_C_W_I_t_e_r; │ │ │ │ -_5_1_3 typedef _C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r _C_F_F_I_t_e_r; │ │ │ │ -_5_1_4 typedef _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r _C_F_F_C_W_I_t_e_r; │ │ │ │ -_5_1_5 typedef _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r _C_F_F_C_C_W_I_t_e_r; │ │ │ │ -_5_1_6 typedef _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r _C_E_V_I_t_e_r; │ │ │ │ -_5_1_7 typedef _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r _C_E_H_I_t_e_r; │ │ │ │ -_5_1_8 typedef _C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r _C_E_F_I_t_e_r; │ │ │ │ -520 │ │ │ │ -521public: │ │ │ │ -522 │ │ │ │ -_5_2_3 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ -_5_2_4 virtual _~_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y() {} │ │ │ │ -525 │ │ │ │ -_5_2_6 inline static bool _i_s___t_r_i_a_n_g_l_e_s() │ │ │ │ -527 { return false; } │ │ │ │ -528 │ │ │ │ -_5_3_1 inline void _a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _other) │ │ │ │ -532 { _A_r_r_a_y_K_e_r_n_e_l_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y(_other); } │ │ │ │ -533 │ │ │ │ -537 │ │ │ │ -539 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e add_vertex(); │ │ │ │ -540 │ │ │ │ -548 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(const std::vector& _vhandles); │ │ │ │ -549 │ │ │ │ -557 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(const std::vector& _vhandles); │ │ │ │ -558 │ │ │ │ -559 │ │ │ │ -569 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -_vh2); │ │ │ │ -570 │ │ │ │ -581 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -_vh2, _V_e_r_t_e_x_H_a_n_d_l_e _vh3); │ │ │ │ -582 │ │ │ │ -591 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e add_face(const _V_e_r_t_e_x_H_a_n_d_l_e* _vhandles, size_t _vhs_size); │ │ │ │ -592 │ │ │ │ -594 │ │ │ │ -596 │ │ │ │ -597 │ │ │ │ -602 bool is_collapse_ok(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _he); │ │ │ │ -603 │ │ │ │ -604 │ │ │ │ -610 void delete_vertex(_V_e_r_t_e_x_H_a_n_d_l_e _vh, bool _delete_isolated_vertices = │ │ │ │ -true); │ │ │ │ -611 │ │ │ │ -620 void delete_edge(_E_d_g_e_H_a_n_d_l_e _eh, bool _delete_isolated_vertices=true); │ │ │ │ -621 │ │ │ │ -632 void delete_face(_F_a_c_e_H_a_n_d_l_e _fh, bool _delete_isolated_vertices=true); │ │ │ │ -633 │ │ │ │ -634 │ │ │ │ -636 │ │ │ │ -640 │ │ │ │ -641 using ArrayKernel::next_halfedge_handle; │ │ │ │ -642 using ArrayKernel::prev_halfedge_handle; │ │ │ │ -643 using ArrayKernel::opposite_halfedge_handle; │ │ │ │ -644 using ArrayKernel::ccw_rotated_halfedge_handle; │ │ │ │ -645 using ArrayKernel::cw_rotated_halfedge_handle; │ │ │ │ -646 │ │ │ │ -647 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e next_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -const; │ │ │ │ -648 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e prev_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -const; │ │ │ │ -649 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e opposite_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) const; │ │ │ │ -650 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e ccw_rotated_halfedge_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) const; │ │ │ │ -651 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e cw_rotated_halfedge_handle (_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_heh) const; │ │ │ │ -652 │ │ │ │ -653 using ArrayKernel::s_halfedge_handle; │ │ │ │ -654 using ArrayKernel::s_edge_handle; │ │ │ │ -655 │ │ │ │ -656 static _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e s_halfedge_handle(_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _eh, unsigned │ │ │ │ -int _i = 0); │ │ │ │ -657 static _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e s_edge_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -658 │ │ │ │ -659 using ArrayKernel::halfedge_handle; │ │ │ │ -660 using ArrayKernel::edge_handle; │ │ │ │ -661 using ArrayKernel::face_handle; │ │ │ │ -662 │ │ │ │ -663 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _eh, unsigned │ │ │ │ -int _i = 0) const; │ │ │ │ -664 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -665 inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -666 inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e edge_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -667 inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e face_handle(_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -668 │ │ │ │ -670 inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e opposite_face_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -671 │ │ │ │ -673 │ │ │ │ -677 │ │ │ │ -679 VertexIter vertices_begin(); │ │ │ │ -681 ConstVertexIter vertices_begin() const; │ │ │ │ -683 VertexIter vertices_end(); │ │ │ │ -685 ConstVertexIter vertices_end() const; │ │ │ │ -686 │ │ │ │ -688 HalfedgeIter halfedges_begin(); │ │ │ │ -690 ConstHalfedgeIter halfedges_begin() const; │ │ │ │ -692 HalfedgeIter halfedges_end(); │ │ │ │ -694 ConstHalfedgeIter halfedges_end() const; │ │ │ │ -695 │ │ │ │ -697 EdgeIter edges_begin(); │ │ │ │ -699 ConstEdgeIter edges_begin() const; │ │ │ │ -701 EdgeIter edges_end(); │ │ │ │ -703 ConstEdgeIter edges_end() const; │ │ │ │ -704 │ │ │ │ -706 FaceIter faces_begin(); │ │ │ │ -708 ConstFaceIter faces_begin() const; │ │ │ │ -710 FaceIter faces_end(); │ │ │ │ -712 ConstFaceIter faces_end() const; │ │ │ │ -714 │ │ │ │ -715 │ │ │ │ -719 │ │ │ │ -721 VertexIter vertices_sbegin(); │ │ │ │ -723 ConstVertexIter vertices_sbegin() const; │ │ │ │ -724 │ │ │ │ -726 HalfedgeIter halfedges_sbegin(); │ │ │ │ -728 ConstHalfedgeIter halfedges_sbegin() const; │ │ │ │ -729 │ │ │ │ -731 EdgeIter edges_sbegin(); │ │ │ │ -733 ConstEdgeIter edges_sbegin() const; │ │ │ │ -734 │ │ │ │ -736 FaceIter faces_sbegin(); │ │ │ │ -738 ConstFaceIter faces_sbegin() const; │ │ │ │ -739 │ │ │ │ -741 │ │ │ │ -742 //--- circulators --- │ │ │ │ -743 │ │ │ │ -747 │ │ │ │ -749 VertexVertexIter vv_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -751 VertexVertexCWIter vv_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -753 VertexVertexCCWIter vv_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -755 VertexIHalfedgeIter vih_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -757 VertexIHalfedgeCWIter vih_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -759 VertexIHalfedgeCCWIter vih_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -761 VertexOHalfedgeIter voh_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -763 VertexOHalfedgeCWIter voh_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -765 VertexOHalfedgeCCWIter voh_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -767 VertexEdgeIter ve_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -769 VertexEdgeCWIter ve_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -771 VertexEdgeCCWIter ve_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -773 VertexFaceIter vf_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -775 VertexFaceCWIter vf_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -777 VertexFaceCCWIter vf_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -778 │ │ │ │ -780 ConstVertexVertexIter cvv_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -782 ConstVertexVertexCWIter cvv_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -784 ConstVertexVertexCCWIter cvv_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -786 ConstVertexIHalfedgeIter cvih_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -788 ConstVertexIHalfedgeCWIter cvih_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -790 ConstVertexIHalfedgeCCWIter cvih_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -792 ConstVertexOHalfedgeIter cvoh_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -794 ConstVertexOHalfedgeCWIter cvoh_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -796 ConstVertexOHalfedgeCCWIter cvoh_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -798 ConstVertexEdgeIter cve_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -800 ConstVertexEdgeCWIter cve_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -802 ConstVertexEdgeCCWIter cve_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -804 ConstVertexFaceIter cvf_iter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -806 ConstVertexFaceCWIter cvf_cwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -808 ConstVertexFaceCCWIter cvf_ccwiter(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -809 │ │ │ │ -811 FaceVertexIter fv_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -813 FaceVertexCWIter fv_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -815 FaceVertexCCWIter fv_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -817 FaceHalfedgeIter fh_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -819 FaceHalfedgeCWIter fh_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -821 FaceHalfedgeCCWIter fh_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -823 FaceEdgeIter fe_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -825 FaceEdgeCWIter fe_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -827 FaceEdgeCCWIter fe_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -829 FaceFaceIter ff_iter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -831 FaceFaceCWIter ff_cwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -833 FaceFaceCCWIter ff_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -834 │ │ │ │ -836 ConstFaceVertexIter cfv_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -838 ConstFaceVertexCWIter cfv_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -840 ConstFaceVertexCCWIter cfv_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -842 ConstFaceHalfedgeIter cfh_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -844 ConstFaceHalfedgeCWIter cfh_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -846 ConstFaceHalfedgeCCWIter cfh_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -848 ConstFaceEdgeIter cfe_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -850 ConstFaceEdgeCWIter cfe_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -852 ConstFaceEdgeCCWIter cfe_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -854 ConstFaceFaceIter cff_iter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -856 ConstFaceFaceCWIter cff_cwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -858 ConstFaceFaceCCWIter cff_ccwiter(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -859 │ │ │ │ -861 EdgeVertexIter ev_iter(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -863 EdgeHalfedgeIter eh_iter(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -865 EdgeFaceIter ef_iter(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -866 │ │ │ │ -868 ConstEdgeVertexIter cev_iter(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -870 ConstEdgeHalfedgeIter ceh_iter(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -872 ConstEdgeFaceIter cef_iter(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -873 │ │ │ │ -874 // 'begin' circulators │ │ │ │ -875 │ │ │ │ -877 VertexVertexIter vv_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -879 VertexVertexCWIter vv_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -881 VertexVertexCCWIter vv_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -883 VertexIHalfedgeIter vih_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -885 VertexIHalfedgeCWIter vih_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -887 VertexIHalfedgeCCWIter vih_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -889 VertexOHalfedgeIter voh_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -891 VertexOHalfedgeCWIter voh_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -893 VertexOHalfedgeCCWIter voh_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -895 VertexEdgeIter ve_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -897 VertexEdgeCWIter ve_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -899 VertexEdgeCCWIter ve_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -901 VertexFaceIter vf_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -903 VertexFaceCWIter vf_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -905 VertexFaceCCWIter vf_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -906 │ │ │ │ -907 │ │ │ │ -909 ConstVertexVertexIter cvv_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -911 ConstVertexVertexCWIter cvv_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -913 ConstVertexVertexCCWIter cvv_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -915 ConstVertexIHalfedgeIter cvih_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -917 ConstVertexIHalfedgeCWIter cvih_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -919 ConstVertexIHalfedgeCCWIter cvih_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -921 ConstVertexOHalfedgeIter cvoh_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -923 ConstVertexOHalfedgeCWIter cvoh_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -925 ConstVertexOHalfedgeCCWIter cvoh_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -927 ConstVertexEdgeIter cve_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -929 ConstVertexEdgeCWIter cve_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -931 ConstVertexEdgeCCWIter cve_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -933 ConstVertexFaceIter cvf_begin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -935 ConstVertexFaceCWIter cvf_cwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -937 ConstVertexFaceCCWIter cvf_ccwbegin(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -938 │ │ │ │ -940 FaceVertexIter fv_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -942 FaceVertexCWIter fv_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -944 FaceVertexCCWIter fv_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -946 FaceHalfedgeIter fh_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -948 FaceHalfedgeCWIter fh_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -950 FaceHalfedgeCCWIter fh_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -952 FaceEdgeIter fe_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -954 FaceEdgeCWIter fe_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -956 FaceEdgeCCWIter fe_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -958 FaceFaceIter ff_begin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -960 FaceFaceCWIter ff_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -962 FaceFaceCCWIter ff_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -964 HalfedgeLoopIter hl_begin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -966 HalfedgeLoopCWIter hl_cwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -968 HalfedgeLoopCCWIter hl_ccwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -969 │ │ │ │ -971 ConstFaceVertexIter cfv_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -973 ConstFaceVertexCWIter cfv_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -975 ConstFaceVertexCCWIter cfv_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -977 ConstFaceHalfedgeIter cfh_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -979 ConstFaceHalfedgeCWIter cfh_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -981 ConstFaceHalfedgeCCWIter cfh_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -983 ConstFaceEdgeIter cfe_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -985 ConstFaceEdgeCWIter cfe_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -987 ConstFaceEdgeCCWIter cfe_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -989 ConstFaceFaceIter cff_begin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -991 ConstFaceFaceCWIter cff_cwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -993 ConstFaceFaceCCWIter cff_ccwbegin(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -995 ConstHalfedgeLoopIter chl_begin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -997 ConstHalfedgeLoopCWIter chl_cwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -999 ConstHalfedgeLoopCCWIter chl_ccwbegin(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1000 │ │ │ │ -1002 EdgeVertexIter ev_begin(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1004 EdgeHalfedgeIter eh_begin(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1006 EdgeFaceIter ef_begin(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1007 │ │ │ │ -1009 ConstEdgeVertexIter cev_begin(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1011 ConstEdgeHalfedgeIter ceh_begin(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1013 ConstEdgeFaceIter cef_begin(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1014 │ │ │ │ -1015 // 'end' circulators │ │ │ │ -1016 │ │ │ │ -1018 VertexVertexIter vv_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1020 VertexVertexCWIter vv_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1022 VertexVertexCCWIter vv_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1024 VertexIHalfedgeIter vih_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1026 VertexIHalfedgeCWIter vih_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1028 VertexIHalfedgeCCWIter vih_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1030 VertexOHalfedgeIter voh_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1032 VertexOHalfedgeCWIter voh_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1034 VertexOHalfedgeCCWIter voh_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1036 VertexEdgeIter ve_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1038 VertexEdgeCWIter ve_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1040 VertexEdgeCCWIter ve_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1042 VertexFaceIter vf_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1044 VertexFaceCWIter vf_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1046 VertexFaceCCWIter vf_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1047 │ │ │ │ -1049 ConstVertexVertexIter cvv_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1051 ConstVertexVertexCWIter cvv_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1053 ConstVertexVertexCCWIter cvv_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1055 ConstVertexIHalfedgeIter cvih_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1057 ConstVertexIHalfedgeCWIter cvih_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1059 ConstVertexIHalfedgeCCWIter cvih_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1061 ConstVertexOHalfedgeIter cvoh_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1063 ConstVertexOHalfedgeCWIter cvoh_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1065 ConstVertexOHalfedgeCCWIter cvoh_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1067 ConstVertexEdgeIter cve_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1069 ConstVertexEdgeCWIter cve_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1071 ConstVertexEdgeCCWIter cve_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1073 ConstVertexFaceIter cvf_end(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1075 ConstVertexFaceCWIter cvf_cwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1077 ConstVertexFaceCCWIter cvf_ccwend(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1078 │ │ │ │ -1080 FaceVertexIter fv_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1082 FaceVertexCWIter fv_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1084 FaceVertexCCWIter fv_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1086 FaceHalfedgeIter fh_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1088 FaceHalfedgeCWIter fh_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1090 FaceHalfedgeCCWIter fh_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1092 FaceEdgeIter fe_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1094 FaceEdgeCWIter fe_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1096 FaceEdgeCCWIter fe_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1098 FaceFaceIter ff_end(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1100 FaceFaceCWIter ff_cwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1102 FaceFaceCCWIter ff_ccwend(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1104 HalfedgeLoopIter hl_end(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -1106 HalfedgeLoopCWIter hl_cwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -1108 HalfedgeLoopCCWIter hl_ccwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -1109 │ │ │ │ -1111 ConstFaceVertexIter cfv_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1113 ConstFaceVertexCWIter cfv_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1115 ConstFaceVertexCCWIter cfv_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1117 ConstFaceHalfedgeIter cfh_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1119 ConstFaceHalfedgeCWIter cfh_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1121 ConstFaceHalfedgeCCWIter cfh_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1123 ConstFaceEdgeIter cfe_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1125 ConstFaceEdgeCWIter cfe_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1127 ConstFaceEdgeCCWIter cfe_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1129 ConstFaceFaceIter cff_end(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1131 ConstFaceFaceCWIter cff_cwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1133 ConstFaceFaceCCWIter cff_ccwend(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1135 ConstHalfedgeLoopIter chl_end(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1137 ConstHalfedgeLoopCWIter chl_cwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1139 ConstHalfedgeLoopCCWIter chl_ccwend(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1140 │ │ │ │ -1142 EdgeVertexIter ev_end(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1144 EdgeHalfedgeIter eh_end(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1146 EdgeFaceIter ef_end(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1147 │ │ │ │ -1149 ConstEdgeVertexIter cev_end(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1151 ConstEdgeHalfedgeIter ceh_end(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1153 ConstEdgeFaceIter cef_end(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1154 │ │ │ │ -1156 │ │ │ │ -1159 │ │ │ │ -1160 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1161 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1162 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r, │ │ │ │ -1163 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n, │ │ │ │ -_1_1_6_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d>> _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ -1165 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1166 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1167 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r, │ │ │ │ -1168 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n, │ │ │ │ -_1_1_6_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d>> _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1170 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1171 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1172 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r, │ │ │ │ -1173 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n, │ │ │ │ -_1_1_7_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d>> _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ -1175 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1176 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1177 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r, │ │ │ │ -1178 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n, │ │ │ │ -_1_1_7_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d>> _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1180 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1181 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1182 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r, │ │ │ │ -1183 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n, │ │ │ │ -_1_1_8_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d>> _C_o_n_s_t_E_d_g_e_R_a_n_g_e; │ │ │ │ -1185 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1186 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1187 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r, │ │ │ │ -1188 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n, │ │ │ │ -_1_1_8_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d>> _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1190 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1191 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1192 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r, │ │ │ │ -1193 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n, │ │ │ │ -_1_1_9_4 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d>> _C_o_n_s_t_F_a_c_e_R_a_n_g_e; │ │ │ │ -1195 typedef _E_n_t_i_t_y_R_a_n_g_e<_R_a_n_g_e_T_r_a_i_t_T< │ │ │ │ -1196 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y, │ │ │ │ -1197 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r, │ │ │ │ -1198 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n, │ │ │ │ -_1_1_9_9 &_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d>> _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1200 │ │ │ │ -1201 │ │ │ │ -1202 template │ │ │ │ -_1_2_0_3 struct _E_l_e_m_e_n_t_R_a_n_g_e; │ │ │ │ -1204 │ │ │ │ -1209 _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g vertices() const; │ │ │ │ -1210 │ │ │ │ -1215 _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e all_vertices() const; │ │ │ │ -1216 │ │ │ │ -1221 _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g halfedges() const; │ │ │ │ -1222 │ │ │ │ -1227 _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e all_halfedges() const; │ │ │ │ -1228 │ │ │ │ -1233 _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g edges() const; │ │ │ │ -1234 │ │ │ │ -1239 _C_o_n_s_t_E_d_g_e_R_a_n_g_e all_edges() const; │ │ │ │ -1240 │ │ │ │ -1245 _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g faces() const; │ │ │ │ -1246 │ │ │ │ -1251 _C_o_n_s_t_F_a_c_e_R_a_n_g_e all_faces() const; │ │ │ │ -1252 │ │ │ │ -1257 template │ │ │ │ -_1_2_5_8 typename _E_l_e_m_e_n_t_R_a_n_g_e_<_H_a_n_d_l_e_T_y_p_e_>_:_:_R_a_n_g_e_S_k_i_p_p_i_n_g _e_l_e_m_e_n_t_s() const; │ │ │ │ -1259 │ │ │ │ -1264 template │ │ │ │ -_1_2_6_5 typename _E_l_e_m_e_n_t_R_a_n_g_e_<_H_a_n_d_l_e_T_y_p_e_>_:_:_R_a_n_g_e _a_l_l___e_l_e_m_e_n_t_s() const; │ │ │ │ -1266 │ │ │ │ -1267 │ │ │ │ -_1_2_6_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_v___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ -_1_2_6_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_i_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ -_1_2_7_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_o_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ -_1_2_7_1 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___b_e_g_i_n │ │ │ │ -_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e; │ │ │ │ -_1_2_7_2 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___b_e_g_i_n │ │ │ │ -_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e; │ │ │ │ -_1_2_7_3 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___b_e_g_i_n │ │ │ │ -_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ -_1_2_7_4 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ -_1_2_7_5 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___b_e_g_i_n_ _, │ │ │ │ -_&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e; │ │ │ │ -_1_2_7_6 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___b_e_g_i_n_ _, │ │ │ │ -_&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___e_n_d_ _>> _C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e; │ │ │ │ -_1_2_7_7 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___b_e_g_i_n │ │ │ │ -_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_v___e_n_d_ _>> _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ -_1_2_7_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_e_h___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_h___e_n_d_ _>> _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ -_1_2_7_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___b_e_g_i_n_ _, │ │ │ │ -_&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_e_f___e_n_d_ _>> _C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e; │ │ │ │ -_1_2_8_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_h_l___b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___e_n_d_ _>> _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e; │ │ │ │ -1281 │ │ │ │ -_1_2_8_2 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_v___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_3 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_i_h___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_4 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_o_h___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_5 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_e___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_6 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_f___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_7 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_v___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_h___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_8_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_b_e_g_i_n │ │ │ │ -_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_b_e_g_i_n │ │ │ │ -_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_1 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_h_l___c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_w_e_n_d_ _>> _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e; │ │ │ │ -1292 │ │ │ │ -_1_2_9_3 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_v___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_v___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_4 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r_,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_i_h___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_i_h___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_5 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r_,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_o_h___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_o_h___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_6 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_e___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_e___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_7 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_v_f___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_v_f___c_c_w_e_n_d_ _>> _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_8 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _V_e_r_t_e_x_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_v___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_v___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e; │ │ │ │ -_1_2_9_9 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_h___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_h___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_3_0_0 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _E_d_g_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_e___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_e___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_3_0_1 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _F_a_c_e_H_a_n_d_l_e_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_f_f___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_f_f___c_c_w_e_n_d_ _>> _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e; │ │ │ │ -_1_3_0_2 typedef _C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_<_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T_<_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_, │ │ │ │ -_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r_ _,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _H_a_l_f_e_d_g_e_H_a_n_d_l_e_,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_: │ │ │ │ -_c_h_l___c_c_w_b_e_g_i_n_ _,_ _&_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_c_h_l___c_c_w_e_n_d_ _>> _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e; │ │ │ │ -1303 │ │ │ │ -1308 _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e vv_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1309 │ │ │ │ -1314 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e vih_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1315 │ │ │ │ -1321 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e vih_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1322 │ │ │ │ -1327 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e voh_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1328 │ │ │ │ -1334 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e voh_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1335 │ │ │ │ -1340 _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e ve_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const ; │ │ │ │ -1341 │ │ │ │ -1346 _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e vf_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1347 │ │ │ │ -1352 _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e fv_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1353 │ │ │ │ -1358 _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e fh_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1359 │ │ │ │ -1364 _C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e fe_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1365 │ │ │ │ -1370 _C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e ff_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1371 │ │ │ │ -1376 _C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e ev_range(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1377 │ │ │ │ -1382 _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e eh_range(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1383 │ │ │ │ -1389 _C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e eh_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1390 │ │ │ │ -1395 _C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e ef_range(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1396 │ │ │ │ -1401 _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e hl_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1402 │ │ │ │ -1403 │ │ │ │ -1408 _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e vv_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1409 │ │ │ │ -1414 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e vih_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1415 │ │ │ │ -1421 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e vih_cw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1422 │ │ │ │ -1427 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e voh_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1428 │ │ │ │ -1434 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e voh_cw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1435 │ │ │ │ -1440 _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e ve_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1441 │ │ │ │ -1446 _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e vf_cw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1447 │ │ │ │ -1452 _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e fv_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1453 │ │ │ │ -1458 _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e fh_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1459 │ │ │ │ -1464 _C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e fe_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1465 │ │ │ │ -1470 _C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e ff_cw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1471 │ │ │ │ -1476 _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e hl_cw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1477 │ │ │ │ -1478 │ │ │ │ -1483 _C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e vv_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1484 │ │ │ │ -1489 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e vih_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1490 │ │ │ │ -1496 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e vih_ccw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1497 │ │ │ │ -1502 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e voh_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1503 │ │ │ │ -1509 _C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e voh_ccw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1510 │ │ │ │ -1515 _C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e ve_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const ; │ │ │ │ -1516 │ │ │ │ -1521 _C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e vf_ccw_range(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1522 │ │ │ │ -1527 _C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e fv_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1528 │ │ │ │ -1533 _C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e fh_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1534 │ │ │ │ -1539 _C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e fe_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1540 │ │ │ │ -1545 _C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e ff_ccw_range(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1546 │ │ │ │ -1547 │ │ │ │ -1552 _C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e hl_ccw_range(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -1553 │ │ │ │ -1555 │ │ │ │ -1556 // │ │ │ │ -=========================================================================== │ │ │ │ -1559 // │ │ │ │ -=========================================================================== │ │ │ │ -1560 │ │ │ │ -_1_5_6_8 bool _i_s___b_o_u_n_d_a_r_y(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -1569 { return _A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y(_heh); } │ │ │ │ -1570 │ │ │ │ -_1_5_7_9 bool _i_s___b_o_u_n_d_a_r_y(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -1580 { │ │ │ │ -1581 return (is_boundary(halfedge_handle(_eh, 0)) || │ │ │ │ -1582 is_boundary(halfedge_handle(_eh, 1))); │ │ │ │ -1583 } │ │ │ │ -1584 │ │ │ │ -_1_5_9_6 bool _i_s___b_o_u_n_d_a_r_y(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -1597 { │ │ │ │ -1598 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh(halfedge_handle(_vh)); │ │ │ │ -1599 return (!(heh.is_valid() && face_handle(heh).is_valid())); │ │ │ │ -1600 } │ │ │ │ -1601 │ │ │ │ -1611 bool is_boundary(_F_a_c_e_H_a_n_d_l_e _fh, bool _check_vertex=false) const; │ │ │ │ -1612 │ │ │ │ -1623 bool is_manifold(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1624 │ │ │ │ -1627 // --- misc --- │ │ │ │ -1628 │ │ │ │ -1632 void adjust_outgoing_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1633 │ │ │ │ -1635 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e find_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _start_vh, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -_end_vh) const; │ │ │ │ -1637 uint valence(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -1639 uint valence(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1640 │ │ │ │ -1641 // --- connectivity operattions │ │ │ │ -1642 │ │ │ │ -1657 void collapse(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh); │ │ │ │ -1662 bool is_simple_link(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -1667 bool is_simply_connected(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -1680 _F_a_c_e_H_a_n_d_l_e remove_edge(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1684 void reinsert_edge(_E_d_g_e_H_a_n_d_l_e _eh); │ │ │ │ -1694 _H_a_l_f_e_d_g_e_H_a_n_d_l_e insert_edge(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _prev_heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -_next_heh); │ │ │ │ -1695 │ │ │ │ -1708 void split(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1709 │ │ │ │ -1723 void split_copy(_F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1724 │ │ │ │ -1738 void triangulate(_F_a_c_e_H_a_n_d_l_e _fh); │ │ │ │ -1739 │ │ │ │ -1742 void triangulate(); │ │ │ │ -1743 │ │ │ │ -1754 void split_edge(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1755 │ │ │ │ -1767 void split_edge_copy(_E_d_g_e_H_a_n_d_l_e _eh, _V_e_r_t_e_x_H_a_n_d_l_e _vh); │ │ │ │ -1768 │ │ │ │ -1769 │ │ │ │ -_1_7_7_6 const Vertex& _d_e_r_e_f(_V_e_r_t_e_x_H_a_n_d_l_e _h) const { return vertex(_h); } │ │ │ │ -_1_7_7_7 Vertex& _d_e_r_e_f(_V_e_r_t_e_x_H_a_n_d_l_e _h) { return vertex(_h); } │ │ │ │ -_1_7_7_8 const Halfedge& _d_e_r_e_f(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _h) const { return halfedge(_h); } │ │ │ │ -_1_7_7_9 Halfedge& _d_e_r_e_f(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _h) { return halfedge(_h); } │ │ │ │ -_1_7_8_0 const Edge& _d_e_r_e_f(_E_d_g_e_H_a_n_d_l_e _h) const { return edge(_h); } │ │ │ │ -_1_7_8_1 Edge& _d_e_r_e_f(_E_d_g_e_H_a_n_d_l_e _h) { return edge(_h); } │ │ │ │ -_1_7_8_2 const Face& _d_e_r_e_f(_F_a_c_e_H_a_n_d_l_e _h) const { return face(_h); } │ │ │ │ -_1_7_8_3 Face& _d_e_r_e_f(_F_a_c_e_H_a_n_d_l_e _h) { return face(_h); } │ │ │ │ -1785 │ │ │ │ -1786protected: │ │ │ │ -1788 void collapse_edge(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh); │ │ │ │ -1790 void collapse_loop(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh); │ │ │ │ -1791 │ │ │ │ -1792 │ │ │ │ -1793 │ │ │ │ -1794private: // Working storage for add_face() │ │ │ │ -1795 struct AddFaceEdgeInfo │ │ │ │ -1796 { │ │ │ │ -1797 _H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle; │ │ │ │ -1798 bool is_new; │ │ │ │ -1799 bool needs_adjust; │ │ │ │ -1800 }; │ │ │ │ -1801 std::vector edgeData_; // │ │ │ │ -1802 std::vector > next_cache_; / │ │ │ │ -/ cache for set_next_halfedge and vertex' set_halfedge │ │ │ │ -1803 │ │ │ │ -1804}; │ │ │ │ -1805 │ │ │ │ -1806template <> │ │ │ │ -_1_8_0_7struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_V_e_r_t_e_x_H_a_n_d_l_e> │ │ │ │ -1808{ │ │ │ │ -1809 using _R_a_n_g_e = _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e; │ │ │ │ -1810 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1811}; │ │ │ │ -1812 │ │ │ │ -1813template <> │ │ │ │ -_1_8_1_4struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_H_a_l_f_e_d_g_e_H_a_n_d_l_e> │ │ │ │ -1815{ │ │ │ │ -1816 using _R_a_n_g_e = _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e; │ │ │ │ -1817 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1818}; │ │ │ │ -1819 │ │ │ │ -1820template <> │ │ │ │ -_1_8_2_1struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_E_d_g_e_H_a_n_d_l_e> │ │ │ │ -1822{ │ │ │ │ -1823 using _R_a_n_g_e = _C_o_n_s_t_E_d_g_e_R_a_n_g_e; │ │ │ │ -1824 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1825}; │ │ │ │ -1826 │ │ │ │ -1827template <> │ │ │ │ -_1_8_2_8struct _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e<_F_a_c_e_H_a_n_d_l_e> │ │ │ │ -1829{ │ │ │ │ -1830 using _R_a_n_g_e = _C_o_n_s_t_F_a_c_e_R_a_n_g_e; │ │ │ │ -1831 using _R_a_n_g_e_S_k_i_p_p_i_n_g = _C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g; │ │ │ │ -1832}; │ │ │ │ -1833 │ │ │ │ -1834}//namespace OpenMesh │ │ │ │ -1835 │ │ │ │ -1836#define OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ -1837#include │ │ │ │ -1838#include │ │ │ │ -1839#undef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ -1840 │ │ │ │ -1841#endif//OPENMESH_POLYCONNECTIVITY_HH │ │ │ │ +88 │ │ │ │ +89private: │ │ │ │ +90 │ │ │ │ +92 blaT(const blaT& _rhs); │ │ │ │ +93 │ │ │ │ +95 blaT& operator=(const blaT& _rhs); │ │ │ │ +96 │ │ │ │ +97}; │ │ │ │ +98 │ │ │ │ +99 │ │ │ │ +100// │ │ │ │ +============================================================================= │ │ │ │ +101} // namespace OpenMesh │ │ │ │ +102// │ │ │ │ +============================================================================= │ │ │ │ +103#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_BLA_C) │ │ │ │ +104#define OPENMESH_BLA_TEMPLATES │ │ │ │ +105#include "blaT_impl.hh" │ │ │ │ +106#endif │ │ │ │ +107// │ │ │ │ +============================================================================= │ │ │ │ +108#endif // OPENMESH_NEWCLASST_HH defined │ │ │ │ +109#endif // DOXY_IGNORE_THIS │ │ │ │ +110// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l │ │ │ │ -Mesh kernel using arrays for mesh item storage. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:88 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ -Is halfedge _heh a boundary halfedge (is its face handle invalid) ? │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:400 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -void assign_connectivity(const ArrayKernel &_other) │ │ │ │ -ArrayKernel uses the default copy constructor and assignment operator, which │ │ │ │ -means that the connectiv... │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.cc:71 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ -Generic class for iterator ranges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:305 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:483 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_I_t_e_r_a_t_o_r_T │ │ │ │ -DDeeffiinniittiioonn IteratorsT.hh:82 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_n_t_i_t_y_R_a_n_g_e │ │ │ │ -Generic class for vertex/halfedge/edge/face ranges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:76 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_R_a_n_g_e_T_r_a_i_t_T │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:77 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e_T_r_a_i_t_T │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -Connectivity Class for polygonal meshes. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -const Halfedge & deref(HalfedgeHandle _h) const │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1778 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_V_C_W_I_t_e_r │ │ │ │ -VertexVertexCWIter VVCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:461 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_V_I_t_e_r │ │ │ │ -ConstVertexVertexIter CVVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:489 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexVertexIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ -cvv_begin, &PolyConnectivity::cvv_end > > ConstVertexVertexRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1268 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___e_n_d │ │ │ │ -EdgeIter edges_end() │ │ │ │ -End iterator for edges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:338 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceVertexIter, │ │ │ │ -FaceHandle, VertexHandle, &PolyConnectivity::cfv_begin, &PolyConnectivity:: │ │ │ │ -cfv_end > > ConstFaceVertexRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1273 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstFaceHalfedgeCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cfh_cwbegin, &PolyConnectivity::cfh_cwend > > ConstFaceHalfedgeCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1288 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ -EdgeIter ConstEdgeIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:146 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_I_t_e_r │ │ │ │ -EdgeIter EIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:452 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_V_I_t_e_r │ │ │ │ -VertexVertexIter VVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:460 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexEdgeTraits, false > VertexEdgeCCWIter │ │ │ │ -Enumerates incident edges in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:258 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_V_C_C_W_I_t_e_r │ │ │ │ -VertexVertexCCWIter VVCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:462 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_H_C_C_W_I_t_e_r │ │ │ │ -ConstVertexIHalfedgeCCWIter CVIHCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:497 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r │ │ │ │ -HalfedgeLoopCWIter ConstHalfedgeLoopCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:433 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCWIter, │ │ │ │ -FaceHandle, FaceHandle, &PolyConnectivity::cff_cwbegin, &PolyConnectivity:: │ │ │ │ -cff_cwend > > ConstFaceFaceCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1290 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -Edge & deref(EdgeHandle _h) │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1781 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___e_n_d │ │ │ │ -HalfedgeIter halfedges_end() │ │ │ │ -End iterator for halfedges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:326 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_H_C_C_W_I_t_e_r │ │ │ │ -ConstFaceHalfedgeCCWIter CFHCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:509 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_H_a_n_d_l_e │ │ │ │ -VertexHandle VHandle │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:445 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_V_C_C_W_I_t_e_r │ │ │ │ -ConstFaceVertexCCWIter CFVCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:506 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_T_h_i_s │ │ │ │ -PolyConnectivity This │ │ │ │ -Invalid handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:129 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericIteratorT< This, This::HalfedgeHandle, ArrayKernel, │ │ │ │ -&ArrayKernel::has_halfedge_status, &ArrayKernel::n_halfedges > HalfedgeIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:140 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstFaceHalfedgeCCWIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cfh_ccwbegin, &PolyConnectivity::cfh_ccwend > > ConstFaceHalfedgeCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1299 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_F_C_C_W_I_t_e_r │ │ │ │ -ConstVertexFaceCCWIter CVFCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:503 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexVertexCCWIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ -cvv_ccwbegin, &PolyConnectivity::cvv_ccwend > > ConstVertexVertexCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1293 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -VertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:285 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_F_C_C_W_I_t_e_r │ │ │ │ -VertexFaceCCWIter VFCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:474 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ -FaceFaceIter ConstFaceFaceIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:378 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_E_C_W_I_t_e_r │ │ │ │ -FaceEdgeCWIter FECWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:482 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexVertexTraits, false > VertexVertexCCWIter │ │ │ │ -Enumerates 1-ring vertices in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:180 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___s_b_e_g_i_n │ │ │ │ -VertexIter vertices_sbegin() │ │ │ │ -Begin iterator for vertices. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:357 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___s_b_e_g_i_n │ │ │ │ -HalfedgeIter halfedges_sbegin() │ │ │ │ -Begin iterator for halfedges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:363 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_V_C_C_W_I_t_e_r │ │ │ │ -FaceVertexCCWIter FVCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:477 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_t_e_r │ │ │ │ -ConstVertexIter CVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:455 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_H_I_t_e_r │ │ │ │ -ConstHalfedgeIter CHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:456 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceVertexTraits, false > FaceVertexCWIter │ │ │ │ -Enumerate incident vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:316 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_h_a_l_f_e_d_g_e_s___b_e_g_i_n │ │ │ │ -HalfedgeIter halfedges_begin() │ │ │ │ -Begin iterator for halfedges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:320 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -static const HalfedgeHandle InvalidHalfedgeHandle │ │ │ │ -Invalid handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_o_p_p_o_s_i_t_e___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ -SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const │ │ │ │ -returns the face handle of the opposite halfedge │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:57 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_I_t_e_r │ │ │ │ -FaceFaceCWIter ConstFaceFaceCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:379 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ -FaceHalfedgeCCWIter ConstFaceHalfedgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:374 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___s_b_e_g_i_n │ │ │ │ -EdgeIter edges_sbegin() │ │ │ │ -Begin iterator for edges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:369 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexVertexCWIter, VertexHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ -cvv_cwbegin, &PolyConnectivity::cvv_cwend > > ConstVertexVertexCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1282 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexOHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cvoh_ccwbegin, &PolyConnectivity::cvoh_ccwend > > ConstVertexOHalfedgeCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1295 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstEdgeIter, &PolyConnectivity::edges_sbegin, &PolyConnectivity::edges_end > │ │ │ │ -> ConstEdgeRangeSkipping │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1189 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_d_g_e_s___b_e_g_i_n │ │ │ │ -EdgeIter edges_begin() │ │ │ │ -Begin iterator for edges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:332 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_E_C_C_W_I_t_e_r │ │ │ │ -ConstFaceEdgeCCWIter CFECCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:512 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstHalfedgeLoopCCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -chl_ccwbegin, &PolyConnectivity::chl_ccwend > > ConstHalfedgeLoopCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1302 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_I_t_e_r │ │ │ │ -ConstEdgeIter CEIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:457 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstFaceVertexCWIter, FaceHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ -cfv_cwbegin, &PolyConnectivity::cfv_cwend > > ConstFaceVertexCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1287 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_l_l___e_l_e_m_e_n_t_s │ │ │ │ -ElementRange< HandleType >::Range all_elements() const │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_V_I_t_e_r │ │ │ │ -ConstFaceVertexIter CFVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:504 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ -VertexVertexCCWIter ConstVertexVertexCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:281 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexIHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cvih_begin, &PolyConnectivity::cvih_end > > ConstVertexIHalfedgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1269 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_O_H_I_t_e_r │ │ │ │ -ConstVertexOHalfedgeIter CVOHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:492 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Iterators::GenericIteratorT< This, This::VertexHandle, ArrayKernel, │ │ │ │ -&ArrayKernel::has_vertex_status, &ArrayKernel::n_vertices > VertexIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstFaceIter, &PolyConnectivity::faces_begin, &PolyConnectivity::faces_end > > │ │ │ │ -ConstFaceRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1194 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceCCWIter, │ │ │ │ -FaceHandle, FaceHandle, &PolyConnectivity::cff_ccwbegin, &PolyConnectivity:: │ │ │ │ -cff_ccwend > > ConstFaceFaceCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1301 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexIHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cvih_cwbegin, &PolyConnectivity::cvih_cwend > > ConstVertexIHalfedgeCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1283 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< VertexOppositeHalfedgeTraits > │ │ │ │ -VertexIHalfedgeIter │ │ │ │ -Enumerates incoming half edges in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:213 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstVertexIter, &PolyConnectivity::vertices_begin, &PolyConnectivity:: │ │ │ │ -vertices_end > > ConstVertexRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1164 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ -FaceFaceCCWIter ConstFaceFaceCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:380 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_E_I_t_e_r │ │ │ │ -ConstFaceEdgeIter CFEIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:510 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -PolyConnectivity() │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:523 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ -VertexOHalfedgeCWIter ConstVertexOHalfedgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:283 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_I_t_e_r │ │ │ │ -FaceEdgeCWIter ConstFaceEdgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:376 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_H_C_W_I_t_e_r │ │ │ │ -ConstVertexIHalfedgeCWIter CVIHCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:496 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_H_I_t_e_r │ │ │ │ -ConstFaceHalfedgeIter CFHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:507 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_V_C_W_I_t_e_r │ │ │ │ -ConstFaceVertexCWIter CFVCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:505 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_F_I_t_e_r │ │ │ │ -VertexFaceIter VFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:472 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< VertexVertexTraits > VertexVertexIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:174 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexOHalfedgeCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cvoh_cwbegin, &PolyConnectivity::cvoh_cwend > > ConstVertexOHalfedgeCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1284 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r │ │ │ │ -HalfedgeLoopCCWIter ConstHalfedgeLoopCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:434 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_O_H_C_C_W_I_t_e_r │ │ │ │ -ConstVertexOHalfedgeCCWIter CVOHCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:494 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_I_t_e_r │ │ │ │ -HalfedgeIter HIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:451 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ -VertexEdgeIter ConstVertexEdgeIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:291 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > FaceHalfedgeIter │ │ │ │ -Enumerate incident half edges in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:321 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeIter, │ │ │ │ -FaceHandle, EdgeHandle, &PolyConnectivity::cfe_begin, &PolyConnectivity:: │ │ │ │ -cfe_end > > ConstFaceEdgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1275 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< VertexHalfedgeTraits > │ │ │ │ -VertexOHalfedgeIter │ │ │ │ -Enumerates outgoing half edges in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:194 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r │ │ │ │ -HalfedgeLoopIter ConstHalfedgeLoopIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:432 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_H_a_n_d_l_e │ │ │ │ -HalfedgeHandle HHandle │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:446 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___t_r_i_a_n_g_l_e_s │ │ │ │ -static bool is_triangles() │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:526 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_F_C_W_I_t_e_r │ │ │ │ -ConstFaceFaceCWIter CFFCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:514 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstHalfedgeLoopIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -chl_begin, &PolyConnectivity::chl_end > > ConstHalfedgeLoopRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1280 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_H_I_t_e_r │ │ │ │ -VertexIHalfedgeIter VIHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:466 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -EdgeVertexIter ConstEdgeVertexIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:425 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -VertexFaceIter ConstVertexFaceIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:288 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_t_e_r │ │ │ │ -VertexIter VIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:450 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexEdgeCWIter, VertexHandle, EdgeHandle, &PolyConnectivity:: │ │ │ │ -cve_cwbegin, &PolyConnectivity::cve_cwend > > ConstVertexEdgeCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1285 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexEdgeCCWIter, VertexHandle, EdgeHandle, &PolyConnectivity:: │ │ │ │ -cve_ccwbegin, &PolyConnectivity::cve_ccwend > > ConstVertexEdgeCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1296 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ -VertexIter ConstVertexIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:144 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_I_t_e_r │ │ │ │ -Iterators::GenericIteratorT< This, This::FaceHandle, ArrayKernel, │ │ │ │ -&ArrayKernel::has_face_status, &ArrayKernel::n_faces > FaceIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< VertexEdgeTraits > VertexEdgeIter │ │ │ │ -Enumerates incident edges in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:253 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -FaceVertexIter ConstFaceVertexIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:369 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCWIter, │ │ │ │ -FaceHandle, EdgeHandle, &PolyConnectivity::cfe_cwbegin, &PolyConnectivity:: │ │ │ │ -cfe_cwend > > ConstFaceEdgeCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1289 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ -VertexIHalfedgeCCWIter ConstVertexIHalfedgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:287 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_E_C_W_I_t_e_r │ │ │ │ -ConstVertexEdgeCWIter CVECWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:499 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r │ │ │ │ -VertexFaceCWIter ConstVertexFaceCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:289 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexEdgeIter, │ │ │ │ -VertexHandle, EdgeHandle, &PolyConnectivity::cve_begin, &PolyConnectivity:: │ │ │ │ -cve_end > > ConstVertexEdgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1271 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_V_I_t_e_r │ │ │ │ -ConstEdgeVertexIter CEVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:516 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_I_t_e_r │ │ │ │ -EdgeFaceIter ConstEdgeFaceIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:427 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_E_C_W_W_I_t_e_r │ │ │ │ -FaceEdgeCCWIter FECWWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:483 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< EdgeHalfedgeTraits > EdgeHalfedgeIter │ │ │ │ -Enumerate the halfedges of an edge. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:410 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_I_t_e_r │ │ │ │ -FaceHalfedgeIter FHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:478 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_H_I_t_e_r │ │ │ │ -EdgeHalfedgeIter EHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:486 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_e_l_e_m_e_n_t_s │ │ │ │ -ElementRange< HandleType >::RangeSkipping elements() const │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary(EdgeHandle _eh) const │ │ │ │ -Is the edge a boundary edge? │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1579 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -const Edge & deref(EdgeHandle _h) const │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1780 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___s_b_e_g_i_n │ │ │ │ -FaceIter faces_sbegin() │ │ │ │ -Begin iterator for faces. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:375 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_~_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -virtual ~PolyConnectivity() │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:524 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexHalfedgeTraits, false > │ │ │ │ -VertexOHalfedgeCCWIter │ │ │ │ -Enumerates outgoing half edges in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:200 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< VertexFaceTraits > VertexFaceIter │ │ │ │ -Enumerates incident faces in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:233 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_E_C_W_I_t_e_r │ │ │ │ -VertexEdgeCWIter VECWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:470 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_F_a_c_e_H_a_n_d_l_e │ │ │ │ -static const FaceHandle InvalidFaceHandle │ │ │ │ -Invalid handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:126 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericIteratorT< This, This::EdgeHandle, ArrayKernel, │ │ │ │ -&ArrayKernel::has_edge_status, &ArrayKernel::n_edges > EdgeIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:141 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_E_C_C_W_I_t_e_r │ │ │ │ -ConstVertexEdgeCCWIter CVECCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:500 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -EdgeHalfedgeIter ConstEdgeHalfedgeIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:426 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_V_I_t_e_r │ │ │ │ -EdgeVertexIter EVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:485 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_V_C_C_W_I_t_e_r │ │ │ │ -ConstVertexVertexCCWIter CVVCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:491 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_C_W_W_I_t_e_r │ │ │ │ -FaceHalfedgeCCWIter FHCWWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:480 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary(VertexHandle _vh) const │ │ │ │ -Is vertex _vh a boundary vertex ? │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1596 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > HalfedgeLoopCCWIter │ │ │ │ -Identical to FaceHalfedgeIter. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:277 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceFaceTraits, true > FaceFaceCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:362 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ -FaceEdgeCCWIter ConstFaceEdgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:377 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_V_C_W_I_t_e_r │ │ │ │ -ConstVertexVertexCWIter CVVCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:490 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< FaceHalfedgeTraits > HalfedgeLoopIter │ │ │ │ -Identical to FaceHalfedgeIter. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:272 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_R_a_n_g_e │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstEdgeIter, &PolyConnectivity::edges_begin, &PolyConnectivity::edges_end > > │ │ │ │ -ConstEdgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1184 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_F_I_t_e_r │ │ │ │ -ConstEdgeFaceIter CEFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:518 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceEdgeCCWIter, │ │ │ │ -FaceHandle, EdgeHandle, &PolyConnectivity::cfe_ccwbegin, &PolyConnectivity:: │ │ │ │ -cfe_ccwend > > ConstFaceEdgeCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1300 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ -VertexOHalfedgeCCWIter ConstVertexOHalfedgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:284 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstHalfedgeIter, &PolyConnectivity::halfedges_sbegin, &PolyConnectivity:: │ │ │ │ -halfedges_end > > ConstHalfedgeRangeSkipping │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1179 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_O_H_C_W_I_t_e_r │ │ │ │ -ConstVertexOHalfedgeCWIter CVOHCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:493 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -FaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:372 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_O_H_C_W_I_t_e_r │ │ │ │ -VertexOHalfedgeCWIter VOHCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:464 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< FaceVertexTraits > FaceVertexIter │ │ │ │ -Enumerate incident vertices in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:310 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_V_C_W_I_t_e_r │ │ │ │ -FaceVertexCWIter FVCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:476 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -Face & deref(FaceHandle _h) │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1783 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_F_I_t_e_r │ │ │ │ -EdgeFaceIter EFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:487 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -static const VertexHandle InvalidVertexHandle │ │ │ │ -Invalid handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:120 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___b_e_g_i_n │ │ │ │ -VertexIter vertices_begin() │ │ │ │ -Begin iterator for vertices. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:308 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_I_t_e_r │ │ │ │ -ConstFaceIter CFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:458 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexFaceCWIter, VertexHandle, FaceHandle, &PolyConnectivity:: │ │ │ │ -cvf_cwbegin, &PolyConnectivity::cvf_cwend > > ConstVertexFaceCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1286 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexFaceTraits, true > VertexFaceCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:234 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -HalfedgeIter ConstHalfedgeIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:145 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, false > │ │ │ │ -VertexIHalfedgeCCWIter │ │ │ │ -Enumerates incoming half edges in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:219 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ -FaceVertexCCWIter ConstFaceVertexCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:371 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexOHalfedgeIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cvoh_begin, &PolyConnectivity::cvoh_end > > ConstVertexOHalfedgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1270 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_I_n_v_a_l_i_d_E_d_g_e_H_a_n_d_l_e │ │ │ │ -static const EdgeHandle InvalidEdgeHandle │ │ │ │ -Invalid handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:124 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstEdgeHalfedgeIter, EdgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -ceh_begin, &PolyConnectivity::ceh_end > > ConstEdgeHalfedgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1278 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstVertexIter, &PolyConnectivity::vertices_sbegin, &PolyConnectivity:: │ │ │ │ -vertices_end > > ConstVertexRangeSkipping │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1169 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -Halfedge & deref(HalfedgeHandle _h) │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1779 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexEdgeTraits, true > VertexEdgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:254 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_E_I_t_e_r │ │ │ │ -FaceEdgeIter FEIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:481 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -FaceEdgeIter ConstFaceEdgeIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:375 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_E_I_t_e_r │ │ │ │ -ConstVertexEdgeIter CVEIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:498 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceHalfedgeTraits, true > FaceHalfedgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:322 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexOppositeHalfedgeTraits, true > │ │ │ │ -VertexIHalfedgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:214 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___e_n_d │ │ │ │ -FaceIter faces_end() │ │ │ │ -End iterator for faces. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:350 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_a_s_s_i_g_n___c_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -void assign_connectivity(const PolyConnectivity &_other) │ │ │ │ -assign_connectivity() method. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:531 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_O_H_C_C_W_I_t_e_r │ │ │ │ -VertexOHalfedgeCCWIter VOHCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:465 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstVertexFaceIter, │ │ │ │ -VertexHandle, FaceHandle, &PolyConnectivity::cvf_begin, &PolyConnectivity:: │ │ │ │ -cvf_end > > ConstVertexFaceRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1272 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_H_a_n_d_l_e │ │ │ │ -EdgeHandle EHandle │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:447 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_a_n_d_l_e │ │ │ │ -FaceHandle FHandle │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:448 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexIHalfedgeCCWIter, VertexHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cvih_ccwbegin, &PolyConnectivity::cvih_ccwend > > ConstVertexIHalfedgeCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1294 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceVertexTraits, true > FaceVertexCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:311 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_E_C_W_I_t_e_r │ │ │ │ -ConstFaceEdgeCWIter CFECWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:511 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_F_I_t_e_r │ │ │ │ -ConstFaceFaceIter CFFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:513 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ -VertexFaceCCWIter ConstVertexFaceCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:290 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_E_H_I_t_e_r │ │ │ │ -ConstEdgeHalfedgeIter CEHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:517 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -VertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:282 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_H_I_C_W_t_e_r │ │ │ │ -VertexIHalfedgeCWIter VIHICWter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:467 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_E_I_t_e_r │ │ │ │ -VertexEdgeIter VEIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:469 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ -FaceIter ConstFaceIter │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:147 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_O_H_I_t_e_r │ │ │ │ -VertexOHalfedgeIter VOHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:463 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ -VertexIHalfedgeCWIter ConstVertexIHalfedgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:286 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_I_t_e_r │ │ │ │ -VertexEdgeCWIter ConstVertexEdgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:292 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexVertexTraits, true > VertexVertexCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:175 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_F_C_W_I_t_e_r │ │ │ │ -ConstVertexFaceCWIter CVFCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:502 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeFaceIter, │ │ │ │ -EdgeHandle, FaceHandle, &PolyConnectivity::cef_begin, &PolyConnectivity:: │ │ │ │ -cef_end > > ConstEdgeFaceRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1279 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ -Check if the halfedge is at the boundary. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1568 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstHalfedgeIter, &PolyConnectivity::halfedges_begin, &PolyConnectivity:: │ │ │ │ -halfedges_end > > ConstHalfedgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1174 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > FaceHalfedgeCWIter │ │ │ │ -Enumerate incident half edges in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:327 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ -VertexVertexCWIter ConstVertexVertexCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:280 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ -VertexEdgeCCWIter ConstVertexEdgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:293 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ -VertexVertexIter ConstVertexVertexIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:279 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_F_C_W_I_t_e_r │ │ │ │ -VertexFaceCWIter VFCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:473 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< FaceFaceTraits > FaceFaceIter │ │ │ │ -Enumerate adjacent faces in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:361 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ -FaceHalfedgeCWIter ConstFaceHalfedgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:373 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstFaceHalfedgeIter, FaceHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -cfh_begin, &PolyConnectivity::cfh_end > > ConstFaceHalfedgeRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1274 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< EdgeFaceTraits > EdgeFaceIter │ │ │ │ -Enumerate faces incident to an edge. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:423 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstEdgeVertexIter, │ │ │ │ -EdgeHandle, VertexHandle, &PolyConnectivity::cev_begin, &PolyConnectivity:: │ │ │ │ -cev_end > > ConstEdgeVertexRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1277 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_H_a_l_f_e_d_g_e_L_o_o_p_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceHalfedgeTraits, false > HalfedgeLoopCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:273 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -const Vertex & deref(VertexHandle _h) const │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1776 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceFaceTraits, false > FaceFaceCWIter │ │ │ │ -Enumerate adjacent faces in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:367 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< FaceEdgeTraits > FaceEdgeIter │ │ │ │ -Enumerate incident edges in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:341 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_e_r_t_i_c_e_s___e_n_d │ │ │ │ -VertexIter vertices_end() │ │ │ │ -End iterator for vertices. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:314 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceEdgeTraits, false > FaceEdgeCWIter │ │ │ │ -Enumerate incident edges in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:347 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -Vertex & deref(VertexHandle _h) │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1777 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT_DEPRECATED< EdgeVertexTraits > EdgeVertexIter │ │ │ │ -Enumerate vertices incident to an edge. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:397 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexFaceTraits, false > VertexFaceCCWIter │ │ │ │ -Enumerates incident faces in a counter clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:239 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, ConstFaceFaceIter, │ │ │ │ -FaceHandle, FaceHandle, &PolyConnectivity::cff_begin, &PolyConnectivity:: │ │ │ │ -cff_end > > ConstFaceFaceRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1276 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_H_C_W_I_t_e_r │ │ │ │ -ConstFaceHalfedgeCWIter CFHCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:508 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_d_e_r_e_f │ │ │ │ -const Face & deref(FaceHandle _h) const │ │ │ │ -Get item from handle. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1782 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_f_a_c_e_s___b_e_g_i_n │ │ │ │ -FaceIter faces_begin() │ │ │ │ -Begin iterator for faces. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:344 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstHalfedgeLoopCWIter, HalfedgeHandle, HalfedgeHandle, &PolyConnectivity:: │ │ │ │ -chl_cwbegin, &PolyConnectivity::chl_cwend > > ConstHalfedgeLoopCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1291 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_V_I_t_e_r │ │ │ │ -FaceVertexIter FVIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:475 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_F_I_t_e_r │ │ │ │ -FaceFaceIter FFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:484 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_H_C_W_I_t_e_r │ │ │ │ -FaceHalfedgeCWIter FHCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:479 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_C_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< FaceEdgeTraits, true > FaceEdgeCCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:342 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_F_F_C_C_W_I_t_e_r │ │ │ │ -ConstFaceFaceCCWIter CFFCCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:515 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstVertexFaceCCWIter, VertexHandle, FaceHandle, &PolyConnectivity:: │ │ │ │ -cvf_ccwbegin, &PolyConnectivity::cvf_ccwend > > ConstVertexFaceCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1297 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_I_H_I_C_C_W_t_e_r │ │ │ │ -VertexIHalfedgeCCWIter VIHICCWter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:468 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_R_a_n_g_e_S_k_i_p_p_i_n_g │ │ │ │ -EntityRange< RangeTraitT< const PolyConnectivity, PolyConnectivity:: │ │ │ │ -ConstFaceIter, &PolyConnectivity::faces_sbegin, &PolyConnectivity::faces_end > │ │ │ │ -> ConstFaceRangeSkipping │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1199 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_I_H_I_t_e_r │ │ │ │ -ConstVertexIHalfedgeIter CVIHIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:495 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e │ │ │ │ -CirculatorRange< CirculatorRangeTraitT< PolyConnectivity, │ │ │ │ -ConstFaceVertexCCWIter, FaceHandle, VertexHandle, &PolyConnectivity:: │ │ │ │ -cfv_ccwbegin, &PolyConnectivity::cfv_ccwend > > ConstFaceVertexCCWRange │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1298 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_E_C_C_W_I_t_e_r │ │ │ │ -VertexEdgeCCWIter VECCWIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:471 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_I_t_e_r │ │ │ │ -FaceVertexCWIter ConstFaceVertexCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:370 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_I_t_e_r │ │ │ │ -FaceIter FIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:453 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_I_t_e_r │ │ │ │ -Iterators::GenericCirculatorT< VertexHalfedgeTraits, true > │ │ │ │ -VertexOHalfedgeCWIter │ │ │ │ -Enumerates 1-ring vertices in a clockwise fashion. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:195 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_V_F_I_t_e_r │ │ │ │ -ConstVertexFaceIter CVFIter │ │ │ │ -Alias typedef. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:501 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:163 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:184 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_O_p_p_o_s_i_t_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:203 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_F_a_c_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:223 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_V_e_r_t_e_x_E_d_g_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:243 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:262 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:300 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_E_d_g_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:331 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_F_a_c_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:351 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_V_e_r_t_e_x_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:387 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_H_a_l_f_e_d_g_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:400 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_d_g_e_F_a_c_e_T_r_a_i_t_s │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:413 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_E_l_e_m_e_n_t_R_a_n_g_e │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:1203 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ -allows easier access t... │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:170 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:197 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:228 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00683_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/CirculatorsT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Templates/blaT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,21 +92,21 @@ │ │ │
No Matches
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │
│ │ │ -
CirculatorsT.hh
│ │ │ +
blaT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │
9 *---------------------------------------------------------------------------*
│ │ │
10 * This file is part of OpenMesh. *
│ │ │
11 *---------------------------------------------------------------------------*
│ │ │ @@ -137,664 +137,45 @@ │ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │ -
43#pragma once
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// Vertex, Face, and Edge circulators for PolyMesh/TriMesh
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ +
43
│ │ │ +
44//=============================================================================
│ │ │ +
45//
│ │ │ +
46// CLASS bla - IMPLEMENTATION
│ │ │ +
47//
│ │ │ +
48//=============================================================================
│ │ │ +
49
│ │ │ +
50#define OPENMESH_BLA_C
│ │ │
51
│ │ │ -
52
│ │ │ -
53//== INCLUDES =================================================================
│ │ │ -
54
│ │ │ -
55#include <OpenMesh/Core/System/config.h>
│ │ │ -
56#include <cassert>
│ │ │ -
57#include <cstddef>
│ │ │ -
58#include <iterator>
│ │ │ -
59
│ │ │ -
60//== NAMESPACES ===============================================================
│ │ │ +
52//== INCLUDES =================================================================
│ │ │ +
53
│ │ │ +
54#include <OpenMesh/.../bla.hh>
│ │ │ +
55
│ │ │ +
56
│ │ │ +
57//== NAMESPACES ===============================================================
│ │ │ +
58
│ │ │ +
59namespace OpenMesh {
│ │ │ +
60
│ │ │
61
│ │ │ -
62namespace OpenMesh {
│ │ │ +
62//== IMPLEMENTATION ==========================================================
│ │ │
63
│ │ │ -
64template <typename> class CirculatorRange;
│ │ │ +
64
│ │ │
65
│ │ │ -
66namespace Iterators {
│ │ │ +
66//-----------------------------------------------------------------------------
│ │ │
67
│ │ │ -
68template<class Mesh, class CenterEntityHandle, bool CW>
│ │ │ -
│ │ │ - │ │ │ -
70 public:
│ │ │ -
71 static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter);
│ │ │ -
72 static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter);
│ │ │ -
73};
│ │ │ -
│ │ │ -
74
│ │ │ -
75template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
77 public:
│ │ │ -
78 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
79 heh = mesh->cw_rotated_halfedge_handle(heh);
│ │ │ -
80 if (heh == start) ++lap_counter;
│ │ │ -
81 }
│ │ │ -
82 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
83 if (heh == start) --lap_counter;
│ │ │ -
84 heh = mesh->ccw_rotated_halfedge_handle(heh);
│ │ │ -
85 }
│ │ │ -
86};
│ │ │ -
│ │ │ -
87
│ │ │ -
88template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
90 public:
│ │ │ -
91 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
92 heh = mesh->next_halfedge_handle(heh);
│ │ │ -
93 if (heh == start) ++lap_counter;
│ │ │ -
94 }
│ │ │ -
95 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
96 if (heh == start) --lap_counter;
│ │ │ -
97 heh = mesh->prev_halfedge_handle(heh);
│ │ │ -
98 }
│ │ │ -
99};
│ │ │ -
│ │ │ -
100
│ │ │ -
101template<class Mesh, bool CW>
│ │ │ -
│ │ │ - │ │ │ -
103 public:
│ │ │ -
104 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
105 heh = mesh->opposite_halfedge_handle(heh);
│ │ │ -
106 if (heh == start) ++lap_counter;
│ │ │ -
107 }
│ │ │ -
108 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
109 if (heh == start) --lap_counter;
│ │ │ -
110 heh = mesh->opposite_halfedge_handle(heh);
│ │ │ -
111 }
│ │ │ -
112};
│ │ │ -
│ │ │ -
113
│ │ │ -
115// CCW
│ │ │ -
116
│ │ │ -
117template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
119 public:
│ │ │ -
120 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
121 heh = mesh->ccw_rotated_halfedge_handle(heh);
│ │ │ -
122 if (heh == start) ++lap_counter;
│ │ │ -
123 }
│ │ │ -
124 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
125 if (heh == start) --lap_counter;
│ │ │ -
126 heh = mesh->cw_rotated_halfedge_handle(heh);
│ │ │ -
127 }
│ │ │ -
128};
│ │ │ -
│ │ │ -
129
│ │ │ -
130template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
132 public:
│ │ │ -
133 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
134 heh = mesh->prev_halfedge_handle(heh);
│ │ │ -
135 if (heh == start) ++lap_counter;
│ │ │ -
136 }
│ │ │ -
137 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
138 if (heh == start) --lap_counter;
│ │ │ -
139 heh = mesh->next_halfedge_handle(heh);
│ │ │ -
140 }
│ │ │ -
141};
│ │ │ -
│ │ │ -
143
│ │ │ -
144template<class Mesh, class CenterEntityHandle, class ValueHandle>
│ │ │ -
│ │ │ - │ │ │ -
146 public:
│ │ │ -
147 //inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int &lap_counter);
│ │ │ -
148};
│ │ │ -
│ │ │ -
149
│ │ │ -
150template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
152 public:
│ │ │ -
153 inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {
│ │ │ -
154 return mesh->face_handle(mesh->opposite_halfedge_handle(heh)).is_valid();
│ │ │ -
155 }
│ │ │ -
156};
│ │ │ -
│ │ │ -
157
│ │ │ -
158template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
160 public:
│ │ │ -
161 inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {
│ │ │ -
162 return mesh->face_handle(heh).is_valid();
│ │ │ -
163 }
│ │ │ -
164};
│ │ │ -
│ │ │ -
165
│ │ │ -
166template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
168 public:
│ │ │ -
169 inline static bool isDereferenciable(const Mesh *mesh, const typename Mesh::HalfedgeHandle &heh) {
│ │ │ -
170 return mesh->face_handle(heh).is_valid();
│ │ │ -
171 }
│ │ │ -
172};
│ │ │ -
│ │ │ -
173
│ │ │ -
174template<class Mesh, class CenterEntityHandle, class ValueHandle, bool CW = true>
│ │ │ -
│ │ │ - │ │ │ -
176 public:
│ │ │ -
177 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) {
│ │ │ -
178 return ( heh.is_valid() && (lap_counter == 0 ) );
│ │ │ -
179 }
│ │ │ -
180 inline static void init(const Mesh* mesh, typename Mesh::HalfedgeHandle& heh, typename Mesh::HalfedgeHandle& start, int& lap_counter, bool adjust_for_ccw)
│ │ │ -
181 {
│ │ │ -
182 if (!CW) // TODO: constexpr if
│ │ │ -
183 {
│ │ │ -
184 if (adjust_for_ccw)
│ │ │ -
185 {
│ │ │ -
186 // increment current heh and start so that cw and ccw version dont start with the same element but ranges are actually reversed
│ │ │ -
187 int lc = lap_counter;
│ │ │ -
188 increment(mesh, heh, start, lap_counter);
│ │ │ -
189 start = heh;
│ │ │ -
190 lap_counter = lc;
│ │ │ -
191 }
│ │ │ -
192 }
│ │ │ -
193 }
│ │ │ -
194
│ │ │ -
195 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ - │ │ │ -
197 }
│ │ │ -
198 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ - │ │ │ -
200 }
│ │ │ -
201};
│ │ │ -
│ │ │ -
202
│ │ │ -
203template<class Mesh, class CenterEntityHandle, bool CW>
│ │ │ -
│ │ │ -
204class GenericCirculator_ValueHandleFnsT<Mesh, CenterEntityHandle, typename Mesh::FaceHandle, CW> {
│ │ │ -
205 public:
│ │ │ - │ │ │ -
207
│ │ │ -
208 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const int lap_counter) {
│ │ │ -
209 return ( heh.is_valid() && (lap_counter == 0));
│ │ │ -
210 }
│ │ │ -
211 inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter, bool adjust_for_ccw)
│ │ │ -
212 {
│ │ │ -
213 if (!CW) // TODO: constexpr if
│ │ │ -
214 {
│ │ │ -
215 if (adjust_for_ccw)
│ │ │ -
216 {
│ │ │ -
217 // increment current heh and start so that cw and ccw version dont start with the same element but ranges are actually reversed
│ │ │ -
218 int lc = lap_counter;
│ │ │ -
219 increment(mesh, heh, start, lap_counter);
│ │ │ -
220 start = heh;
│ │ │ -
221 lap_counter = lc;
│ │ │ -
222 }
│ │ │ -
223 }
│ │ │ -
224 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0 )
│ │ │ -
225 increment(mesh, heh, start, lap_counter);
│ │ │ -
226 };
│ │ │ -
227 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
228 do {
│ │ │ - │ │ │ -
230 } while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ -
231 }
│ │ │ -
232 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
233 do {
│ │ │ - │ │ │ -
235 } while (is_valid(heh, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ -
236 }
│ │ │ -
237};
│ │ │ -
│ │ │ -
238
│ │ │ -
239template<class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
241 public:
│ │ │ -
242 typedef const Mesh* mesh_ptr;
│ │ │ -
243 typedef const Mesh& mesh_ref;
│ │ │ -
244
│ │ │ -
245 template <typename> friend class OpenMesh::CirculatorRange;
│ │ │ -
246
│ │ │ -
247 public:
│ │ │ -
248 GenericCirculatorBaseT() : mesh_(0), lap_counter_(0) {}
│ │ │ -
249
│ │ │ -
250 GenericCirculatorBaseT(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) :
│ │ │ -
251 mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast<int>(end && heh.is_valid())) {}
│ │ │ -
252
│ │ │ - │ │ │ -
254 mesh_(rhs.mesh_), start_(rhs.start_), heh_(rhs.heh_), lap_counter_(rhs.lap_counter_) {}
│ │ │ -
255
│ │ │ -
256 inline typename Mesh::FaceHandle toFaceHandle() const {
│ │ │ -
257 return mesh_->face_handle(heh_);
│ │ │ -
258 }
│ │ │ -
259
│ │ │ -
260 inline typename Mesh::FaceHandle toOppositeFaceHandle() const {
│ │ │ -
261 return mesh_->face_handle(toOppositeHalfedgeHandle());
│ │ │ -
262 }
│ │ │ -
263
│ │ │ -
264 inline typename Mesh::EdgeHandle toEdgeHandle() const {
│ │ │ -
265 return mesh_->edge_handle(heh_);
│ │ │ -
266 }
│ │ │ -
267
│ │ │ -
268 inline typename Mesh::HalfedgeHandle toHalfedgeHandle() const {
│ │ │ -
269 return heh_;
│ │ │ -
270 }
│ │ │ -
271
│ │ │ -
272 inline typename Mesh::HalfedgeHandle toOppositeHalfedgeHandle() const {
│ │ │ -
273 return mesh_->opposite_halfedge_handle(heh_);
│ │ │ -
274 }
│ │ │ -
275
│ │ │ -
276 inline typename Mesh::VertexHandle toVertexHandle() const {
│ │ │ -
277 return mesh_->to_vertex_handle(heh_);
│ │ │ -
278 }
│ │ │ -
279
│ │ │ -
280 inline GenericCirculatorBaseT &operator=(const GenericCirculatorBaseT &rhs) {
│ │ │ -
281 mesh_ = rhs.mesh_;
│ │ │ -
282 start_ = rhs.start_;
│ │ │ -
283 heh_ = rhs.heh_;
│ │ │ -
284 lap_counter_ = rhs.lap_counter_;
│ │ │ -
285 return *this;
│ │ │ -
286 }
│ │ │ -
287
│ │ │ -
288 inline bool operator==(const GenericCirculatorBaseT &rhs) const {
│ │ │ -
289 return mesh_ == rhs.mesh_ && start_ == rhs.start_ && heh_ == rhs.heh_ && lap_counter_ == rhs.lap_counter_;
│ │ │ -
290 }
│ │ │ -
291
│ │ │ -
292 inline bool operator!=(const GenericCirculatorBaseT &rhs) const {
│ │ │ -
293 return !operator==(rhs);
│ │ │ -
294 }
│ │ │ -
295
│ │ │ -
296 protected:
│ │ │ -
297 mesh_ptr mesh_;
│ │ │ -
298 typename Mesh::HalfedgeHandle start_, heh_;
│ │ │ -
299 int lap_counter_;
│ │ │ -
300};
│ │ │ -
│ │ │ -
301
│ │ │ -
302//template<class Mesh, class CenterEntityHandle, class ValueHandle,
│ │ │ -
303// ValueHandle (GenericCirculatorBaseT<Mesh>::*Handle2Value)() const, bool CW = true >
│ │ │ -
304template <typename GenericCirculatorT_TraitsT, bool CW = true>
│ │ │ -
│ │ │ -
305class GenericCirculatorT : protected GenericCirculatorBaseT<typename GenericCirculatorT_TraitsT::Mesh> {
│ │ │ -
306 public:
│ │ │ -
307 using Mesh = typename GenericCirculatorT_TraitsT::Mesh;
│ │ │ -
308 using value_type = typename GenericCirculatorT_TraitsT::ValueHandle;
│ │ │ -
309 using CenterEntityHandle = typename GenericCirculatorT_TraitsT::CenterEntityHandle;
│ │ │ -
310
│ │ │ -
311 using smart_value_type = decltype(make_smart(std::declval<value_type>(), std::declval<Mesh>()));
│ │ │ -
312
│ │ │ -
313 typedef std::ptrdiff_t difference_type;
│ │ │ -
314 typedef const value_type& reference;
│ │ │ -
315 typedef const smart_value_type* pointer;
│ │ │ -
316 typedef std::bidirectional_iterator_tag iterator_category;
│ │ │ -
317
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
321
│ │ │ -
322 template <typename> friend class OpenMesh::CirculatorRange;
│ │ │ -
323
│ │ │ -
324 public:
│ │ │ - │ │ │ -
326 GenericCirculatorT(mesh_ref mesh, CenterEntityHandle start, bool end = false) :
│ │ │ -
327 GenericCirculatorBaseT<Mesh>(mesh, mesh.halfedge_handle(start), end)
│ │ │ -
328 {
│ │ │ -
329 bool adjust_for_ccw = true;
│ │ │ -
330 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_, adjust_for_ccw);
│ │ │ -
331 }
│ │ │ -
332 GenericCirculatorT(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) :
│ │ │ -
333 GenericCirculatorBaseT<Mesh>(mesh, heh, end)
│ │ │ -
334 {
│ │ │ -
335 bool adjust_for_ccw = false; // if iterator is initialized with specific heh, we want to start there
│ │ │ -
336 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_, adjust_for_ccw);
│ │ │ -
337 }
│ │ │ - │ │ │ -
339
│ │ │ -
340 friend class GenericCirculatorT<GenericCirculatorT_TraitsT,!CW>;
│ │ │ - │ │ │ - │ │ │ -
343
│ │ │ -
344 GenericCirculatorT& operator++() {
│ │ │ -
345 assert(this->mesh_);
│ │ │ -
346 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ -
347 return *this;
│ │ │ -
348 }
│ │ │ -
349 GenericCirculatorT& operator--() {
│ │ │ -
350 assert(this->mesh_);
│ │ │ -
351 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ -
352 return *this;
│ │ │ -
353 }
│ │ │ -
354
│ │ │ -
│ │ │ - │ │ │ -
357 assert(this->mesh_);
│ │ │ -
358 GenericCirculatorT cpy(*this);
│ │ │ -
359 ++(*this);
│ │ │ -
360 return cpy;
│ │ │ -
361 }
│ │ │ -
│ │ │ -
362
│ │ │ -
│ │ │ - │ │ │ -
365 assert(this->mesh_);
│ │ │ -
366 GenericCirculatorT cpy(*this);
│ │ │ -
367 --(*this);
│ │ │ -
368 return cpy;
│ │ │ -
369 }
│ │ │ -
│ │ │ -
370
│ │ │ -
│ │ │ -
372 smart_value_type operator*() const {
│ │ │ -
373#ifndef NDEBUG
│ │ │ -
374 assert(this->heh_.is_valid());
│ │ │ -
375 value_type res = GenericCirculatorT_TraitsT::toHandle(this->mesh_, this->heh_);
│ │ │ -
376 assert(res.is_valid());
│ │ │ -
377 return make_smart(res, this->mesh_);
│ │ │ -
378#else
│ │ │ -
379 return make_smart(GenericCirculatorT_TraitsT::toHandle(this->mesh_, this->heh_), this->mesh_);
│ │ │ -
380#endif
│ │ │ -
381 }
│ │ │ -
│ │ │ -
382
│ │ │ -
│ │ │ -
391 pointer operator->() const {
│ │ │ -
392 pointer_deref_value = **this;
│ │ │ -
393 return &pointer_deref_value;
│ │ │ -
394 }
│ │ │ -
│ │ │ -
395
│ │ │ -
396 GenericCirculatorT &operator=(const GenericCirculatorT &rhs) {
│ │ │ - │ │ │ -
398 return *this;
│ │ │ -
399 };
│ │ │ -
400
│ │ │ -
401 bool operator==(const GenericCirculatorT &rhs) const {
│ │ │ -
402 return GenericCirculatorBaseT<Mesh>::operator==(rhs);
│ │ │ -
403 }
│ │ │ -
404
│ │ │ -
405 bool operator!=(const GenericCirculatorT &rhs) const {
│ │ │ -
406 return GenericCirculatorBaseT<Mesh>::operator!=(rhs);
│ │ │ -
407 }
│ │ │ -
408
│ │ │ -
409 bool is_valid() const {
│ │ │ -
410 return GenericCirculator_ValueHandleFns::is_valid(this->heh_, this->lap_counter_);
│ │ │ -
411 }
│ │ │ -
412
│ │ │ -
413 template<typename STREAM>
│ │ │ -
414 friend STREAM &operator<< (STREAM &s, const GenericCirculatorT &self) {
│ │ │ -
415 return s << self.mesh_ << ", " << self.start_.idx() << ", " << self.heh_.idx() << ", " << self.lap_counter_;
│ │ │ -
416 }
│ │ │ -
417
│ │ │ -
418 private:
│ │ │ -
419 mutable smart_value_type pointer_deref_value;
│ │ │ -
420};
│ │ │ -
│ │ │ -
421
│ │ │ -
426// OLD CIRCULATORS
│ │ │ -
427// deprecated circulators, will be removed soon
│ │ │ -
428// if you remove these circulators and go to the old ones, PLEASE ENABLE FOLLOWING UNITTESTS:
│ │ │ -
429//
│ │ │ -
430// OpenMeshTrimeshCirculatorVertexIHalfEdge.VertexIHalfEdgeIterCheckInvalidationAtEnds
│ │ │ -
431// OpenMeshTrimeshCirculatorVertexEdge.VertexEdgeIterCheckInvalidationAtEnds
│ │ │ -
432// OpenMeshTrimeshCirculatorVertexVertex.VertexVertexIterCheckInvalidationAtEnds
│ │ │ -
433// OpenMeshTrimeshCirculatorVertexOHalfEdge.VertexOHalfEdgeIterCheckInvalidationAtEnds
│ │ │ -
434// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterCheckInvalidationAtEnds
│ │ │ -
435// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterWithoutHolesDecrement
│ │ │ -
436// OpenMeshTrimeshCirculatorFaceEdge.FaceEdgeIterCheckInvalidationAtEnds
│ │ │ -
437// OpenMeshTrimeshCirculatorFaceFace.FaceFaceIterCheckInvalidationAtEnds
│ │ │ -
438// OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterWithoutHolesIncrement
│ │ │ -
439// OpenMeshTrimeshCirculatorFaceVertex.FaceVertexIterCheckInvalidationAtEnds
│ │ │ -
440// OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterCheckInvalidationAtEnds
│ │ │ -
441//
│ │ │ -
442
│ │ │ -
443template<class Mesh, class CenterEntityHandle, class ValueHandle>
│ │ │ -
│ │ │ - │ │ │ -
445 public:
│ │ │ -
446 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh,const typename Mesh::HalfedgeHandle &start, const int lap_counter) {
│ │ │ -
447 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )) );
│ │ │ -
448 }
│ │ │ -
449 inline static void init(const Mesh*, typename Mesh::HalfedgeHandle&, typename Mesh::HalfedgeHandle&, int&) {};
│ │ │ -
450 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ - │ │ │ -
452 }
│ │ │ -
453 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ - │ │ │ -
455 }
│ │ │ -
456};
│ │ │ -
│ │ │ -
457
│ │ │ -
458template<class Mesh, class CenterEntityHandle>
│ │ │ -
│ │ │ - │ │ │ -
460 public:
│ │ │ - │ │ │ -
462
│ │ │ -
463 inline static bool is_valid(const typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const int lap_counter) {
│ │ │ -
464 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )));
│ │ │ -
465 }
│ │ │ -
466 inline static void init(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
467 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh) && lap_counter == 0 )
│ │ │ -
468 increment(mesh, heh, start, lap_counter);
│ │ │ -
469 };
│ │ │ -
470 inline static void increment(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
471 do {
│ │ │ - │ │ │ -
473 } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ -
474 }
│ │ │ -
475 inline static void decrement(const Mesh *mesh, typename Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, int &lap_counter) {
│ │ │ -
476 do {
│ │ │ - │ │ │ -
478 } while (is_valid(heh, start, lap_counter) && !GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh));
│ │ │ -
479 }
│ │ │ -
480};
│ │ │ -
│ │ │ -
481
│ │ │ -
482template <typename GenericCirculatorT_DEPRECATED_TraitsT>
│ │ │ -
│ │ │ -
483class GenericCirculatorT_DEPRECATED : protected GenericCirculatorBaseT<typename GenericCirculatorT_DEPRECATED_TraitsT::Mesh> {
│ │ │ -
484 public:
│ │ │ -
485 using Mesh = typename GenericCirculatorT_DEPRECATED_TraitsT::Mesh;
│ │ │ -
486 using CenterEntityHandle = typename GenericCirculatorT_DEPRECATED_TraitsT::CenterEntityHandle;
│ │ │ -
487 using value_type = typename GenericCirculatorT_DEPRECATED_TraitsT::ValueHandle;
│ │ │ -
488 using smart_value_type = decltype (make_smart(std::declval<value_type>(), std::declval<Mesh>()));
│ │ │ -
489
│ │ │ -
490 typedef std::ptrdiff_t difference_type;
│ │ │ -
491 typedef const value_type& reference;
│ │ │ -
492 typedef const smart_value_type* pointer;
│ │ │ -
493 typedef std::bidirectional_iterator_tag iterator_category;
│ │ │ -
494
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
498
│ │ │ -
499 template <typename> friend class OpenMesh::CirculatorRange;
│ │ │ -
500
│ │ │ -
501 public:
│ │ │ - │ │ │ -
503 GenericCirculatorT_DEPRECATED(mesh_ref mesh, CenterEntityHandle start, bool end = false) :
│ │ │ -
504 GenericCirculatorBaseT<Mesh>(mesh, mesh.halfedge_handle(start), end) {
│ │ │ -
505
│ │ │ -
506 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ -
507 }
│ │ │ -
508 GenericCirculatorT_DEPRECATED(mesh_ref mesh, typename Mesh::HalfedgeHandle heh, bool end = false) :
│ │ │ -
509 GenericCirculatorBaseT<Mesh>(mesh, heh, end) {
│ │ │ -
510
│ │ │ -
511 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ -
512 }
│ │ │ - │ │ │ -
514
│ │ │ -
515 GenericCirculatorT_DEPRECATED& operator++() {
│ │ │ -
516 assert(this->mesh_);
│ │ │ -
517 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ -
518 return *this;
│ │ │ -
519 }
│ │ │ -
520#ifndef NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ -
521#define DECREMENT_DEPRECATED_WARNINGS_TEXT "The current decrement operator has the unintended behavior that it stays\
│ │ │ -
522 valid when iterating below the start and will visit the first entity\
│ │ │ -
523 twice before getting invalid. Furthermore it gets valid again, if you\
│ │ │ -
524 increment at the end.\
│ │ │ -
525 When you are sure that you don't iterate below the start anywhere in\
│ │ │ -
526 your code or rely on this behaviour, you can disable this warning by\
│ │ │ -
527 setting the define NO_DECREMENT_DEPRECATED_WARNINGS at the command line (or enable it via the\
│ │ │ -
528 cmake flags).\
│ │ │ -
529 To be save, you can use the CW/CCW circulator definitions, which behave\
│ │ │ -
530 the same as the original ones, without the previously mentioned issues."
│ │ │ -
531
│ │ │ -
532 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT )
│ │ │ -
533#endif // NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ -
534 GenericCirculatorT_DEPRECATED& operator--() {
│ │ │ -
535 assert(this->mesh_);
│ │ │ -
536 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this->start_, this->lap_counter_);
│ │ │ -
537 return *this;
│ │ │ -
538 }
│ │ │ -
539
│ │ │ -
│ │ │ - │ │ │ -
542 assert(this->mesh_);
│ │ │ - │ │ │ -
544 ++(*this);
│ │ │ -
545 return cpy;
│ │ │ -
546 }
│ │ │ -
│ │ │ -
547
│ │ │ -
549#ifndef NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ -
550 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT )
│ │ │ -
551#undef DECREMENT_DEPRECATED_WARNINGS_TEXT
│ │ │ -
552#endif //NO_DECREMENT_DEPRECATED_WARNINGS
│ │ │ -
│ │ │ - │ │ │ -
554 assert(this->mesh_);
│ │ │ - │ │ │ -
556 --(*this);
│ │ │ -
557 return cpy;
│ │ │ -
558 }
│ │ │ -
│ │ │ -
559
│ │ │ -
│ │ │ -
561 smart_value_type operator*() const {
│ │ │ -
562#ifndef NDEBUG
│ │ │ -
563 assert(this->heh_.is_valid());
│ │ │ -
564 value_type res = (GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this->mesh_, this->heh_));
│ │ │ -
565 assert(res.is_valid());
│ │ │ -
566 return make_smart(res, this->mesh_);
│ │ │ -
567#else
│ │ │ -
568 return make_smart(GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this->mesh_, this->heh_), this->mesh_);
│ │ │ -
569#endif
│ │ │ -
570 }
│ │ │ -
│ │ │ -
571
│ │ │ -
│ │ │ -
580 pointer operator->() const {
│ │ │ -
581 pointer_deref_value = **this;
│ │ │ -
582 return &pointer_deref_value;
│ │ │ -
583 }
│ │ │ -
│ │ │ -
584
│ │ │ - │ │ │ - │ │ │ -
587 return *this;
│ │ │ -
588 };
│ │ │ -
589
│ │ │ -
590 bool operator==(const GenericCirculatorT_DEPRECATED &rhs) const {
│ │ │ -
591 return GenericCirculatorBaseT<Mesh>::operator==(rhs);
│ │ │ -
592 }
│ │ │ -
593
│ │ │ -
594 bool operator!=(const GenericCirculatorT_DEPRECATED &rhs) const {
│ │ │ -
595 return GenericCirculatorBaseT<Mesh>::operator!=(rhs);
│ │ │ -
596 }
│ │ │ -
597
│ │ │ -
598 bool is_valid() const {
│ │ │ -
599 return GenericCirculator_ValueHandleFns::is_valid(this->heh_,this->start_, this->lap_counter_);
│ │ │ -
600 }
│ │ │ -
601
│ │ │ -
602 OM_DEPRECATED("current_halfedge_handle() is an implementation detail and should not be accessed from outside the iterator class.")
│ │ │ -
│ │ │ -
608 const typename Mesh::HalfedgeHandle &current_halfedge_handle() const {
│ │ │ -
609 return this->heh_;
│ │ │ -
610 }
│ │ │ -
│ │ │ -
611
│ │ │ -
612 OM_DEPRECATED("Do not use this error prone implicit cast. Compare to end-iterator or use is_valid(), instead.")
│ │ │ -
│ │ │ -
618 operator bool() const {
│ │ │ -
619 return is_valid();
│ │ │ -
620 }
│ │ │ -
│ │ │ -
621
│ │ │ -
627 OM_DEPRECATED("This function clutters your code. Use dereferencing operators -> and * instead.")
│ │ │ -
│ │ │ -
628 smart_value_type handle() const {
│ │ │ -
629 return **this;
│ │ │ -
630 }
│ │ │ -
│ │ │ -
631
│ │ │ -
638 OM_DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing operators -> and * instead.")
│ │ │ -
│ │ │ -
639 operator value_type() const {
│ │ │ -
640 return **this;
│ │ │ -
641 }
│ │ │ -
│ │ │ -
642
│ │ │ -
643 template<typename STREAM>
│ │ │ -
644 friend STREAM &operator<< (STREAM &s, const GenericCirculatorT_DEPRECATED &self) {
│ │ │ -
645 return s << self.mesh_ << ", " << self.start_.idx() << ", " << self.heh_.idx() << ", " << self.lap_counter_;
│ │ │ -
646 }
│ │ │ -
647
│ │ │ -
648 private:
│ │ │ -
649 mutable smart_value_type pointer_deref_value;
│ │ │ -
650};
│ │ │ -
│ │ │ -
651
│ │ │ -
652} // namespace Iterators
│ │ │ -
653} // namespace OpenMesh
│ │ │ -
654
│ │ │ +
68
│ │ │ +
69
│ │ │ +
70//=============================================================================
│ │ │ +
71} // namespace OpenMesh
│ │ │ +
72//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ -
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
Definition CirculatorsT.hh:240
│ │ │ -
Definition CirculatorsT.hh:305
│ │ │ -
smart_value_type operator*() const
Standard dereferencing operator.
Definition CirculatorsT.hh:372
│ │ │ -
GenericCirculatorT operator++(int)
Post-increment.
Definition CirculatorsT.hh:356
│ │ │ -
GenericCirculatorT operator--(int)
Post-decrement.
Definition CirculatorsT.hh:364
│ │ │ -
pointer operator->() const
Pointer dereferentiation.
Definition CirculatorsT.hh:391
│ │ │ - │ │ │ - │ │ │ -
GenericCirculatorT_DEPRECATED operator++(int)
Post-increment.
Definition CirculatorsT.hh:541
│ │ │ -
const Mesh::HalfedgeHandle & current_halfedge_handle() const
Definition CirculatorsT.hh:608
│ │ │ -
pointer operator->() const
Pointer dereferentiation.
Definition CirculatorsT.hh:580
│ │ │ -
GenericCirculatorT_DEPRECATED operator--(int)
Post-decrement.
Definition CirculatorsT.hh:553
│ │ │ -
smart_value_type operator*() const
Standard dereferencing operator.
Definition CirculatorsT.hh:561
│ │ │ -
smart_value_type handle() const
Return the handle of the current target.
Definition CirculatorsT.hh:628
│ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ -
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ -
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,16 +1,16 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -CirculatorsT.hh │ │ │ │ +blaT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +4 * Copyright (c) 2001-2015, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ 8 * * │ │ │ │ 9 *---------------------------------------------------------------------------* │ │ │ │ 10 * This file is part of OpenMesh. * │ │ │ │ 11 *--------------------------------------------------------------------------- │ │ │ │ @@ -46,805 +46,52 @@ │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ -43#pragma once │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ +43 │ │ │ │ +44// │ │ │ │ ============================================================================= │ │ │ │ -46// │ │ │ │ -47// Vertex, Face, and Edge circulators for PolyMesh/TriMesh │ │ │ │ +45// │ │ │ │ +46// CLASS bla - IMPLEMENTATION │ │ │ │ +47// │ │ │ │ 48// │ │ │ │ -49// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ +49 │ │ │ │ +50#define OPENMESH_BLA_C │ │ │ │ 51 │ │ │ │ -52 │ │ │ │ -53//== INCLUDES │ │ │ │ +52//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ -54 │ │ │ │ -55#include │ │ │ │ -56#include │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59 │ │ │ │ -60//== NAMESPACES │ │ │ │ +53 │ │ │ │ +54#include │ │ │ │ +55 │ │ │ │ +56 │ │ │ │ +57//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ +58 │ │ │ │ +59namespace _O_p_e_n_M_e_s_h { │ │ │ │ +60 │ │ │ │ 61 │ │ │ │ -62namespace _O_p_e_n_M_e_s_h { │ │ │ │ +62//== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ 63 │ │ │ │ -64template class CirculatorRange; │ │ │ │ +64 │ │ │ │ 65 │ │ │ │ -66namespace Iterators { │ │ │ │ +66//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ 67 │ │ │ │ -68template │ │ │ │ -_6_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T { │ │ │ │ -70 public: │ │ │ │ -71 static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, │ │ │ │ -const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter); │ │ │ │ -72 static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, │ │ │ │ -const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter); │ │ │ │ -73}; │ │ │ │ -74 │ │ │ │ -75template │ │ │ │ -_7_6class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_V_e_r_t_e_x_H_a_n_d_l_e, │ │ │ │ -true> { │ │ │ │ -77 public: │ │ │ │ -78 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -79 heh = mesh->cw_rotated_halfedge_handle(heh); │ │ │ │ -80 if (heh == start) ++lap_counter; │ │ │ │ -81 } │ │ │ │ -82 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -83 if (heh == start) --lap_counter; │ │ │ │ -84 heh = mesh->ccw_rotated_halfedge_handle(heh); │ │ │ │ -85 } │ │ │ │ -86}; │ │ │ │ -87 │ │ │ │ -88template │ │ │ │ -_8_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_F_a_c_e_H_a_n_d_l_e, │ │ │ │ -true> { │ │ │ │ -90 public: │ │ │ │ -91 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -92 heh = mesh->next_halfedge_handle(heh); │ │ │ │ -93 if (heh == start) ++lap_counter; │ │ │ │ -94 } │ │ │ │ -95 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -96 if (heh == start) --lap_counter; │ │ │ │ -97 heh = mesh->prev_halfedge_handle(heh); │ │ │ │ -98 } │ │ │ │ -99}; │ │ │ │ -100 │ │ │ │ -101template │ │ │ │ -_1_0_2class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_E_d_g_e_H_a_n_d_l_e, │ │ │ │ -CW> { │ │ │ │ -103 public: │ │ │ │ -104 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -105 heh = mesh->opposite_halfedge_handle(heh); │ │ │ │ -106 if (heh == start) ++lap_counter; │ │ │ │ -107 } │ │ │ │ -108 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -109 if (heh == start) --lap_counter; │ │ │ │ -110 heh = mesh->opposite_halfedge_handle(heh); │ │ │ │ -111 } │ │ │ │ -112}; │ │ │ │ -113 │ │ │ │ -115// CCW │ │ │ │ -116 │ │ │ │ -117template │ │ │ │ -_1_1_8class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_V_e_r_t_e_x_H_a_n_d_l_e, │ │ │ │ -false> { │ │ │ │ -119 public: │ │ │ │ -120 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -121 heh = mesh->ccw_rotated_halfedge_handle(heh); │ │ │ │ -122 if (heh == start) ++lap_counter; │ │ │ │ -123 } │ │ │ │ -124 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -125 if (heh == start) --lap_counter; │ │ │ │ -126 heh = mesh->cw_rotated_halfedge_handle(heh); │ │ │ │ -127 } │ │ │ │ -128}; │ │ │ │ -129 │ │ │ │ -130template │ │ │ │ -_1_3_1class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T<_M_e_s_h, typename _M_e_s_h::_F_a_c_e_H_a_n_d_l_e, │ │ │ │ -false> { │ │ │ │ -132 public: │ │ │ │ -133 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -134 heh = mesh->prev_halfedge_handle(heh); │ │ │ │ -135 if (heh == start) ++lap_counter; │ │ │ │ -136 } │ │ │ │ -137 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -138 if (heh == start) --lap_counter; │ │ │ │ -139 heh = mesh->next_halfedge_handle(heh); │ │ │ │ -140 } │ │ │ │ -141}; │ │ │ │ -143 │ │ │ │ -144template │ │ │ │ -_1_4_5class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T { │ │ │ │ -146 public: │ │ │ │ -147 //inline static bool isDereferenciable(const Mesh *mesh, const typename │ │ │ │ -Mesh::HalfedgeHandle &heh, const typename Mesh::HalfedgeHandle &start, const │ │ │ │ -int &lap_counter); │ │ │ │ -148}; │ │ │ │ -149 │ │ │ │ -150template │ │ │ │ -_1_5_1class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T<_M_e_s_h, typename _M_e_s_h:: │ │ │ │ -_F_a_c_e_H_a_n_d_l_e, typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ -152 public: │ │ │ │ -153 inline static bool isDereferenciable(const _M_e_s_h *mesh, const typename │ │ │ │ -_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh) { │ │ │ │ -154 return mesh->face_handle(mesh->opposite_halfedge_handle(heh)).is_valid(); │ │ │ │ -155 } │ │ │ │ -156}; │ │ │ │ -157 │ │ │ │ -158template │ │ │ │ -_1_5_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T<_M_e_s_h, typename _M_e_s_h:: │ │ │ │ -_V_e_r_t_e_x_H_a_n_d_l_e, typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ -160 public: │ │ │ │ -161 inline static bool isDereferenciable(const _M_e_s_h *mesh, const typename │ │ │ │ -_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh) { │ │ │ │ -162 return mesh->face_handle(heh).is_valid(); │ │ │ │ -163 } │ │ │ │ -164}; │ │ │ │ -165 │ │ │ │ -166template │ │ │ │ -_1_6_7class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T<_M_e_s_h, typename _M_e_s_h:: │ │ │ │ -_E_d_g_e_H_a_n_d_l_e, typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ -168 public: │ │ │ │ -169 inline static bool isDereferenciable(const _M_e_s_h *mesh, const typename │ │ │ │ -_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh) { │ │ │ │ -170 return mesh->face_handle(heh).is_valid(); │ │ │ │ -171 } │ │ │ │ -172}; │ │ │ │ -173 │ │ │ │ -174template │ │ │ │ -_1_7_5class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T { │ │ │ │ -176 public: │ │ │ │ -177 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const │ │ │ │ -int lap_counter) { │ │ │ │ -178 return ( heh.is_valid() && (lap_counter == 0 ) ); │ │ │ │ -179 } │ │ │ │ -180 inline static void init(const _M_e_s_h* mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& │ │ │ │ -heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& start, int& lap_counter, bool │ │ │ │ -adjust_for_ccw) │ │ │ │ -181 { │ │ │ │ -182 if (!CW) // TODO: constexpr if │ │ │ │ -183 { │ │ │ │ -184 if (adjust_for_ccw) │ │ │ │ -185 { │ │ │ │ -186 // increment current heh and start so that cw and ccw version dont start │ │ │ │ -with the same element but ranges are actually reversed │ │ │ │ -187 int lc = lap_counter; │ │ │ │ -188 increment(mesh, heh, start, lap_counter); │ │ │ │ -189 start = heh; │ │ │ │ -190 lap_counter = lc; │ │ │ │ -191 } │ │ │ │ -192 } │ │ │ │ -193 } │ │ │ │ -194 │ │ │ │ -195 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -196 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ -(mesh, heh, start, lap_counter); │ │ │ │ -197 } │ │ │ │ -198 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -199 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ -(mesh, heh, start, lap_counter); │ │ │ │ -200 } │ │ │ │ -201}; │ │ │ │ -202 │ │ │ │ -203template │ │ │ │ -_2_0_4class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T<_M_e_s_h, CenterEntityHandle, typename │ │ │ │ -_M_e_s_h::_F_a_c_e_H_a_n_d_l_e, CW> { │ │ │ │ -205 public: │ │ │ │ -206 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T_<_M_e_s_h_, │ │ │ │ -_C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_y_p_e_n_a_m_e_ _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e_> │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k; │ │ │ │ -207 │ │ │ │ -208 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const │ │ │ │ -int lap_counter) { │ │ │ │ -209 return ( heh.is_valid() && (lap_counter == 0)); │ │ │ │ -210 } │ │ │ │ -211 inline static void init(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -&heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter, bool │ │ │ │ -adjust_for_ccw) │ │ │ │ -212 { │ │ │ │ -213 if (!CW) // TODO: constexpr if │ │ │ │ -214 { │ │ │ │ -215 if (adjust_for_ccw) │ │ │ │ -216 { │ │ │ │ -217 // increment current heh and start so that cw and ccw version dont start │ │ │ │ -with the same element but ranges are actually reversed │ │ │ │ -218 int lc = lap_counter; │ │ │ │ -219 increment(mesh, heh, start, lap_counter); │ │ │ │ -220 start = heh; │ │ │ │ -221 lap_counter = lc; │ │ │ │ -222 } │ │ │ │ -223 } │ │ │ │ -224 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck:: │ │ │ │ -isDereferenciable(mesh, heh) && lap_counter == 0 ) │ │ │ │ -225 increment(mesh, heh, start, lap_counter); │ │ │ │ -226 }; │ │ │ │ -227 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -228 do { │ │ │ │ -229 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ -(mesh, heh, start, lap_counter); │ │ │ │ -230 } while (is_valid(heh, lap_counter) && │ │ │ │ -!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ -231 } │ │ │ │ -232 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -233 do { │ │ │ │ -234 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _C_W_>_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ -(mesh, heh, start, lap_counter); │ │ │ │ -235 } while (is_valid(heh, lap_counter) && │ │ │ │ -!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ -236 } │ │ │ │ -237}; │ │ │ │ -238 │ │ │ │ -239template │ │ │ │ -_2_4_0class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T { │ │ │ │ -241 public: │ │ │ │ -242 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ -243 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ -244 │ │ │ │ -245 template friend class _O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ -246 │ │ │ │ -247 public: │ │ │ │ -248 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T() : mesh_(0), lap_counter_(0) {} │ │ │ │ -249 │ │ │ │ -250 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T(_m_e_s_h___r_e_f mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, │ │ │ │ -bool end = false) : │ │ │ │ -251 mesh_(&mesh), start_(heh), heh_(heh), lap_counter_(static_cast(end && │ │ │ │ -heh.is_valid())) {} │ │ │ │ -252 │ │ │ │ -253 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) : │ │ │ │ -254 mesh_(rhs.mesh_), start_(rhs.start_), heh_(rhs.heh_), lap_counter_ │ │ │ │ -(rhs.lap_counter_) {} │ │ │ │ -255 │ │ │ │ -256 inline typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e toFaceHandle() const { │ │ │ │ -257 return mesh_->face_handle(heh_); │ │ │ │ -258 } │ │ │ │ -259 │ │ │ │ -260 inline typename _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e toOppositeFaceHandle() const { │ │ │ │ -261 return mesh_->face_handle(toOppositeHalfedgeHandle()); │ │ │ │ -262 } │ │ │ │ -263 │ │ │ │ -264 inline typename _M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e toEdgeHandle() const { │ │ │ │ -265 return mesh_->edge_handle(heh_); │ │ │ │ -266 } │ │ │ │ -267 │ │ │ │ -268 inline typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e toHalfedgeHandle() const { │ │ │ │ -269 return heh_; │ │ │ │ -270 } │ │ │ │ -271 │ │ │ │ -272 inline typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e toOppositeHalfedgeHandle() const { │ │ │ │ -273 return mesh_->opposite_halfedge_handle(heh_); │ │ │ │ -274 } │ │ │ │ -275 │ │ │ │ -276 inline typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e toVertexHandle() const { │ │ │ │ -277 return mesh_->to_vertex_handle(heh_); │ │ │ │ -278 } │ │ │ │ -279 │ │ │ │ -280 inline _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &operator=(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) │ │ │ │ -{ │ │ │ │ -281 mesh_ = rhs.mesh_; │ │ │ │ -282 start_ = rhs.start_; │ │ │ │ -283 heh_ = rhs.heh_; │ │ │ │ -284 lap_counter_ = rhs.lap_counter_; │ │ │ │ -285 return *this; │ │ │ │ -286 } │ │ │ │ -287 │ │ │ │ -288 inline bool operator==(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) const { │ │ │ │ -289 return mesh_ == rhs.mesh_ && start_ == rhs.start_ && heh_ == rhs.heh_ && │ │ │ │ -lap_counter_ == rhs.lap_counter_; │ │ │ │ -290 } │ │ │ │ -291 │ │ │ │ -292 inline bool operator!=(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T &rhs) const { │ │ │ │ -293 return !operator==(rhs); │ │ │ │ -294 } │ │ │ │ -295 │ │ │ │ -296 protected: │ │ │ │ -297 _m_e_s_h___p_t_r mesh_; │ │ │ │ -298 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e start_, heh_; │ │ │ │ -299 int lap_counter_; │ │ │ │ -300}; │ │ │ │ -301 │ │ │ │ -302//template::*Handle2Value)() const, bool │ │ │ │ -CW = true > │ │ │ │ -304template │ │ │ │ -_3_0_5class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T : protected _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T { │ │ │ │ -306 public: │ │ │ │ -307 using Mesh = typename GenericCirculatorT_TraitsT::Mesh; │ │ │ │ -308 using value_type = typename GenericCirculatorT_TraitsT::ValueHandle; │ │ │ │ -309 using CenterEntityHandle = typename GenericCirculatorT_TraitsT:: │ │ │ │ -CenterEntityHandle; │ │ │ │ -310 │ │ │ │ -311 using smart_value_type = decltype(_m_a_k_e___s_m_a_r_t(std::declval(), │ │ │ │ -std::declval())); │ │ │ │ -312 │ │ │ │ -313 typedef std::ptrdiff_t difference_type; │ │ │ │ -314 typedef const value_type& reference; │ │ │ │ -315 typedef const smart_value_type* pointer; │ │ │ │ -316 typedef std::bidirectional_iterator_tag iterator_category; │ │ │ │ -317 │ │ │ │ -318 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___p_t_r _m_e_s_h___p_t_r; │ │ │ │ -319 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___r_e_f _m_e_s_h___r_e_f; │ │ │ │ -320 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_, │ │ │ │ -_v_a_l_u_e___t_y_p_e_,_ _C_W_> _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s; │ │ │ │ -321 │ │ │ │ -322 template friend class _O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ -323 │ │ │ │ -324 public: │ │ │ │ -325 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T() {} │ │ │ │ -326 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f mesh, CenterEntityHandle start, bool end = │ │ │ │ -false) : │ │ │ │ -327 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, mesh.halfedge_handle(start), end) │ │ │ │ -328 { │ │ │ │ -329 bool adjust_for_ccw = true; │ │ │ │ -330 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_, adjust_for_ccw); │ │ │ │ -331 } │ │ │ │ -332 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh, bool │ │ │ │ -end = false) : │ │ │ │ -333 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, heh, end) │ │ │ │ -334 { │ │ │ │ -335 bool adjust_for_ccw = false; // if iterator is initialized with specific │ │ │ │ -heh, we want to start there │ │ │ │ -336 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_, adjust_for_ccw); │ │ │ │ -337 } │ │ │ │ -338 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T &rhs) : │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(rhs) {} │ │ │ │ -339 │ │ │ │ -340 friend class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T; │ │ │ │ -341 explicit _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T( const │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_<_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___T_r_a_i_t_s_T_,_!_C_W_>& rhs ) │ │ │ │ -342 :_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(rhs){} │ │ │ │ -343 │ │ │ │ -344 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T& operator++() { │ │ │ │ -345 assert(this->mesh_); │ │ │ │ -346 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_); │ │ │ │ -347 return *this; │ │ │ │ -348 } │ │ │ │ -349 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T& operator--() { │ │ │ │ -350 assert(this->mesh_); │ │ │ │ -351 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_); │ │ │ │ -352 return *this; │ │ │ │ -353 } │ │ │ │ -354 │ │ │ │ -_3_5_6 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T _o_p_e_r_a_t_o_r_+_+(int) { │ │ │ │ -357 assert(this->mesh_); │ │ │ │ -358 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T cpy(*this); │ │ │ │ -359 ++(*this); │ │ │ │ -360 return cpy; │ │ │ │ -361 } │ │ │ │ -362 │ │ │ │ -_3_6_4 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T _o_p_e_r_a_t_o_r_-_-(int) { │ │ │ │ -365 assert(this->mesh_); │ │ │ │ -366 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T cpy(*this); │ │ │ │ -367 --(*this); │ │ │ │ -368 return cpy; │ │ │ │ -369 } │ │ │ │ -370 │ │ │ │ -_3_7_2 smart_value_type _o_p_e_r_a_t_o_r_*() const { │ │ │ │ -373#ifndef NDEBUG │ │ │ │ -374 assert(this->heh_.is_valid()); │ │ │ │ -375 value_type res = GenericCirculatorT_TraitsT::toHandle(this->mesh_, this- │ │ │ │ ->heh_); │ │ │ │ -376 assert(res.is_valid()); │ │ │ │ -377 return _m_a_k_e___s_m_a_r_t(res, this->mesh_); │ │ │ │ -378#else │ │ │ │ -379 return _m_a_k_e___s_m_a_r_t(GenericCirculatorT_TraitsT::toHandle(this->mesh_, this- │ │ │ │ ->heh_), this->mesh_); │ │ │ │ -380#endif │ │ │ │ -381 } │ │ │ │ -382 │ │ │ │ -_3_9_1 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ -392 pointer_deref_value = **this; │ │ │ │ -393 return &pointer_deref_value; │ │ │ │ -394 } │ │ │ │ -395 │ │ │ │ -396 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T &operator=(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T &rhs) { │ │ │ │ -397 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_o_p_e_r_a_t_o_r_=(rhs); │ │ │ │ -398 return *this; │ │ │ │ -399 }; │ │ │ │ -400 │ │ │ │ -401 bool operator==(const GenericCirculatorT &rhs) const { │ │ │ │ -402 return GenericCirculatorBaseT::operator==(rhs); │ │ │ │ -403 } │ │ │ │ -404 │ │ │ │ -405 bool operator!=(const GenericCirculatorT &rhs) const { │ │ │ │ -406 return GenericCirculatorBaseT::operator!=(rhs); │ │ │ │ -407 } │ │ │ │ -408 │ │ │ │ -409 bool is_valid() const { │ │ │ │ -410 return GenericCirculator_ValueHandleFns::is_valid(this->heh_, this- │ │ │ │ ->lap_counter_); │ │ │ │ -411 } │ │ │ │ -412 │ │ │ │ -413 template │ │ │ │ -414 friend STREAM &operator<< (STREAM &s, const GenericCirculatorT &self) { │ │ │ │ -415 return s << self.mesh_ << ", " << self.start_.idx() << ", " << │ │ │ │ -self.heh_.idx() << ", " << self.lap_counter_; │ │ │ │ -416 } │ │ │ │ -417 │ │ │ │ -418 private: │ │ │ │ -419 mutable smart_value_type pointer_deref_value; │ │ │ │ -420}; │ │ │ │ -421 │ │ │ │ -426// OLD CIRCULATORS │ │ │ │ -427// deprecated circulators, will be removed soon │ │ │ │ -428// if you remove these circulators and go to the old ones, PLEASE ENABLE │ │ │ │ -FOLLOWING UNITTESTS: │ │ │ │ -429// │ │ │ │ -430/ │ │ │ │ -/ │ │ │ │ -OpenMeshTrimeshCirculatorVertexIHalfEdge.VertexIHalfEdgeIterCheckInvalidationAtEnds │ │ │ │ -431// OpenMeshTrimeshCirculatorVertexEdge.VertexEdgeIterCheckInvalidationAtEnds │ │ │ │ -432/ │ │ │ │ -/ OpenMeshTrimeshCirculatorVertexVertex.VertexVertexIterCheckInvalidationAtEnds │ │ │ │ -433/ │ │ │ │ -/ │ │ │ │ -OpenMeshTrimeshCirculatorVertexOHalfEdge.VertexOHalfEdgeIterCheckInvalidationAtEnds │ │ │ │ -434// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterCheckInvalidationAtEnds │ │ │ │ -435// OpenMeshTrimeshCirculatorVertexFace.VertexFaceIterWithoutHolesDecrement │ │ │ │ -436// OpenMeshTrimeshCirculatorFaceEdge.FaceEdgeIterCheckInvalidationAtEnds │ │ │ │ -437// OpenMeshTrimeshCirculatorFaceFace.FaceFaceIterCheckInvalidationAtEnds │ │ │ │ -438/ │ │ │ │ -/ OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterWithoutHolesIncrement │ │ │ │ -439// OpenMeshTrimeshCirculatorFaceVertex.FaceVertexIterCheckInvalidationAtEnds │ │ │ │ -440/ │ │ │ │ -/ OpenMeshTrimeshCirculatorFaceHalfEdge.FaceHalfedgeIterCheckInvalidationAtEnds │ │ │ │ -441// │ │ │ │ -442 │ │ │ │ -443template │ │ │ │ -_4_4_4class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D { │ │ │ │ -445 public: │ │ │ │ -446 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh,const │ │ │ │ -typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, const int lap_counter) { │ │ │ │ -447 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 )) ); │ │ │ │ -448 } │ │ │ │ -449 inline static void init(const _M_e_s_h*, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e&, │ │ │ │ -typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e&, int&) {}; │ │ │ │ -450 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -451 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ -_i_n_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ -452 } │ │ │ │ -453 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -454 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ -_d_e_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ -455 } │ │ │ │ -456}; │ │ │ │ -457 │ │ │ │ -458template │ │ │ │ -_4_5_9class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D<_M_e_s_h, CenterEntityHandle, │ │ │ │ -typename _M_e_s_h::_F_a_c_e_H_a_n_d_l_e> { │ │ │ │ -460 public: │ │ │ │ -461 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T_<_M_e_s_h_, │ │ │ │ -_C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_y_p_e_n_a_m_e_ _M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e_> │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k; │ │ │ │ -462 │ │ │ │ -463 inline static bool is_valid(const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const │ │ │ │ -typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, const int lap_counter) { │ │ │ │ -464 return ( heh.is_valid() && ((start != heh) || (lap_counter == 0 ))); │ │ │ │ -465 } │ │ │ │ -466 inline static void init(const _M_e_s_h *mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -&heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int &lap_counter) { │ │ │ │ -467 if (heh.is_valid() && !GenericCirculator_DereferenciabilityCheck:: │ │ │ │ -isDereferenciable(mesh, heh) && lap_counter == 0 ) │ │ │ │ -468 increment(mesh, heh, start, lap_counter); │ │ │ │ -469 }; │ │ │ │ -470 inline static void increment(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -471 do { │ │ │ │ -472 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ -_i_n_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ -473 } while (is_valid(heh, start, lap_counter) && │ │ │ │ -!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ -474 } │ │ │ │ -475 inline static void decrement(const _M_e_s_h *mesh, typename _M_e_s_h_:_: │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e &heh, const typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e &start, int │ │ │ │ -&lap_counter) { │ │ │ │ -476 do { │ │ │ │ -477 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T_<_M_e_s_h_,_ _C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _t_r_u_e_>_:_: │ │ │ │ -_d_e_c_r_e_m_e_n_t(mesh, heh, start, lap_counter); │ │ │ │ -478 } while (is_valid(heh, start, lap_counter) && │ │ │ │ -!GenericCirculator_DereferenciabilityCheck::isDereferenciable(mesh, heh)); │ │ │ │ -479 } │ │ │ │ -480}; │ │ │ │ -481 │ │ │ │ -482template │ │ │ │ -_4_8_3class _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D : protected │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T { │ │ │ │ -484 public: │ │ │ │ -485 using Mesh = typename GenericCirculatorT_DEPRECATED_TraitsT::Mesh; │ │ │ │ -486 using CenterEntityHandle = typename GenericCirculatorT_DEPRECATED_TraitsT:: │ │ │ │ -CenterEntityHandle; │ │ │ │ -487 using value_type = typename GenericCirculatorT_DEPRECATED_TraitsT:: │ │ │ │ -ValueHandle; │ │ │ │ -488 using smart_value_type = decltype (_m_a_k_e___s_m_a_r_t(std::declval(), │ │ │ │ -std::declval())); │ │ │ │ -489 │ │ │ │ -490 typedef std::ptrdiff_t difference_type; │ │ │ │ -491 typedef const value_type& reference; │ │ │ │ -492 typedef const smart_value_type* pointer; │ │ │ │ -493 typedef std::bidirectional_iterator_tag iterator_category; │ │ │ │ -494 │ │ │ │ -495 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___p_t_r _m_e_s_h___p_t_r; │ │ │ │ -496 typedef typename _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_m_e_s_h___r_e_f _m_e_s_h___r_e_f; │ │ │ │ -497 typedef _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D_<_M_e_s_h_, │ │ │ │ -_C_e_n_t_e_r_E_n_t_i_t_y_H_a_n_d_l_e_,_ _v_a_l_u_e___t_y_p_e_> _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s; │ │ │ │ -498 │ │ │ │ -499 template friend class _O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e; │ │ │ │ -500 │ │ │ │ -501 public: │ │ │ │ -502 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D() {} │ │ │ │ -503 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D(_m_e_s_h___r_e_f mesh, CenterEntityHandle start, bool │ │ │ │ -end = false) : │ │ │ │ -504 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, mesh.halfedge_handle(start), end) { │ │ │ │ -505 │ │ │ │ -506 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_); │ │ │ │ -507 } │ │ │ │ -508 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D(_m_e_s_h___r_e_f mesh, typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -heh, bool end = false) : │ │ │ │ -509 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(mesh, heh, end) { │ │ │ │ -510 │ │ │ │ -511 GenericCirculator_ValueHandleFns::init(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_); │ │ │ │ -512 } │ │ │ │ -513 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D(const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D &rhs) : │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>(rhs) {} │ │ │ │ -514 │ │ │ │ -515 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D& operator++() { │ │ │ │ -516 assert(this->mesh_); │ │ │ │ -517 GenericCirculator_ValueHandleFns::increment(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_); │ │ │ │ -518 return *this; │ │ │ │ -519 } │ │ │ │ -520#ifndef NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ -521#define DECREMENT_DEPRECATED_WARNINGS_TEXT "The current decrement operator │ │ │ │ -has the unintended behavior that it stays\ │ │ │ │ -522 valid when iterating below the start and will visit the first entity\ │ │ │ │ -523 twice before getting invalid. Furthermore it gets valid again, if you\ │ │ │ │ -524 increment at the end.\ │ │ │ │ -525 When you are sure that you don't iterate below the start anywhere in\ │ │ │ │ -526 your code or rely on this behaviour, you can disable this warning by\ │ │ │ │ -527 setting the define NO_DECREMENT_DEPRECATED_WARNINGS at the command line (or │ │ │ │ -enable it via the\ │ │ │ │ -528 cmake flags).\ │ │ │ │ -529 To be save, you can use the CW/CCW circulator definitions, which behave\ │ │ │ │ -530 the same as the original ones, without the previously mentioned issues." │ │ │ │ -531 │ │ │ │ -532 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT ) │ │ │ │ -533#endif // NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ -534 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D& operator--() { │ │ │ │ -535 assert(this->mesh_); │ │ │ │ -536 GenericCirculator_ValueHandleFns::decrement(this->mesh_, this->heh_, this- │ │ │ │ ->start_, this->lap_counter_); │ │ │ │ -537 return *this; │ │ │ │ -538 } │ │ │ │ -539 │ │ │ │ -_5_4_1 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D _o_p_e_r_a_t_o_r_+_+(int) { │ │ │ │ -542 assert(this->mesh_); │ │ │ │ -543 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D cpy(*this); │ │ │ │ -544 ++(*this); │ │ │ │ -545 return cpy; │ │ │ │ -546 } │ │ │ │ -547 │ │ │ │ -549#ifndef NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ -550 OM_DEPRECATED( DECREMENT_DEPRECATED_WARNINGS_TEXT ) │ │ │ │ -551#undef DECREMENT_DEPRECATED_WARNINGS_TEXT │ │ │ │ -552#endif //NO_DECREMENT_DEPRECATED_WARNINGS │ │ │ │ -_5_5_3 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D _o_p_e_r_a_t_o_r_-_-(int) { │ │ │ │ -554 assert(this->mesh_); │ │ │ │ -555 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D cpy(*this); │ │ │ │ -556 --(*this); │ │ │ │ -557 return cpy; │ │ │ │ -558 } │ │ │ │ -559 │ │ │ │ -_5_6_1 smart_value_type _o_p_e_r_a_t_o_r_*() const { │ │ │ │ -562#ifndef NDEBUG │ │ │ │ -563 assert(this->heh_.is_valid()); │ │ │ │ -564 value_type res = (GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this- │ │ │ │ ->mesh_, this->heh_)); │ │ │ │ -565 assert(res.is_valid()); │ │ │ │ -566 return _m_a_k_e___s_m_a_r_t(res, this->mesh_); │ │ │ │ -567#else │ │ │ │ -568 return _m_a_k_e___s_m_a_r_t(GenericCirculatorT_DEPRECATED_TraitsT::toHandle(this- │ │ │ │ ->mesh_, this->heh_), this->mesh_); │ │ │ │ -569#endif │ │ │ │ -570 } │ │ │ │ -571 │ │ │ │ -_5_8_0 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ -581 pointer_deref_value = **this; │ │ │ │ -582 return &pointer_deref_value; │ │ │ │ -583 } │ │ │ │ -584 │ │ │ │ -585 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D &operator=(const │ │ │ │ -_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D &rhs) { │ │ │ │ -586 _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T_<_M_e_s_h_>_:_:_o_p_e_r_a_t_o_r_=(rhs); │ │ │ │ -587 return *this; │ │ │ │ -588 }; │ │ │ │ -589 │ │ │ │ -590 bool operator==(const GenericCirculatorT_DEPRECATED &rhs) const { │ │ │ │ -591 return GenericCirculatorBaseT::operator==(rhs); │ │ │ │ -592 } │ │ │ │ -593 │ │ │ │ -594 bool operator!=(const GenericCirculatorT_DEPRECATED &rhs) const { │ │ │ │ -595 return GenericCirculatorBaseT::operator!=(rhs); │ │ │ │ -596 } │ │ │ │ -597 │ │ │ │ -598 bool is_valid() const { │ │ │ │ -599 return GenericCirculator_ValueHandleFns::is_valid(this->heh_,this->start_, │ │ │ │ -this->lap_counter_); │ │ │ │ -600 } │ │ │ │ -601 │ │ │ │ -602 OM_DEPRECATED("current_halfedge_handle() is an implementation detail and │ │ │ │ -should not be accessed from outside the iterator class.") │ │ │ │ -_6_0_8 const typename Mesh::_H_a_l_f_e_d_g_e_H_a_n_d_l_e &_c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e() const { │ │ │ │ -609 return this->heh_; │ │ │ │ -610 } │ │ │ │ -611 │ │ │ │ -612 OM_DEPRECATED("Do not use this error prone implicit cast. Compare to end- │ │ │ │ -iterator or use is_valid(), instead.") │ │ │ │ -_6_1_8 operator bool() const { │ │ │ │ -619 return is_valid(); │ │ │ │ -620 } │ │ │ │ -621 │ │ │ │ -627 OM_DEPRECATED("This function clutters your code. Use dereferencing │ │ │ │ -operators -> and * instead.") │ │ │ │ -_6_2_8 smart_value_type _h_a_n_d_l_e() const { │ │ │ │ -629 return **this; │ │ │ │ -630 } │ │ │ │ -631 │ │ │ │ -638 OM_DEPRECATED("Implicit casts of iterators are unsafe. Use dereferencing │ │ │ │ -operators -> and * instead.") │ │ │ │ -_6_3_9 operator value_type() const { │ │ │ │ -640 return **this; │ │ │ │ -641 } │ │ │ │ -642 │ │ │ │ -643 template │ │ │ │ -644 friend STREAM &operator<< (STREAM &s, const _G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ -&self) { │ │ │ │ -645 return s << self.mesh_ << ", " << self.start_.idx() << ", " << │ │ │ │ -self.heh_.idx() << ", " << self.lap_counter_; │ │ │ │ -646 } │ │ │ │ -647 │ │ │ │ -648 private: │ │ │ │ -649 mutable smart_value_type pointer_deref_value; │ │ │ │ -650}; │ │ │ │ -651 │ │ │ │ -652} // namespace Iterators │ │ │ │ -653} // namespace OpenMesh │ │ │ │ -654 │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +70// │ │ │ │ +============================================================================= │ │ │ │ +71} // namespace OpenMesh │ │ │ │ +72// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ -SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ -Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ -Generic class for iterator ranges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___C_e_n_t_e_r_E_n_t_i_t_y_F_n_s_T │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:69 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___D_e_r_e_f_e_r_e_n_c_i_a_b_i_l_i_t_y_C_h_e_c_k_T │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:145 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:175 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_B_a_s_e_T │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:240 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:305 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -smart_value_type operator*() const │ │ │ │ -Standard dereferencing operator. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:372 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ -GenericCirculatorT operator++(int) │ │ │ │ -Post-increment. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:356 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ -GenericCirculatorT operator--(int) │ │ │ │ -Post-decrement. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:364 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ -pointer operator->() const │ │ │ │ -Pointer dereferentiation. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:391 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r___V_a_l_u_e_H_a_n_d_l_e_F_n_s_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:444 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:483 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ -GenericCirculatorT_DEPRECATED operator++(int) │ │ │ │ -Post-increment. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:541 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ -const Mesh::HalfedgeHandle & current_halfedge_handle() const │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:608 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ -pointer operator->() const │ │ │ │ -Pointer dereferentiation. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:580 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ -GenericCirculatorT_DEPRECATED operator--(int) │ │ │ │ -Post-decrement. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:553 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -smart_value_type operator*() const │ │ │ │ -Standard dereferencing operator. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:561 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_I_t_e_r_a_t_o_r_s_:_:_G_e_n_e_r_i_c_C_i_r_c_u_l_a_t_o_r_T___D_E_P_R_E_C_A_T_E_D_:_:_h_a_n_d_l_e │ │ │ │ -smart_value_type handle() const │ │ │ │ -Return the handle of the current target. │ │ │ │ -DDeeffiinniittiioonn CirculatorsT.hh:628 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Kernel::VertexHandle VertexHandle │ │ │ │ -Handle for referencing the corresponding item. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::EdgeHandle EdgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Kernel::FaceHandle FaceHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00686_source.html │ │ │ @@ -22,9469 +22,486 @@ │ │ │ 00000150: 656e 743d 2244 6f78 7967 656e 2031 2e39 ent="Doxygen 1.9 │ │ │ 00000160: 2e38 222f 3e0a 3c6d 6574 6120 6e61 6d65 .8"/>..OpenMesh: Ope │ │ │ -000001c0: 6e4d 6573 682f 436f 7265 2f4d 6573 682f nMesh/Core/Mesh/ │ │ │ -000001d0: 4172 7261 794b 6572 6e65 6c2e 6868 2053 ArrayKernel.hh S │ │ │ -000001e0: 6f75 7263 6520 4669 6c65 3c2f 7469 746c ource File.... │ │ │ -00000390: 3c6c 696e 6b20 6872 6566 3d22 7365 6172 .....
....< │ │ │ -00000c30: 6469 7620 6964 3d22 4d53 6561 7263 6853 div id="MSearchS │ │ │ -00000c40: 656c 6563 7457 696e 646f 7722 0a20 2020 electWindow". │ │ │ -00000c50: 2020 6f6e 6d6f 7573 656f 7665 723d 2272 onmouseover="r │ │ │ -00000c60: 6574 7572 6e20 7365 6172 6368 426f 782e eturn searchBox. │ │ │ -00000c70: 4f6e 5365 6172 6368 5365 6c65 6374 5368 OnSearchSelectSh │ │ │ -00000c80: 6f77 2829 220a 2020 2020 206f 6e6d 6f75 ow()". onmou │ │ │ -00000c90: 7365 6f75 743d 2272 6574 7572 6e20 7365 seout="return se │ │ │ -00000ca0: 6172 6368 426f 782e 4f6e 5365 6172 6368 archBox.OnSearch │ │ │ -00000cb0: 5365 6c65 6374 4869 6465 2829 220a 2020 SelectHide()". │ │ │ -00000cc0: 2020 206f 6e6b 6579 646f 776e 3d22 7265 onkeydown="re │ │ │ -00000cd0: 7475 726e 2073 6561 7263 6842 6f78 2e4f turn searchBox.O │ │ │ -00000ce0: 6e53 6561 7263 6853 656c 6563 744b 6579 nSearchSelectKey │ │ │ -00000cf0: 2865 7665 6e74 2922 3e0a 3c2f 6469 763e (event)">.
│ │ │ -00000d00: 0a0a 3c21 2d2d 2069 6672 616d 6520 7368 .. │ │ │ -00000d40: 0a3c 6469 7620 6964 3d22 4d53 6561 7263 .
│ │ │ -00000d60: 0a3c 6469 7620 6964 3d22 4d53 6561 7263 .
.
. │ │ │ -00000d90: 3c64 6976 2069 643d 2253 5249 6e64 6578
.
.Loading...
.
Searching │ │ │ -00000e20: 2e2e 2e3c 2f64 6976 3e0a 3c64 6976 2063 ...
.
N │ │ │ -00000e50: 6f20 4d61 7463 6865 733c 2f64 6976 3e0a o Matches
. │ │ │ -00000e60: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c2f
.
..
...
│ │ │ -00000ec0: 4172 7261 794b 6572 6e65 6c2e 6868 3c2f ArrayKernel.hh
.
.< │ │ │ -00000ef0: 6469 7620 636c 6173 733d 2263 6f6e 7465 div class="conte │ │ │ -00000f00: 6e74 7322 3e0a 3c64 6976 2063 6c61 7373 nts">.
< │ │ │ -00000f50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00000f60: 6e6f 223e 2020 2020 313c 2f73 7061 6e3e no"> 1 │ │ │ -00000f70: 3c73 7061 6e20 636c 6173 733d 2263 6f6d /* ======= │ │ │ -00000f90: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00000fa0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00000fb0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00000fc0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00000fd0: 3d3d 202a 3c2f 7370 616e 3e3c 2f64 6976 == *
.
2< │ │ │ -00001030: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> * │ │ │ -00001050: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001060: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001070: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001080: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001090: 2020 2020 2020 2020 202a 3c2f 7370 616e *
.
│ │ │ -000010f0: 2020 2020 333c 2f73 7061 6e3e 3c73 7061 3 * │ │ │ -00001120: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001130: 2020 204f 7065 6e4d 6573 6820 2020 2020 OpenMesh │ │ │ -00001140: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001150: 2020 2020 2020 2020 2020 2020 2020 202a * │ │ │ -00001160: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00001180: 3c61 2069 643d 226c 3030 3030 3422 206e 4 * │ │ │ -000011e0: 2020 2020 2043 6f70 7972 6967 6874 2028 Copyright ( │ │ │ -000011f0: 6329 2032 3030 312d 3230 3235 2c20 5257 c) 2001-2025, RW │ │ │ -00001200: 5448 2d41 6163 6865 6e20 556e 6976 6572 TH-Aachen Univer │ │ │ -00001210: 7369 7479 2020 2020 2020 2020 2020 2020 sity │ │ │ -00001220: 2020 2020 202a 3c2f 7370 616e 3e3c 2f64 *.
│ │ │ -00001280: 353c 2f73 7061 6e3e 3c73 7061 6e20 636c 5 * │ │ │ -000012a0: 2020 2020 2020 2020 2020 2044 6570 6172 Depar │ │ │ -000012b0: 746d 656e 7420 6f66 2043 6f6d 7075 7465 tment of Compute │ │ │ -000012c0: 7220 4772 6170 6869 6373 2061 6e64 204d r Graphics and M │ │ │ -000012d0: 756c 7469 6d65 6469 6120 2020 2020 2020 ultimedia │ │ │ -000012e0: 2020 2020 2020 2020 2020 202a 3c2f 7370 *
.
6 * │ │ │ -00001370: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001380: 416c 6c20 7269 6768 7473 2072 6573 6572 All rights reser │ │ │ -00001390: 7665 642e 2020 2020 2020 2020 2020 2020 ved. │ │ │ -000013a0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000013b0: 202a 3c2f 7370 616e 3e3c 2f64 6976 3e0a *
. │ │ │ -000013c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -000013f0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 7 * │ │ │ -00001430: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001440: 2020 2020 2020 2020 7777 772e 6f70 656e www.open │ │ │ -00001450: 6d65 7368 2e6f 7267 2020 2020 2020 2020 mesh.org │ │ │ -00001460: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001470: 2020 2020 2020 202a 3c2f 7370 616e 3e3c *< │ │ │ -00001480: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -000014d0: 2020 383c 2f73 7061 6e3e 3c73 7061 6e20 8 │ │ │ -000014f0: 202a 2020 2020 2020 2020 2020 2020 2020 * │ │ │ -00001500: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001510: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001520: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001530: 2020 2020 2020 2020 2020 2020 202a 3c2f *
.
< │ │ │ -00001580: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00001590: 6e6f 223e 2020 2020 393c 2f73 7061 6e3e no"> 9 │ │ │ -000015a0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d *-------- │ │ │ -000015c0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -000015d0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -000015e0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -000015f0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00001600: 2d2d 2d2a 3c2f 7370 616e 3e3c 2f64 6976 ---*
.
10< │ │ │ -00001660: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> * T │ │ │ -00001680: 6869 7320 6669 6c65 2069 7320 7061 7274 his file is part │ │ │ -00001690: 206f 6620 4f70 656e 4d65 7368 2e20 2020 of OpenMesh. │ │ │ -000016a0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000016b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000016c0: 2020 2020 2020 2020 202a 3c2f 7370 616e *
.
│ │ │ -00001720: 2020 2031 313c 2f73 7061 6e3e 3c73 7061 11 *------------ │ │ │ -00001750: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00001760: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00001770: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00001780: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2a ---------------* │ │ │ -00001790: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -000017b0: 3c61 2069 643d 226c 3030 3031 3222 206e 12 * │ │ │ -00001810: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001820: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001830: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001840: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001850: 2020 2020 202a 3c2f 7370 616e 3e3c 2f64 *.
1 │ │ │ -000018b0: 333c 2f73 7061 6e3e 3c73 7061 6e20 636c 3 * │ │ │ -000018d0: 2052 6564 6973 7472 6962 7574 696f 6e20 Redistribution │ │ │ -000018e0: 616e 6420 7573 6520 696e 2073 6f75 7263 and use in sourc │ │ │ -000018f0: 6520 616e 6420 6269 6e61 7279 2066 6f72 e and binary for │ │ │ -00001900: 6d73 2c20 7769 7468 206f 7220 7769 7468 ms, with or with │ │ │ -00001910: 6f75 7420 2020 2020 2020 202a 3c2f 7370 out *
.
14 * modificat │ │ │ -000019a0: 696f 6e2c 2061 7265 2070 6572 6d69 7474 ion, are permitt │ │ │ -000019b0: 6564 2070 726f 7669 6465 6420 7468 6174 ed provided that │ │ │ -000019c0: 2074 6865 2066 6f6c 6c6f 7769 6e67 2063 the following c │ │ │ -000019d0: 6f6e 6469 7469 6f6e 7320 2020 2020 2020 onditions │ │ │ -000019e0: 202a 3c2f 7370 616e 3e3c 2f64 6976 3e0a *
. │ │ │ -000019f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -00001a20: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 15 * are │ │ │ -00001a60: 206d 6574 3a20 2020 2020 2020 2020 2020 met: │ │ │ -00001a70: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001a80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001a90: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001aa0: 2020 2020 2020 202a 3c2f 7370 616e 3e3c *< │ │ │ -00001ab0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00001b00: 2031 363c 2f73 7061 6e3e 3c73 7061 6e20 16 │ │ │ -00001b20: 202a 2020 2020 2020 2020 2020 2020 2020 * │ │ │ -00001b30: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001b40: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001b50: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001b60: 2020 2020 2020 2020 2020 2020 202a 3c2f *
.
< │ │ │ -00001bb0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00001bc0: 6e6f 223e 2020 2031 373c 2f73 7061 6e3e no"> 17 │ │ │ -00001bd0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d * 1. Redi │ │ │ -00001bf0: 7374 7269 6275 7469 6f6e 7320 6f66 2073 stributions of s │ │ │ -00001c00: 6f75 7263 6520 636f 6465 206d 7573 7420 ource code must │ │ │ -00001c10: 7265 7461 696e 2074 6865 2061 626f 7665 retain the above │ │ │ -00001c20: 2063 6f70 7972 6967 6874 206e 6f74 6963 copyright notic │ │ │ -00001c30: 652c 202a 3c2f 7370 616e 3e3c 2f64 6976 e, *
.
18< │ │ │ -00001c90: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> * │ │ │ -00001cb0: 2020 7468 6973 206c 6973 7420 6f66 2063 this list of c │ │ │ -00001cc0: 6f6e 6469 7469 6f6e 7320 616e 6420 7468 onditions and th │ │ │ -00001cd0: 6520 666f 6c6c 6f77 696e 6720 6469 7363 e following disc │ │ │ -00001ce0: 6c61 696d 6572 2e20 2020 2020 2020 2020 laimer. │ │ │ -00001cf0: 2020 2020 2020 2020 202a 3c2f 7370 616e *
.
│ │ │ -00001d50: 2020 2031 393c 2f73 7061 6e3e 3c73 7061 19 * │ │ │ -00001d80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001d90: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001da0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00001db0: 2020 2020 2020 2020 2020 2020 2020 202a * │ │ │ -00001dc0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00001de0: 3c61 2069 643d 226c 3030 3032 3022 206e 20 * 2. Re │ │ │ -00001e40: 6469 7374 7269 6275 7469 6f6e 7320 696e distributions in │ │ │ -00001e50: 2062 696e 6172 7920 666f 726d 206d 7573 binary form mus │ │ │ -00001e60: 7420 7265 7072 6f64 7563 6520 7468 6520 t reproduce the │ │ │ -00001e70: 6162 6f76 6520 636f 7079 7269 6768 7420 above copyright │ │ │ -00001e80: 2020 2020 202a 3c2f 7370 616e 3e3c 2f64 *.
2 │ │ │ -00001ee0: 313c 2f73 7061 6e3e 3c73 7061 6e20 636c 1 * │ │ │ -00001f00: 2020 2020 6e6f 7469 6365 2c20 7468 6973 notice, this │ │ │ -00001f10: 206c 6973 7420 6f66 2063 6f6e 6469 7469 list of conditi │ │ │ -00001f20: 6f6e 7320 616e 6420 7468 6520 666f 6c6c ons and the foll │ │ │ -00001f30: 6f77 696e 6720 6469 7363 6c61 696d 6572 owing disclaimer │ │ │ -00001f40: 2069 6e20 7468 6520 2020 202a 3c2f 7370 in the *
.
22 * docume │ │ │ -00001fd0: 6e74 6174 696f 6e20 616e 642f 6f72 206f ntation and/or o │ │ │ -00001fe0: 7468 6572 206d 6174 6572 6961 6c73 2070 ther materials p │ │ │ -00001ff0: 726f 7669 6465 6420 7769 7468 2074 6865 rovided with the │ │ │ -00002000: 2064 6973 7472 6962 7574 696f 6e2e 2020 distribution. │ │ │ -00002010: 202a 3c2f 7370 616e 3e3c 2f64 6976 3e0a *
. │ │ │ -00002020: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -00002050: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 23 * │ │ │ -00002090: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000020a0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000020b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000020c0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000020d0: 2020 2020 2020 202a 3c2f 7370 616e 3e3c *< │ │ │ -000020e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00002130: 2032 343c 2f73 7061 6e3e 3c73 7061 6e20 24 │ │ │ -00002150: 202a 2033 2e20 4e65 6974 6865 7220 7468 * 3. Neither th │ │ │ -00002160: 6520 6e61 6d65 206f 6620 7468 6520 636f e name of the co │ │ │ -00002170: 7079 7269 6768 7420 686f 6c64 6572 206e pyright holder n │ │ │ -00002180: 6f72 2074 6865 206e 616d 6573 206f 6620 or the names of │ │ │ -00002190: 6974 7320 2020 2020 2020 2020 202a 3c2f its *
.
< │ │ │ -000021e0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -000021f0: 6e6f 223e 2020 2032 353c 2f73 7061 6e3e no"> 25 │ │ │ -00002200: 3c73 7061 6e20 636c 6173 733d 2263 6f6d * cont │ │ │ -00002220: 7269 6275 746f 7273 206d 6179 2062 6520 ributors may be │ │ │ -00002230: 7573 6564 2074 6f20 656e 646f 7273 6520 used to endorse │ │ │ -00002240: 6f72 2070 726f 6d6f 7465 2070 726f 6475 or promote produ │ │ │ -00002250: 6374 7320 6465 7269 7665 6420 6672 6f6d cts derived from │ │ │ -00002260: 2020 202a 3c2f 7370 616e 3e3c 2f64 6976 *
.
26< │ │ │ -000022c0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> * │ │ │ -000022e0: 2020 7468 6973 2073 6f66 7477 6172 6520 this software │ │ │ -000022f0: 7769 7468 6f75 7420 7370 6563 6966 6963 without specific │ │ │ -00002300: 2070 7269 6f72 2077 7269 7474 656e 2070 prior written p │ │ │ -00002310: 6572 6d69 7373 696f 6e2e 2020 2020 2020 ermission. │ │ │ -00002320: 2020 2020 2020 2020 202a 3c2f 7370 616e *
.
│ │ │ -00002380: 2020 2032 373c 2f73 7061 6e3e 3c73 7061 27 * │ │ │ -000023b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000023c0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000023d0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000023e0: 2020 2020 2020 2020 2020 2020 2020 202a * │ │ │ -000023f0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00002410: 3c61 2069 643d 226c 3030 3032 3822 206e 28 * THIS │ │ │ -00002470: 534f 4654 5741 5245 2049 5320 5052 4f56 SOFTWARE IS PROV │ │ │ -00002480: 4944 4544 2042 5920 5448 4520 434f 5059 IDED BY THE COPY │ │ │ -00002490: 5249 4748 5420 484f 4c44 4552 5320 414e RIGHT HOLDERS AN │ │ │ -000024a0: 4420 434f 4e54 5249 4255 544f 5253 2020 D CONTRIBUTORS │ │ │ -000024b0: 2020 2020 202a 3c2f 7370 616e 3e3c 2f64 *.
2 │ │ │ -00002510: 393c 2f73 7061 6e3e 3c73 7061 6e20 636c 9 * │ │ │ -00002530: 2026 7175 6f74 3b41 5320 4953 2671 756f "AS IS&quo │ │ │ -00002540: 743b 2041 4e44 2041 4e59 2045 5850 5245 t; AND ANY EXPRE │ │ │ -00002550: 5353 204f 5220 494d 504c 4945 4420 5741 SS OR IMPLIED WA │ │ │ -00002560: 5252 414e 5449 4553 2c20 494e 434c 5544 RRANTIES, INCLUD │ │ │ -00002570: 494e 472c 2042 5554 204e 4f54 204c 494d ING, BUT NOT LIM │ │ │ -00002580: 4954 4544 202a 3c2f 7370 616e 3e3c 2f64 ITED *.
3 │ │ │ -000025e0: 303c 2f73 7061 6e3e 3c73 7061 6e20 636c 0 * │ │ │ -00002600: 2054 4f2c 2054 4845 2049 4d50 4c49 4544 TO, THE IMPLIED │ │ │ -00002610: 2057 4152 5241 4e54 4945 5320 4f46 204d WARRANTIES OF M │ │ │ -00002620: 4552 4348 414e 5441 4249 4c49 5459 2041 ERCHANTABILITY A │ │ │ -00002630: 4e44 2046 4954 4e45 5353 2046 4f52 2041 ND FITNESS FOR A │ │ │ -00002640: 2020 2020 2020 2020 2020 202a 3c2f 7370 *
.
31 * PARTICULA │ │ │ -000026d0: 5220 5055 5250 4f53 4520 4152 4520 4449 R PURPOSE ARE DI │ │ │ -000026e0: 5343 4c41 494d 4544 2e20 494e 204e 4f20 SCLAIMED. IN NO │ │ │ -000026f0: 4556 454e 5420 5348 414c 4c20 5448 4520 EVENT SHALL THE │ │ │ -00002700: 434f 5059 5249 4748 5420 484f 4c44 4552 COPYRIGHT HOLDER │ │ │ -00002710: 202a 3c2f 7370 616e 3e3c 2f64 6976 3e0a *
. │ │ │ -00002720: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -00002750: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 32 * OR │ │ │ -00002790: 434f 4e54 5249 4255 544f 5253 2042 4520 CONTRIBUTORS BE │ │ │ -000027a0: 4c49 4142 4c45 2046 4f52 2041 4e59 2044 LIABLE FOR ANY D │ │ │ -000027b0: 4952 4543 542c 2049 4e44 4952 4543 542c IRECT, INDIRECT, │ │ │ -000027c0: 2049 4e43 4944 454e 5441 4c2c 2053 5045 INCIDENTAL, SPE │ │ │ -000027d0: 4349 414c 2c20 202a 3c2f 7370 616e 3e3c CIAL, *< │ │ │ -000027e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00002830: 2033 333c 2f73 7061 6e3e 3c73 7061 6e20 33 │ │ │ -00002850: 202a 2045 5845 4d50 4c41 5259 2c20 4f52 * EXEMPLARY, OR │ │ │ -00002860: 2043 4f4e 5345 5155 454e 5449 414c 2044 CONSEQUENTIAL D │ │ │ -00002870: 414d 4147 4553 2028 494e 434c 5544 494e AMAGES (INCLUDIN │ │ │ -00002880: 472c 2042 5554 204e 4f54 204c 494d 4954 G, BUT NOT LIMIT │ │ │ -00002890: 4544 2054 4f2c 2020 2020 2020 202a 3c2f ED TO, *
.
< │ │ │ -000028e0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -000028f0: 6e6f 223e 2020 2033 343c 2f73 7061 6e3e no"> 34 │ │ │ -00002900: 3c73 7061 6e20 636c 6173 733d 2263 6f6d * PROCURE │ │ │ -00002920: 4d45 4e54 204f 4620 5355 4253 5449 5455 MENT OF SUBSTITU │ │ │ -00002930: 5445 2047 4f4f 4453 204f 5220 5345 5256 TE GOODS OR SERV │ │ │ -00002940: 4943 4553 3b20 4c4f 5353 204f 4620 5553 ICES; LOSS OF US │ │ │ -00002950: 452c 2044 4154 412c 204f 5220 2020 2020 E, DATA, OR │ │ │ -00002960: 2020 202a 3c2f 7370 616e 3e3c 2f64 6976 *
.
35< │ │ │ -000029c0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> * P │ │ │ -000029e0: 524f 4649 5453 3b20 4f52 2042 5553 494e ROFITS; OR BUSIN │ │ │ -000029f0: 4553 5320 494e 5445 5252 5550 5449 4f4e ESS INTERRUPTION │ │ │ -00002a00: 2920 484f 5745 5645 5220 4341 5553 4544 ) HOWEVER CAUSED │ │ │ -00002a10: 2041 4e44 204f 4e20 414e 5920 5448 454f AND ON ANY THEO │ │ │ -00002a20: 5259 204f 4620 2020 202a 3c2f 7370 616e RY OF *
.
│ │ │ -00002a80: 2020 2033 363c 2f73 7061 6e3e 3c73 7061 36 * LIABILITY, │ │ │ -00002ab0: 5748 4554 4845 5220 494e 2043 4f4e 5452 WHETHER IN CONTR │ │ │ -00002ac0: 4143 542c 2053 5452 4943 5420 4c49 4142 ACT, STRICT LIAB │ │ │ -00002ad0: 494c 4954 592c 204f 5220 544f 5254 2028 ILITY, OR TORT ( │ │ │ -00002ae0: 494e 434c 5544 494e 4720 2020 2020 202a INCLUDING * │ │ │ -00002af0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00002b10: 3c61 2069 643d 226c 3030 3033 3722 206e 37 * NEGLI │ │ │ -00002b70: 4745 4e43 4520 4f52 204f 5448 4552 5749 GENCE OR OTHERWI │ │ │ -00002b80: 5345 2920 4152 4953 494e 4720 494e 2041 SE) ARISING IN A │ │ │ -00002b90: 4e59 2057 4159 204f 5554 204f 4620 5448 NY WAY OUT OF TH │ │ │ -00002ba0: 4520 5553 4520 4f46 2054 4849 5320 2020 E USE OF THIS │ │ │ -00002bb0: 2020 2020 202a 3c2f 7370 616e 3e3c 2f64 *.
3 │ │ │ -00002c10: 383c 2f73 7061 6e3e 3c73 7061 6e20 636c 8 * │ │ │ -00002c30: 2053 4f46 5457 4152 452c 2045 5645 4e20 SOFTWARE, EVEN │ │ │ -00002c40: 4946 2041 4456 4953 4544 204f 4620 5448 IF ADVISED OF TH │ │ │ -00002c50: 4520 504f 5353 4942 494c 4954 5920 4f46 E POSSIBILITY OF │ │ │ -00002c60: 2053 5543 4820 4441 4d41 4745 2e20 2020 SUCH DAMAGE. │ │ │ -00002c70: 2020 2020 2020 2020 2020 202a 3c2f 7370 *
.
39 * │ │ │ -00002d00: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00002d10: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00002d20: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00002d30: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00002d40: 202a 3c2f 7370 616e 3e3c 2f64 6976 3e0a *
. │ │ │ -00002d50: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
│ │ │ -00002e60: 2020 3431 3c2f 7370 616e 3e20 3c2f 6469 41 .
42 │ │ │ -00002ec0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -00002ed0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00002ee0: 3e3c 6120 6964 3d22 6c30 3030 3433 2220 > 43
.
44 │ │ │ -00002f80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00002fd0: 2020 3435 3c2f 7370 616e 3e3c 7370 616e 45//============= │ │ │ -00003000: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003010: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003020: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003030: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003040: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00003060: 3c61 2069 643d 226c 3030 3034 3622 206e 46//
.
│ │ │ -00003110: 2020 2034 373c 2f73 7061 6e3e 3c73 7061 47// CLASS Arra │ │ │ -00003140: 794b 6572 6e65 6c3c 2f73 7061 6e3e 3c2f yKernel.
│ │ │ -000031a0: 3438 3c2f 7370 616e 3e3c 7370 616e 2063 48/ │ │ │ -000031c0: 2f3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c /
.< │ │ │ -000031d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000031e0: 3e3c 6120 6964 3d22 6c30 3030 3439 2220 > 49//===== │ │ │ -00003240: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003250: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003260: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003270: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003280: 3d3d 3d3d 3d3d 3d3d 3c2f 7370 616e 3e3c ========< │ │ │ -00003290: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -000032e0: 2035 303c 2f73 7061 6e3e 203c 2f64 6976 50
.
51< │ │ │ -00003340: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00003360: 3c61 2069 643d 226c 3030 3035 3222 206e 52
#if │ │ │ -000033c0: 6e64 6566 204f 5045 4e4d 4553 485f 4152 ndef OPENMESH_AR │ │ │ -000033d0: 5241 595f 4b45 524e 454c 5f48 483c 2f73 RAY_KERNEL_HH
.
53< │ │ │ -00003440: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ -00003450: 726f 6365 7373 6f72 223e 2364 6566 696e rocessor">#defin │ │ │ -00003460: 6520 4f50 454e 4d45 5348 5f41 5252 4159 e OPENMESH_ARRAY │ │ │ -00003470: 5f4b 4552 4e45 4c5f 4848 3c2f 7370 616e _KERNEL_HH
.
│ │ │ -000034d0: 2020 2035 343c 2f73 7061 6e3e 203c 2f64 54 .
5 │ │ │ -00003530: 353c 2f73 7061 6e3e 203c 2f64 6976 3e0a 5
. │ │ │ -00003540: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ -00003650: 2020 3537 3c2f 7370 616e 3e3c 7370 616e 57#include & │ │ │ -00003680: 6c74 3b76 6563 746f 7226 6774 3b3c 2f73 lt;vector>
.
58 │ │ │ -000036f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00003740: 2020 3539 3c2f 7370 616e 3e3c 7370 616e 59#include & │ │ │ -00003770: 6c74 3b4f 7065 6e4d 6573 682f 436f 7265 lt;OpenMesh/Core │ │ │ -00003780: 2f53 7973 7465 6d2f 636f 6e66 6967 2e68 /System/config.h │ │ │ -00003790: 2667 743b 3c2f 7370 616e 3e3c 2f64 6976 >
.
60< │ │ │ -000037f0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#include <Op │ │ │ -00003820: 656e 4d65 7368 2f43 6f72 652f 5574 696c enMesh/Core/Util │ │ │ -00003830: 732f 4765 6e50 726f 672e 6868 2667 743b s/GenProg.hh> │ │ │ -00003840: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00003860: 3c61 2069 643d 226c 3030 3036 3122 206e 61
.
62#includ │ │ │ -00003920: 6520 266c 743b 4f70 656e 4d65 7368 2f43 e <OpenMesh/C │ │ │ -00003930: 6f72 652f 4d65 7368 2f41 7272 6179 4974 ore/Mesh/ArrayIt │ │ │ -00003940: 656d 732e 6868 2667 743b 3c2f 7370 616e ems.hh>
.
│ │ │ -000039a0: 2020 2036 333c 2f73 7061 6e3e 3c73 7061 63#include │ │ │ -000039d0: 266c 743b 4f70 656e 4d65 7368 2f43 6f72 <OpenMesh/Cor │ │ │ -000039e0: 652f 4d65 7368 2f42 6173 654b 6572 6e65 e/Mesh/BaseKerne │ │ │ -000039f0: 6c2e 6868 2667 743b 3c2f 7370 616e 3e3c l.hh>< │ │ │ -00003a00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00003a50: 2036 343c 2f73 7061 6e3e 3c73 7061 6e20 64#include &l │ │ │ -00003a80: 743b 4f70 656e 4d65 7368 2f43 6f72 652f t;OpenMesh/Core/ │ │ │ -00003a90: 4d65 7368 2f53 7461 7475 732e 6868 2667 Mesh/Status.hh&g │ │ │ -00003aa0: 743b 3c2f 7370 616e 3e3c 2f64 6976 3e0a t;
. │ │ │ -00003ab0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -00003b40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00003b50: 6e6f 223e 2020 2036 363c 2f73 7061 6e3e no"> 66 │ │ │ -00003b60: 3c73 7061 6e20 636c 6173 733d 2263 6f6d //== NAMES │ │ │ -00003b80: 5041 4345 5320 3d3d 3d3d 3d3d 3d3d 3d3d PACES ========== │ │ │ -00003b90: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003ba0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003bb0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003bc0: 3d3d 3d3d 3d3c 2f73 7061 6e3e 3c2f 6469 =====.
67 │ │ │ -00003c20: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 nam │ │ │ -00003c40: 6573 7061 6365 203c 2f73 7061 6e3e 3c61 espace Op │ │ │ -00003c80: 656e 4d65 7368 3c2f 613e 207b 3c2f 6469 enMesh {.
68 │ │ │ -00003ce0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -00003cf0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00003d00: 3e3c 6120 6964 3d22 6c30 3030 3639 2220 > 69
.
70< │ │ │ -00003da0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ -00003db0: 656e 7422 3e2f 2f3d 3d20 434c 4153 5320 ent">//== CLASS │ │ │ -00003dc0: 4445 4649 4e49 5449 4f4e 203d 3d3d 3d3d DEFINITION ===== │ │ │ -00003dd0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003de0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003df0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00003e00: 3d3d 3d3d 3c2f 7370 616e 3e3c 2f64 6976 ====
.
.
87class │ │ │ -00003ef0: 3c2f 7370 616e 3e4f 5045 4e4d 4553 4844 OPENMESHD │ │ │ -00003f00: 4c4c 4558 504f 5254 203c 6120 636c 6173 LLEXPORT ArrayKernel │ │ │ -00003f40: 3c2f 613e 203a 203c 7370 616e 2063 6c61 : pub │ │ │ -00003f60: 6c69 633c 2f73 7061 6e3e 203c 6120 636c lic BaseKerne │ │ │ -00003fa0: 6c3c 2f61 3e2c 203c 7370 616e 2063 6c61 l, pub │ │ │ -00003fc0: 6c69 633c 2f73 7061 6e3e 2041 7272 6179 lic Array │ │ │ -00003fd0: 4974 656d 733c 2f64 6976 3e0a 3c64 6976 Items
.
< │ │ │ -00004010: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00004020: 6e6f 223e 2020 2038 383c 2f73 7061 6e3e no"> 88 │ │ │ -00004030: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ -00004080: 2020 2038 393c 2f73 7061 6e3e 3c73 7061 89public: │ │ │ -000040b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00004100: 2020 3930 3c2f 7370 616e 3e20 3c2f 6469 90 .
91 │ │ │ -00004160: 3c2f 7370 616e 3e20 203c 7370 616e 2063 / │ │ │ -00004180: 2f20 6861 6e64 6c65 733c 2f73 7061 6e3e / handles │ │ │ -00004190: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000041e0: 2020 3932 3c2f 7370 616e 3e20 203c 7370 92 typedef O │ │ │ -00004240: 7065 6e4d 6573 683a 3a56 6572 7465 7848 penMesh::VertexH │ │ │ -00004250: 616e 646c 653c 2f61 3e20 2020 2020 2020 andle │ │ │ -00004260: 2020 2020 203c 6120 636c 6173 733d 2263 VertexHandle;
.
93 │ │ │ -00004300: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef OpenMesh::Half │ │ │ -00004360: 6564 6765 4861 6e64 6c65 3c2f 613e 2020 edgeHandle │ │ │ -00004370: 2020 2020 2020 2020 3c61 2063 6c61 7373 HalfedgeHan │ │ │ -000043b0: 646c 653c 2f61 3e3b 3c2f 6469 763e 0a3c dle;
.< │ │ │ -000043c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000043d0: 3e3c 6120 6964 3d22 6c30 3030 3934 2220 > 94 typed │ │ │ -00004430: 6566 3c2f 7370 616e 3e20 3c61 2063 6c61 ef OpenMesh: │ │ │ -00004470: 3a45 6467 6548 616e 646c 653c 2f61 3e20 :EdgeHandle │ │ │ -00004480: 2020 2020 2020 2020 2020 2020 203c 6120 EdgeHa │ │ │ -000044c0: 6e64 6c65 3c2f 613e 3b3c 2f64 6976 3e0a ndle;
. │ │ │ -000044d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 │ │ │ -000045e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .. │ │ │ -000046f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -00004720: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 97 type │ │ │ -00004760: 6465 663c 2f73 7061 6e3e 203c 6120 636c def VPropHan │ │ │ -000047a0: 646c 6554 266c 743b 5374 6174 7573 496e dleT<StatusIn │ │ │ -000047b0: 666f 2667 743b 3c2f 613e 2020 2020 2020 fo> │ │ │ -000047c0: 2020 2020 3c61 2063 6c61 7373 3d22 636f │ │ │ -000047f0: 5665 7274 6578 5374 6174 7573 5072 6f70 VertexStatusProp │ │ │ -00004800: 6572 7479 4861 6e64 6c65 3c2f 613e 3b3c ertyHandle;< │ │ │ -00004810: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.. │ │ │ -00004950: 3c61 2069 643d 226c 3030 3039 3922 206e 99 typede │ │ │ -000049b0: 663c 2f73 7061 6e3e 203c 6120 636c 6173 f EPropHandl │ │ │ -000049f0: 6554 266c 743b 5374 6174 7573 496e 666f eT<StatusInfo │ │ │ -00004a00: 2667 743b 3c2f 613e 2020 2020 2020 2020 > │ │ │ -00004a10: 2020 3c61 2063 6c61 7373 3d22 636f 6465 Ed │ │ │ -00004a40: 6765 5374 6174 7573 5072 6f70 6572 7479 geStatusProperty │ │ │ -00004a50: 4861 6e64 6c65 3c2f 613e 3b3c 2f64 6976 Handle;
.
100< │ │ │ -00004ab0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> ty │ │ │ -00004ad0: 7065 6465 663c 2f73 7061 6e3e 203c 6120 pedef FPropH │ │ │ -00004b10: 616e 646c 6554 266c 743b 5374 6174 7573 andleT<Status │ │ │ -00004b20: 496e 666f 2667 743b 3c2f 613e 2020 2020 Info> │ │ │ -00004b30: 2020 2020 2020 3c61 2063 6c61 7373 3d22 FaceStatusProp │ │ │ -00004b70: 6572 7479 4861 6e64 6c65 3c2f 613e 3b3c ertyHandle;< │ │ │ -00004b80: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00004bd0: 3130 313c 2f73 7061 6e3e 203c 2f64 6976 101
.
102< │ │ │ -00004c30: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>publ │ │ │ -00004c50: 6963 3c2f 7370 616e 3e3a 3c2f 6469 763e ic:
│ │ │ -00004c60: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -00004cd0: 6120 6964 3d22 6c30 3031 3034 2220 6e61 a id="l00104" na │ │ │ -00004ce0: 6d65 3d22 6c30 3031 3034 223e 3c2f 613e me="l00104"> │ │ │ -00004cf0: 3c73 7061 6e20 636c 6173 733d 226c 696e 104 // --- │ │ │ -00004d30: 636f 6e73 7472 7563 746f 722f 6465 7374 constructor/dest │ │ │ -00004d40: 7275 6374 6f72 202d 2d2d 3c2f 7370 616e ructor ---
.
│ │ │ -00004da0: 2020 3130 353c 2f73 7061 6e3e 2020 3c61 105 ArrayK │ │ │ -00004de0: 6572 6e65 6c3c 2f61 3e28 293b 3c2f 6469 ernel();.
106 │ │ │ -00004e40: 3c2f 7370 616e 3e20 203c 7370 616e 2063 v │ │ │ -00004e60: 6972 7475 616c 3c2f 7370 616e 3e20 3c61 irtual ~Array │ │ │ -00004ea0: 4b65 726e 656c 3c2f 613e 2829 3b3c 2f64 Kernel();.
10 │ │ │ -00004f00: 373c 2f73 7061 6e3e 203c 2f64 6976 3e0a 7
. │ │ │ -00004f10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -00004f40: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 114 │ │ │ -00004f80: 766f 6964 3c2f 7370 616e 3e20 6173 7369 void assi │ │ │ -00004f90: 676e 5f63 6f6e 6e65 6374 6976 6974 7928 gn_connectivity( │ │ │ -00004fa0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const A │ │ │ -00004ff0: 7272 6179 4b65 726e 656c 3c2f 613e 2661 rrayKernel&a │ │ │ -00005000: 6d70 3b20 5f6f 7468 6572 293b 3c2f 6469 mp; _other);.
115 │ │ │ -00005060: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -00005070: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00005080: 3e3c 6120 6964 3d22 6c30 3031 3136 2220 > 116 // -- │ │ │ -000050e0: 2d20 6861 6e64 6c65 202d 2667 743b 2069 - handle -> i │ │ │ -000050f0: 7465 6d20 2d2d 2d3c 2f73 7061 6e3e 3c2f tem ---.
1 │ │ │ -00005150: 3137 3c2f 7370 616e 3e20 203c 6120 636c 17 VertexHa │ │ │ -00005190: 6e64 6c65 3c2f 613e 2068 616e 646c 6528 ndle handle( │ │ │ -000051a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const Vertex& _ │ │ │ -000051d0: 7629 203c 7370 616e 2063 6c61 7373 3d22 v) const;
.< │ │ │ -00005210: 6120 6964 3d22 6c30 3031 3138 2220 6e61 a id="l00118" na │ │ │ -00005220: 6d65 3d22 6c30 3031 3138 223e 3c2f 613e me="l00118"> │ │ │ -00005230: 3c73 7061 6e20 636c 6173 733d 226c 696e 118
.
119 < │ │ │ -000052b0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -000052c0: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -000052d0: 3032 3536 362e 6874 6d6c 223e 4861 6c66 02566.html">Half │ │ │ -000052e0: 6564 6765 4861 6e64 6c65 3c2f 613e 2068 edgeHandle h │ │ │ -000052f0: 616e 646c 6528 3c73 7061 6e20 636c 6173 andle(cons │ │ │ -00005310: 743c 2f73 7061 6e3e 2048 616c 6665 6467 t Halfedg │ │ │ -00005320: 6526 616d 703b 205f 6865 2920 3c73 7061 e& _he) const;< │ │ │ -00005350: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -000053a0: 3132 303c 2f73 7061 6e3e 203c 2f64 6976 120
.
121< │ │ │ -00005400: 2f73 7061 6e3e 2020 3c61 2063 6c61 7373 /span> EdgeHandle< │ │ │ -00005440: 2f61 3e20 6861 6e64 6c65 283c 7370 616e /a> handle(const Ed │ │ │ -00005470: 6765 2661 6d70 3b20 5f65 2920 3c73 7061 ge& _e) const;< │ │ │ -000054a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -000054f0: 3132 323c 2f73 7061 6e3e 203c 2f64 6976 122
.
123< │ │ │ -00005550: 2f73 7061 6e3e 2020 3c61 2063 6c61 7373 /span> FaceHandle< │ │ │ -00005590: 2f61 3e20 6861 6e64 6c65 283c 7370 616e /a> handle(const Fa │ │ │ -000055c0: 6365 2661 6d70 3b20 5f66 2920 3c73 7061 ce& _f) const;< │ │ │ -000055f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00005640: 3132 343c 2f73 7061 6e3e 203c 2f64 6976 124
.
125< │ │ │ -000056a0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -000056c0: 3c61 2069 643d 226c 3030 3132 3722 206e 127 bo │ │ │ -00005720: 6f6c 3c2f 7370 616e 3e20 6973 5f76 616c ol is_val │ │ │ -00005730: 6964 5f68 616e 646c 6528 3c61 2063 6c61 id_handle(VertexHan │ │ │ -00005770: 646c 653c 2f61 3e20 5f76 6829 203c 7370 dle _vh) const; │ │ │ -000057a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000057f0: 2031 3238 3c2f 7370 616e 3e20 3c2f 6469 128 .
130 │ │ │ -00005850: 3c2f 7370 616e 3e20 203c 7370 616e 2063 bool i │ │ │ -00005880: 735f 7661 6c69 645f 6861 6e64 6c65 283c s_valid_handle(< │ │ │ -00005890: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -000058a0: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -000058b0: 3032 3536 362e 6874 6d6c 223e 4861 6c66 02566.html">Half │ │ │ -000058c0: 6564 6765 4861 6e64 6c65 3c2f 613e 205f edgeHandle _ │ │ │ -000058d0: 6865 6829 203c 7370 616e 2063 6c61 7373 heh) const │ │ │ -000058f0: 3c2f 7370 616e 3e3b 3c2f 6469 763e 0a3c ;
.< │ │ │ -00005900: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00005910: 3e3c 6120 6964 3d22 6c30 3031 3331 2220 > 131
.
133 │ │ │ -000059b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 bool< │ │ │ -000059d0: 2f73 7061 6e3e 2069 735f 7661 6c69 645f /span> is_valid_ │ │ │ -000059e0: 6861 6e64 6c65 283c 6120 636c 6173 733d handle(EdgeHandle _eh) co │ │ │ -00005a40: 6e73 743c 2f73 7061 6e3e 3b3c 2f64 6976 nst;
.
134< │ │ │ -00005aa0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00005ac0: 3c61 2069 643d 226c 3030 3133 3622 206e 136 bo │ │ │ -00005b20: 6f6c 3c2f 7370 616e 3e20 6973 5f76 616c ol is_val │ │ │ -00005b30: 6964 5f68 616e 646c 6528 3c61 2063 6c61 id_handle(FaceHandl │ │ │ -00005b70: 653c 2f61 3e20 5f66 6829 203c 7370 616e e _fh) const;.
1 │ │ │ -00005bf0: 3337 3c2f 7370 616e 3e20 3c2f 6469 763e 37
│ │ │ -00005c00: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -00005c70: 6120 6964 3d22 6c30 3031 3339 2220 6e61 a id="l00139" na │ │ │ -00005c80: 6d65 3d22 6c30 3031 3339 223e 3c2f 613e me="l00139"> │ │ │ -00005c90: 3c73 7061 6e20 636c 6173 733d 226c 696e 139 // --- │ │ │ -00005cd0: 6974 656d 202d 2667 743b 2068 616e 646c item -> handl │ │ │ -00005ce0: 6520 2d2d 2d3c 2f73 7061 6e3e 3c2f 6469 e ---.
140 │ │ │ -00005d40: 3c2f 7370 616e 3e20 203c 7370 616e 2063 c │ │ │ -00005d60: 6f6e 7374 3c2f 7370 616e 3e20 5665 7274 onst Vert │ │ │ -00005d70: 6578 2661 6d70 3b20 7665 7274 6578 283c ex& vertex(< │ │ │ -00005d80: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -00005d90: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -00005da0: 3032 3536 322e 6874 6d6c 223e 5665 7274 02562.html">Vert │ │ │ -00005db0: 6578 4861 6e64 6c65 3c2f 613e 205f 7668 exHandle _vh │ │ │ -00005dc0: 293c 7370 616e 2063 6c61 7373 3d22 6b65 ) const
.
141< │ │ │ -00005e40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -00005e50: 6f72 6422 3e20 203c 2f73 7061 6e3e 7b3c ord"> {< │ │ │ -00005e60: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00005eb0: 3134 323c 2f73 7061 6e3e 2020 2020 6173 142 as │ │ │ -00005ec0: 7365 7274 2869 735f 7661 6c69 645f 6861 sert(is_valid_ha │ │ │ -00005ed0: 6e64 6c65 285f 7668 2929 3b3c 2f64 6976 ndle(_vh));
.
143< │ │ │ -00005f30: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> return vertices_[_vh. │ │ │ -00005f70: 3c61 2063 6c61 7373 3d22 636f 6465 2068 idx()];.
144 │ │ │ -00006020: 3c2f 7370 616e 3e20 207d 3c2f 6469 763e }
│ │ │ -00006030: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -000060a0: 6120 6964 3d22 6c30 3031 3436 2220 6e61 a id="l00146" na │ │ │ -000060b0: 6d65 3d22 6c30 3031 3436 223e 3c2f 613e me="l00146"> │ │ │ -000060c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 146 Vertex& v │ │ │ -000060f0: 6572 7465 7828 3c61 2063 6c61 7373 3d22 ertex(VertexHandle< │ │ │ -00006130: 2f61 3e20 5f76 6829 3c2f 6469 763e 0a3c /a> _vh)
.< │ │ │ -00006140: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00006150: 3e3c 6120 6964 3d22 6c30 3031 3437 2220 > 147 {
.< │ │ │ -000061b0: 6120 6964 3d22 6c30 3031 3438 2220 6e61 a id="l00148" na │ │ │ -000061c0: 6d65 3d22 6c30 3031 3438 223e 3c2f 613e me="l00148"> │ │ │ -000061d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 148 assert(is_v │ │ │ -00006200: 616c 6964 5f68 616e 646c 6528 5f76 6829 alid_handle(_vh) │ │ │ -00006210: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
149 │ │ │ -00006270: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur │ │ │ -00006290: 6e3c 2f73 7061 6e3e 2076 6572 7469 6365 n vertice │ │ │ -000062a0: 735f 5b5f 7668 2e3c 6120 636c 6173 733d s_[_vh.idx( │ │ │ -00006300: 295d 3b3c 2f64 6976 3e0a 3c64 6976 2063 )];
.
150 │ │ │ -00006360: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ -000063b0: 2020 3135 313c 2f73 7061 6e3e 203c 2f64 151 .
15 │ │ │ -00006410: 323c 2f73 7061 6e3e 2020 3c73 7061 6e20 2 │ │ │ -00006430: 636f 6e73 743c 2f73 7061 6e3e 2048 616c const Hal │ │ │ -00006440: 6665 6467 6526 616d 703b 2068 616c 6665 fedge& halfe │ │ │ -00006450: 6467 6528 3c61 2063 6c61 7373 3d22 636f dge(HalfedgeHandle< │ │ │ -00006490: 2f61 3e20 5f68 6568 293c 7370 616e 2063 /a> _heh) │ │ │ -000064b0: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
153 │ │ │ -00006510: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 < │ │ │ -00006530: 2f73 7061 6e3e 7b3c 2f64 6976 3e0a 3c64 /span>{
. │ │ │ -00006550: 3c61 2069 643d 226c 3030 3135 3422 206e 154 assert(is_ │ │ │ -000065a0: 7661 6c69 645f 6861 6e64 6c65 285f 6865 valid_handle(_he │ │ │ -000065b0: 6829 293b 3c2f 6469 763e 0a3c 6469 7620 h));
.
155 │ │ │ -00006610: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret │ │ │ -00006630: 7572 6e3c 2f73 7061 6e3e 2065 6467 6573 urn edges │ │ │ -00006640: 5f5b 5f68 6568 2e3c 6120 636c 6173 733d _[_heh.idx( │ │ │ -000066a0: 2920 2667 743b 2667 743b 2031 5d2e 6861 ) >> 1].ha │ │ │ -000066b0: 6c66 6564 6765 735f 5b5f 6865 682e 3c61 lfedges_[_heh.i │ │ │ -00006710: 6478 3c2f 613e 2829 2026 616d 703b 2031 dx() & 1 │ │ │ -00006720: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
.
156 } │ │ │ -00006780: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000067d0: 2031 3537 3c2f 7370 616e 3e20 3c2f 6469 157 .
158 │ │ │ -00006830: 3c2f 7370 616e 3e20 2048 616c 6665 6467 Halfedg │ │ │ -00006840: 6526 616d 703b 2068 616c 6665 6467 6528 e& halfedge( │ │ │ -00006850: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Hal │ │ │ -00006880: 6665 6467 6548 616e 646c 653c 2f61 3e20 fedgeHandle │ │ │ -00006890: 5f68 6568 293c 2f64 6976 3e0a 3c64 6976 _heh)
.
< │ │ │ -000068d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -000068e0: 6e6f 223e 2020 3135 393c 2f73 7061 6e3e no"> 159 │ │ │ -000068f0: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
160 │ │ │ -00006950: 2020 6173 7365 7274 2869 735f 7661 6c69 assert(is_vali │ │ │ -00006960: 645f 6861 6e64 6c65 285f 6865 6829 293b d_handle(_heh)); │ │ │ -00006970: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000069c0: 2031 3631 3c2f 7370 616e 3e20 2020 203c 161 < │ │ │ -000069d0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -000069e0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -000069f0: 2f73 7061 6e3e 2065 6467 6573 5f5b 5f68 /span> edges_[_h │ │ │ -00006a00: 6568 2e3c 6120 636c 6173 733d 2263 6f64 eh.idx() &g │ │ │ -00006a60: 743b 2667 743b 2031 5d2e 6861 6c66 6564 t;> 1].halfed │ │ │ -00006a70: 6765 735f 5b5f 6865 682e 3c61 2063 6c61 ges_[_heh.idx() & 1];.
1 │ │ │ -00006b30: 3632 3c2f 7370 616e 3e20 207d 3c2f 6469 62 }.
163 │ │ │ -00006b90: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -00006ba0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00006bb0: 3e3c 6120 6964 3d22 6c30 3031 3634 2220 > 164 const │ │ │ -00006c10: 3c2f 7370 616e 3e20 4564 6765 2661 6d70 Edge& │ │ │ -00006c20: 3b20 6564 6765 283c 6120 636c 6173 733d ; edge(EdgeHandle _eh) co │ │ │ -00006c80: 6e73 743c 2f73 7061 6e3e 3c2f 6469 763e nst
│ │ │ -00006c90: 0a3c 6469 7620 636c 6173 733d 226c 696e .
.
< │ │ │ -00006d40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00006d50: 6e6f 223e 2020 3136 363c 2f73 7061 6e3e no"> 166 │ │ │ -00006d60: 2020 2020 6173 7365 7274 2869 735f 7661 assert(is_va │ │ │ -00006d70: 6c69 645f 6861 6e64 6c65 285f 6568 2929 lid_handle(_eh)) │ │ │ -00006d80: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -00006dd0: 2020 3136 373c 2f73 7061 6e3e 2020 2020 167 │ │ │ -00006de0: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ -00006e00: 3c2f 7370 616e 3e20 6564 6765 735f 5b5f edges_[_ │ │ │ -00006e10: 6568 2e3c 6120 636c 6173 733d 2263 6f64 eh.idx()];< │ │ │ -00006e70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00006ec0: 3136 383c 2f73 7061 6e3e 2020 7d3c 2f64 168 }.
16 │ │ │ -00006f20: 393c 2f73 7061 6e3e 203c 2f64 6976 3e0a 9
. │ │ │ -00006f30: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -00007010: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00007020: 6e6f 223e 2020 3137 313c 2f73 7061 6e3e no"> 171 │ │ │ -00007030: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
172 │ │ │ -00007090: 2020 6173 7365 7274 2869 735f 7661 6c69 assert(is_vali │ │ │ -000070a0: 645f 6861 6e64 6c65 285f 6568 2929 3b3c d_handle(_eh));< │ │ │ -000070b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00007100: 3137 333c 2f73 7061 6e3e 2020 2020 3c73 173 return edges_[_eh │ │ │ -00007140: 2e3c 6120 636c 6173 733d 2263 6f64 6520 .idx()];.
17 │ │ │ -000071f0: 343c 2f73 7061 6e3e 2020 7d3c 2f64 6976 4 }
.
175< │ │ │ -00007250: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00007270: 3c61 2069 643d 226c 3030 3137 3622 206e 176 const< │ │ │ -000072d0: 2f73 7061 6e3e 2046 6163 6526 616d 703b /span> Face& │ │ │ -000072e0: 2066 6163 6528 3c61 2063 6c61 7373 3d22 face(FaceHandle _fh) con │ │ │ -00007340: 7374 3c2f 7370 616e 3e3c 2f64 6976 3e0a st
. │ │ │ -00007350: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
178 │ │ │ -00007420: 2020 2061 7373 6572 7428 6973 5f76 616c assert(is_val │ │ │ -00007430: 6964 5f68 616e 646c 6528 5f66 6829 293b id_handle(_fh)); │ │ │ -00007440: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00007490: 2031 3739 3c2f 7370 616e 3e20 2020 203c 179 < │ │ │ -000074a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -000074b0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -000074c0: 2f73 7061 6e3e 2066 6163 6573 5f5b 5f66 /span> faces_[_f │ │ │ -000074d0: 682e 3c61 2063 6c61 7373 3d22 636f 6465 h.idx()];.
1 │ │ │ -00007580: 3830 3c2f 7370 616e 3e20 207d 3c2f 6469 80 }.
181 │ │ │ -000075e0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -000075f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00007600: 3e3c 6120 6964 3d22 6c30 3031 3832 2220 > 182 Face& f │ │ │ -00007650: 6163 6528 3c61 2063 6c61 7373 3d22 636f ace(FaceHandle │ │ │ -00007690: 5f66 6829 3c2f 6469 763e 0a3c 6469 7620 _fh)
.
183 │ │ │ -000076f0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
184 │ │ │ -00007750: 2061 7373 6572 7428 6973 5f76 616c 6964 assert(is_valid │ │ │ -00007760: 5f68 616e 646c 6528 5f66 6829 293b 3c2f _handle(_fh));.
1 │ │ │ -000077c0: 3835 3c2f 7370 616e 3e20 2020 203c 7370 85 return faces_[_fh. │ │ │ -00007800: 3c61 2063 6c61 7373 3d22 636f 6465 2068 idx()];.
186 │ │ │ -000078b0: 3c2f 7370 616e 3e20 207d 3c2f 6469 763e }
│ │ │ -000078c0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -00007930: 6120 6964 3d22 6c30 3031 3838 2220 6e61 a id="l00188" na │ │ │ -00007940: 6d65 3d22 6c30 3031 3838 223e 3c2f 613e me="l00188"> │ │ │ -00007950: 3c73 7061 6e20 636c 6173 733d 226c 696e 188 // --- │ │ │ -00007990: 6765 7420 6926 2333 393b 7468 2069 7465 get i'th ite │ │ │ -000079a0: 6d73 202d 2d2d 3c2f 7370 616e 3e3c 2f64 ms ---.
18 │ │ │ -00007a00: 393c 2f73 7061 6e3e 203c 2f64 6976 3e0a 9
. │ │ │ -00007a10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ -00007b40: 3c61 2069 643d 226c 3030 3139 3122 206e 191 { ret │ │ │ -00007bc0: 7572 6e3c 2f73 7061 6e3e 2028 5f69 2026 urn (_i & │ │ │ -00007bd0: 6c74 3b20 6e5f 7665 7274 6963 6573 2829 lt; n_vertices() │ │ │ -00007be0: 2920 3f20 6861 6e64 6c65 2820 7665 7274 ) ? handle( vert │ │ │ -00007bf0: 6963 6573 5f5b 5f69 5d20 2920 3a20 3c61 ices_[_i] ) : Verte │ │ │ -00007c30: 7848 616e 646c 653c 2f61 3e28 293b 207d xHandle(); } │ │ │ -00007c40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00007c90: 2031 3932 3c2f 7370 616e 3e20 3c2f 6469 192 .
.
193< │ │ │ -00007d80: 2f73 7061 6e3e 2020 3c61 2063 6c61 7373 /span> HalfedgeHan │ │ │ -00007dc0: 646c 653c 2f61 3e20 6861 6c66 6564 6765 dle halfedge │ │ │ -00007dd0: 5f68 616e 646c 6528 3c73 7061 6e20 636c _handle(unsigned int< │ │ │ -00007e20: 2f73 7061 6e3e 205f 6929 3c73 7061 6e20 /span> _i) │ │ │ -00007e40: 2063 6f6e 7374 3c2f 7370 616e 3e3c 2f64 const.
19 │ │ │ -00007ea0: 343c 2f73 7061 6e3e 3c73 7061 6e20 636c 4 │ │ │ -00007ec0: 3c2f 7370 616e 3e7b 3c2f 6469 763e 0a3c {
.< │ │ │ -00007ed0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00007ee0: 3e3c 6120 6964 3d22 6c30 3031 3935 2220 > 195 return ( │ │ │ -00007f50: 5f69 2026 6c74 3b20 6e5f 6861 6c66 6564 _i < n_halfed │ │ │ -00007f60: 6765 7328 2929 203f 3c2f 6469 763e 0a3c ges()) ?
.< │ │ │ -00007f70: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00007f80: 3e3c 6120 6964 3d22 6c30 3031 3936 2220 > 196 halfedg │ │ │ -00007fd0: 655f 6861 6e64 6c65 2865 6467 655f 6861 e_handle(edge_ha │ │ │ -00007fe0: 6e64 6c65 285f 692f 3229 2c20 5f69 2532 ndle(_i/2), _i%2 │ │ │ -00007ff0: 2920 3a20 3c61 2063 6c61 7373 3d22 636f ) : HalfedgeHandle< │ │ │ -00008030: 2f61 3e28 293b 3c2f 6469 763e 0a3c 6469 /a>();
.< │ │ │ -00008050: 6120 6964 3d22 6c30 3031 3937 2220 6e61 a id="l00197" na │ │ │ -00008060: 6d65 3d22 6c30 3031 3937 223e 3c2f 613e me="l00197"> │ │ │ -00008070: 3c73 7061 6e20 636c 6173 733d 226c 696e 197 }
.
.
198< │ │ │ -000080f0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
..
199 │ │ │ -00008210: 4564 6765 4861 6e64 6c65 3c2f 613e 2065 EdgeHandle e │ │ │ -00008220: 6467 655f 6861 6e64 6c65 283c 7370 616e dge_handle(unsigned i │ │ │ -00008270: 6e74 3c2f 7370 616e 3e20 5f69 293c 7370 nt _i) const │ │ │ -000082a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000082f0: 2032 3030 3c2f 7370 616e 3e3c 7370 616e 200 { return (_i < n_e │ │ │ -00008350: 6467 6573 2829 2920 3f20 6861 6e64 6c65 dges()) ? handle │ │ │ -00008360: 2865 6467 6573 5f5b 5f69 5d29 203a 203c (edges_[_i]) : < │ │ │ -00008370: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -00008380: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -00008390: 3032 3537 302e 6874 6d6c 223e 4564 6765 02570.html">Edge │ │ │ -000083a0: 4861 6e64 6c65 3c2f 613e 2829 3b20 7d3c Handle(); }< │ │ │ -000083b0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
.< │ │ │ -000083d0: 6120 6964 3d22 6c30 3032 3031 2220 6e61 a id="l00201" na │ │ │ -000083e0: 6d65 3d22 6c30 3032 3031 223e 3c2f 613e me="l00201"> │ │ │ -000083f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 201
.
.< │ │ │ -00008460: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00008470: 3e3c 6120 6964 3d22 6c30 3032 3032 2220 > 20 │ │ │ -000084f0: 323c 2f61 3e3c 2f73 7061 6e3e 2020 3c61 2 FaceH │ │ │ -00008530: 616e 646c 653c 2f61 3e20 6661 6365 5f68 andle face_h │ │ │ -00008540: 616e 646c 6528 3c73 7061 6e20 636c 6173 andle( │ │ │ -00008560: 756e 7369 676e 6564 3c2f 7370 616e 3e20 unsigned │ │ │ -00008570: 3c73 7061 6e20 636c 6173 733d 226b 6579 int _i) c │ │ │ -000085b0: 6f6e 7374 3c2f 7370 616e 3e3c 2f64 6976 onst
.
203< │ │ │ -00008610: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> { return ( │ │ │ -00008660: 5f69 2026 6c74 3b20 6e5f 6661 6365 7328 _i < n_faces( │ │ │ -00008670: 2929 203f 2068 616e 646c 6528 6661 6365 )) ? handle(face │ │ │ -00008680: 735f 5b5f 695d 2920 3a20 3c61 2063 6c61 s_[_i]) : FaceHandl │ │ │ -000086c0: 653c 2f61 3e28 293b 207d 3c2f 6469 763e e(); }
│ │ │ -000086d0: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
.
│ │ │ -00008720: 2020 3230 343c 2f73 7061 6e3e 203c 2f64 204 .
20 │ │ │ -00008780: 353c 2f73 7061 6e3e 3c73 7061 6e20 636c 5pu │ │ │ -000087a0: 626c 6963 3c2f 7370 616e 3e3a 3c2f 6469 blic:.
206 │ │ │ -00008800: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -00008810: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ -00008820: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ -00008830: 6e30 3032 3136 2220 6461 7461 2d73 7461 n00216" data-sta │ │ │ -00008840: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ -00008850: 227d 223e 0a3c 6469 7620 636c 6173 733d "}">.. │ │ │ -000089d0: 3c61 2069 643d 226c 3030 3231 3722 206e 217 {
.
< │ │ │ -00008a50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00008a60: 6e6f 223e 2020 3231 383c 2f73 7061 6e3e no"> 218 │ │ │ -00008a70: 2020 2020 7665 7274 6963 6573 5f2e 7075 vertices_.pu │ │ │ -00008a80: 7368 5f62 6163 6b28 5665 7274 6578 2829 sh_back(Vertex() │ │ │ -00008a90: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
219 │ │ │ -00008af0: 2076 7072 6f70 735f 7265 7369 7a65 286e vprops_resize(n │ │ │ -00008b00: 5f76 6572 7469 6365 7328 2929 3b3c 7370 _vertices());//TODO:should │ │ │ -00008b30: 2069 7420 6265 2070 7573 685f 6261 636b it be push_back │ │ │ -00008b40: 2829 3f3c 2f73 7061 6e3e 3c2f 6469 763e ()?
│ │ │ -00008b50: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -00008bc0: 6120 6964 3d22 6c30 3032 3231 2220 6e61 a id="l00221" na │ │ │ -00008bd0: 6d65 3d22 6c30 3032 3231 223e 3c2f 613e me="l00221"> │ │ │ -00008be0: 3c73 7061 6e20 636c 6173 733d 226c 696e 221 r │ │ │ -00008c20: 6574 7572 6e3c 2f73 7061 6e3e 2068 616e eturn han │ │ │ -00008c30: 646c 6528 7665 7274 6963 6573 5f2e 6261 dle(vertices_.ba │ │ │ -00008c40: 636b 2829 293b 3c2f 6469 763e 0a3c 6469 ck());
.< │ │ │ -00008c60: 6120 6964 3d22 6c30 3032 3232 2220 6e61 a id="l00222" na │ │ │ -00008c70: 6d65 3d22 6c30 3032 3232 223e 3c2f 613e me="l00222"> │ │ │ -00008c80: 3c73 7061 6e20 636c 6173 733d 226c 696e 222 }
.
.
223< │ │ │ -00008d00: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
..
234 inline< │ │ │ -00008e10: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> VertexHandle │ │ │ -00008e50: 3c2f 613e 203c 6120 636c 6173 733d 2263 new_vertex │ │ │ -00008eb0: 5f64 6972 7479 3c2f 613e 2829 3c2f 6469 _dirty().
235 │ │ │ -00008f10: 3c2f 7370 616e 3e20 207b 3c2f 6469 763e {
│ │ │ -00008f20: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00008f50: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 236 vertice │ │ │ -00008f80: 735f 2e70 7573 685f 6261 636b 2856 6572 s_.push_back(Ver │ │ │ -00008f90: 7465 7828 2929 3b3c 2f64 6976 3e0a 3c64 tex());
. │ │ │ -00008fb0: 3c61 2069 643d 226c 3030 3233 3722 206e 237 vprops_res │ │ │ -00009000: 697a 655f 6966 5f73 6d61 6c6c 6572 286e ize_if_smaller(n │ │ │ -00009010: 5f76 6572 7469 6365 7328 2929 3b3c 7370 _vertices());//TODO:should │ │ │ -00009040: 2069 7420 6265 2070 7573 685f 6261 636b it be push_back │ │ │ -00009050: 2829 3f3c 2f73 7061 6e3e 3c2f 6469 763e ()?
│ │ │ -00009060: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -000090d0: 6120 6964 3d22 6c30 3032 3339 2220 6e61 a id="l00239" na │ │ │ -000090e0: 6d65 3d22 6c30 3032 3339 223e 3c2f 613e me="l00239"> │ │ │ -000090f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 239 r │ │ │ -00009130: 6574 7572 6e3c 2f73 7061 6e3e 2068 616e eturn han │ │ │ -00009140: 646c 6528 7665 7274 6963 6573 5f2e 6261 dle(vertices_.ba │ │ │ -00009150: 636b 2829 293b 3c2f 6469 763e 0a3c 6469 ck());
.< │ │ │ -00009170: 6120 6964 3d22 6c30 3032 3430 2220 6e61 a id="l00240" na │ │ │ -00009180: 6d65 3d22 6c30 3032 3430 223e 3c2f 613e me="l00240"> │ │ │ -00009190: 3c73 7061 6e20 636c 6173 733d 226c 696e 240 }
.
.
241< │ │ │ -00009210: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00009230: 3c61 2069 643d 226c 3030 3234 3222 206e 242
inline │ │ │ -00009290: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 HalfedgeHan │ │ │ -000092d0: 646c 653c 2f61 3e20 6e65 775f 6564 6765 dle new_edge │ │ │ -000092e0: 283c 6120 636c 6173 733d 2263 6f64 6520 (Ve │ │ │ -00009310: 7274 6578 4861 6e64 6c65 3c2f 613e 205f rtexHandle _ │ │ │ -00009320: 7374 6172 745f 7668 2c20 3c61 2063 6c61 start_vh, VertexHan │ │ │ -00009360: 646c 653c 2f61 3e20 5f65 6e64 5f76 6829 dle _end_vh) │ │ │ -00009370: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000093c0: 2032 3433 3c2f 7370 616e 3e20 207b 3c2f 243 {.
2 │ │ │ -00009420: 3434 3c2f 7370 616e 3e3c 7370 616e 2063 44/ │ │ │ -00009440: 2f20 2020 2020 6173 7365 7274 285f 7374 / assert(_st │ │ │ -00009450: 6172 745f 7668 2021 3d20 5f65 6e64 5f76 art_vh != _end_v │ │ │ -00009460: 6829 3b3c 2f73 7061 6e3e 3c2f 6469 763e h);
│ │ │ -00009470: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -000094a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 245 edges_. │ │ │ -000094d0: 7075 7368 5f62 6163 6b28 4564 6765 2829 push_back(Edge() │ │ │ -000094e0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
246 │ │ │ -00009540: 2065 7072 6f70 735f 7265 7369 7a65 286e eprops_resize(n │ │ │ -00009550: 5f65 6467 6573 2829 293b 3c73 7061 6e20 _edges()); │ │ │ -00009570: 2f2f 544f 444f 3a73 686f 756c 6420 6974 //TODO:should it │ │ │ -00009580: 2062 6520 7075 7368 5f62 6163 6b28 293f be push_back()? │ │ │ -00009590: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -000095b0: 3c61 2069 643d 226c 3030 3234 3722 206e 247 hprops_res │ │ │ -00009600: 697a 6528 6e5f 6861 6c66 6564 6765 7328 ize(n_halfedges( │ │ │ -00009610: 2929 3b3c 7370 616e 2063 6c61 7373 3d22 ));//TODO: │ │ │ -00009630: 7368 6f75 6c64 2069 7420 6265 2070 7573 should it be pus │ │ │ -00009640: 685f 6261 636b 2829 3f3c 2f73 7061 6e3e h_back()? │ │ │ -00009650: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000096a0: 2032 3438 3c2f 7370 616e 3e20 3c2f 6469 248 .
249 │ │ │ -00009700: 3c2f 7370 616e 3e20 2020 203c 6120 636c EdgeHand │ │ │ -00009740: 6c65 3c2f 613e 2065 6828 6861 6e64 6c65 le eh(handle │ │ │ -00009750: 2865 6467 6573 5f2e 6261 636b 2829 2929 (edges_.back())) │ │ │ -00009760: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -000097b0: 2020 3235 303c 2f73 7061 6e3e 2020 2020 250 │ │ │ -000097c0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Hal │ │ │ -000097f0: 6665 6467 6548 616e 646c 653c 2f61 3e20 fedgeHandle │ │ │ -00009800: 6865 6830 2868 616c 6665 6467 655f 6861 heh0(halfedge_ha │ │ │ -00009810: 6e64 6c65 2865 682c 2030 2929 3b3c 2f64 ndle(eh, 0));.
25 │ │ │ -00009870: 313c 2f73 7061 6e3e 2020 2020 3c61 2063 1 Halfedg │ │ │ -000098b0: 6548 616e 646c 653c 2f61 3e20 6865 6831 eHandle heh1 │ │ │ -000098c0: 2868 616c 6665 6467 655f 6861 6e64 6c65 (halfedge_handle │ │ │ -000098d0: 2865 682c 2031 2929 3b3c 2f64 6976 3e0a (eh, 1));
. │ │ │ -000098e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ -00009960: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
254< │ │ │ -00009a30: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> return heh0;
. │ │ │ -00009a80: 3c61 2069 643d 226c 3030 3235 3522 206e 255 }
.
< │ │ │ -00009b00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00009b10: 6e6f 223e 2020 3235 363c 2f73 7061 6e3e no"> 256 │ │ │ -00009b20: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ -00009b70: 2020 3235 373c 2f73 7061 6e3e 2020 3c73 257 inline FaceHandle new │ │ │ -00009bb0: 5f66 6163 6528 293c 2f64 6976 3e0a 3c64 _face()
. │ │ │ -00009bd0: 3c61 2069 643d 226c 3030 3235 3822 206e 258 {
.
< │ │ │ -00009c50: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00009c60: 6e6f 223e 2020 3235 393c 2f73 7061 6e3e no"> 259 │ │ │ -00009c70: 2020 2020 6661 6365 735f 2e70 7573 685f faces_.push_ │ │ │ -00009c80: 6261 636b 2846 6163 6528 2929 3b3c 2f64 back(Face());.
26 │ │ │ -00009ce0: 303c 2f73 7061 6e3e 2020 2020 6670 726f 0 fpro │ │ │ -00009cf0: 7073 5f72 6573 697a 6528 6e5f 6661 6365 ps_resize(n_face │ │ │ -00009d00: 7328 2929 3b3c 2f64 6976 3e0a 3c64 6976 s());
.
< │ │ │ -00009d40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00009d50: 6e6f 223e 2020 3236 313c 2f73 7061 6e3e no"> 261 │ │ │ -00009d60: 2020 2020 3c73 7061 6e20 636c 6173 733d re │ │ │ -00009d80: 7475 726e 3c2f 7370 616e 3e20 6861 6e64 turn hand │ │ │ -00009d90: 6c65 2866 6163 6573 5f2e 6261 636b 2829 le(faces_.back() │ │ │ -00009da0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
262 } │ │ │ -00009e00: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00009e50: 2032 3633 3c2f 7370 616e 3e20 3c2f 6469 263 .
264 │ │ │ -00009eb0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 i │ │ │ -00009ed0: 6e6c 696e 653c 2f73 7061 6e3e 2046 6163 nline Fac │ │ │ -00009ee0: 6548 616e 646c 6520 6e65 775f 6661 6365 eHandle new_face │ │ │ -00009ef0: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (const Face& _f │ │ │ -00009f20: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ -00009f70: 2020 3236 353c 2f73 7061 6e3e 2020 7b3c 265 {< │ │ │ -00009f80: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00009fd0: 3236 363c 2f73 7061 6e3e 2020 2020 6661 266 fa │ │ │ -00009fe0: 6365 735f 2e70 7573 685f 6261 636b 285f ces_.push_back(_ │ │ │ -00009ff0: 6629 3b3c 2f64 6976 3e0a 3c64 6976 2063 f);
.
267 │ │ │ -0000a050: 2020 6670 726f 7073 5f72 6573 697a 6528 fprops_resize( │ │ │ -0000a060: 6e5f 6661 6365 7328 2929 3b3c 2f64 6976 n_faces());
.
268< │ │ │ -0000a0c0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> return handle(faces_. │ │ │ -0000a100: 6261 636b 2829 293b 3c2f 6469 763e 0a3c back());
.< │ │ │ -0000a110: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000a120: 3e3c 6120 6964 3d22 6c30 3032 3639 2220 > 269 }
.< │ │ │ -0000a180: 6120 6964 3d22 6c30 3032 3730 2220 6e61 a id="l00270" na │ │ │ -0000a190: 6d65 3d22 6c30 3032 3730 223e 3c2f 613e me="l00270"> │ │ │ -0000a1a0: 3c73 7061 6e20 636c 6173 733d 226c 696e 270
.
271public │ │ │ -0000a240: 3a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 :
.
│ │ │ -0000a290: 2020 3237 323c 2f73 7061 6e3e 2020 3c73 272 // --- resiz │ │ │ -0000a2c0: 652f 7265 7365 7276 6520 2d2d 2d3c 2f73 e/reserve ---
.
273 │ │ │ -0000a330: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ -0000a350: 2f73 7061 6e3e 2072 6573 697a 6528 203c /span> resize( < │ │ │ -0000a360: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0000a370: 6f72 6474 7970 6522 3e73 697a 655f 743c ordtype">size_t< │ │ │ -0000a380: 2f73 7061 6e3e 205f 6e5f 7665 7274 6963 /span> _n_vertic │ │ │ -0000a390: 6573 2c20 3c73 7061 6e20 636c 6173 733d es, si │ │ │ -0000a3b0: 7a65 5f74 3c2f 7370 616e 3e20 5f6e 5f65 ze_t _n_e │ │ │ -0000a3c0: 6467 6573 2c20 3c73 7061 6e20 636c 6173 dges, │ │ │ -0000a3e0: 7369 7a65 5f74 3c2f 7370 616e 3e20 5f6e size_t _n │ │ │ -0000a3f0: 5f66 6163 6573 2029 3b3c 2f64 6976 3e0a _faces );
. │ │ │ -0000a400: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -0000a430: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 274 │ │ │ -0000a470: 766f 6964 3c2f 7370 616e 3e20 7265 7365 void rese │ │ │ -0000a480: 7276 6528 3c73 7061 6e20 636c 6173 733d rve(si │ │ │ -0000a4a0: 7a65 5f74 3c2f 7370 616e 3e20 5f6e 5f76 ze_t _n_v │ │ │ -0000a4b0: 6572 7469 6365 732c 203c 7370 616e 2063 ertices, size_t │ │ │ -0000a4e0: 205f 6e5f 6564 6765 732c 203c 7370 616e _n_edges, size_t _n_faces );.
2 │ │ │ -0000a570: 3735 3c2f 7370 616e 3e20 3c2f 6469 763e 75
│ │ │ -0000a580: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0000a5b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 276 // │ │ │ -0000a5f0: 2d2d 2d20 6465 6c65 7469 6f6e 202d 2d2d --- deletion --- │ │ │ -0000a600: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -0000a620: 3c61 2069 643d 226c 3030 3239 3222 206e 292 vo │ │ │ -0000a680: 6964 3c2f 7370 616e 3e20 6761 7262 6167 id garbag │ │ │ -0000a690: 655f 636f 6c6c 6563 7469 6f6e 283c 7370 e_collection(bool _v=true │ │ │ -0000a6e0: 3c2f 7370 616e 3e2c 203c 7370 616e 2063 , bool _ │ │ │ -0000a710: 653d 3c73 7061 6e20 636c 6173 733d 226b e=true, b │ │ │ -0000a750: 6f6f 6c3c 2f73 7061 6e3e 205f 663d 3c73 ool _f=true) │ │ │ -0000a780: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -0000a7d0: 2020 3239 333c 2f73 7061 6e3e 203c 2f64 293 .
31 │ │ │ -0000a830: 333c 2f73 7061 6e3e 2020 3c73 7061 6e20 3 │ │ │ -0000a850: 7465 6d70 6c61 7465 3c2f 7370 616e 3e26 template& │ │ │ -0000a860: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;typenam │ │ │ -0000a880: 653c 2f73 7061 6e3e 2073 7464 5f41 5049 e std_API │ │ │ -0000a890: 5f43 6f6e 7461 696e 6572 5f56 4861 6e64 _Container_VHand │ │ │ -0000a8a0: 6c65 506f 696e 7465 722c 3c2f 6469 763e lePointer,
│ │ │ -0000a8b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0000a8e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 314 │ │ │ -0000a910: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename std_API_Co │ │ │ -0000a940: 6e74 6169 6e65 725f 4848 616e 646c 6550 ntainer_HHandleP │ │ │ -0000a950: 6f69 6e74 6572 2c3c 2f64 6976 3e0a 3c64 ointer,
. │ │ │ -0000a970: 3c61 2069 643d 226c 3030 3331 3522 206e 315 typename std_API_Conta │ │ │ -0000a9f0: 696e 6572 5f46 4861 6e64 6c65 506f 696e iner_FHandlePoin │ │ │ -0000aa00: 7465 7226 6774 3b3c 2f64 6976 3e0a 3c64 ter>
. │ │ │ -0000aa20: 3c61 2069 643d 226c 3030 3331 3622 206e 316 vo │ │ │ -0000aa80: 6964 3c2f 7370 616e 3e20 6761 7262 6167 id garbag │ │ │ -0000aa90: 655f 636f 6c6c 6563 7469 6f6e 2873 7464 e_collection(std │ │ │ -0000aaa0: 5f41 5049 5f43 6f6e 7461 696e 6572 5f56 _API_Container_V │ │ │ -0000aab0: 4861 6e64 6c65 506f 696e 7465 7226 616d HandlePointer&am │ │ │ -0000aac0: 703b 2076 685f 746f 5f75 7064 6174 652c p; vh_to_update, │ │ │ -0000aad0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000ab20: 2033 3137 3c2f 7370 616e 3e20 2020 2020 317 │ │ │ -0000ab30: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0000ab40: 2020 2020 2073 7464 5f41 5049 5f43 6f6e std_API_Con │ │ │ -0000ab50: 7461 696e 6572 5f48 4861 6e64 6c65 506f tainer_HHandlePo │ │ │ -0000ab60: 696e 7465 7226 616d 703b 2068 685f 746f inter& hh_to │ │ │ -0000ab70: 5f75 7064 6174 652c 3c2f 6469 763e 0a3c _update,
.< │ │ │ -0000ab80: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000ab90: 3e3c 6120 6964 3d22 6c30 3033 3138 2220 > 318 │ │ │ -0000abe0: 2020 2020 2020 2020 2020 2020 2073 7464 std │ │ │ -0000abf0: 5f41 5049 5f43 6f6e 7461 696e 6572 5f46 _API_Container_F │ │ │ -0000ac00: 4861 6e64 6c65 506f 696e 7465 7226 616d HandlePointer&am │ │ │ -0000ac10: 703b 2066 685f 746f 5f75 7064 6174 652c p; fh_to_update, │ │ │ -0000ac20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000ac70: 2033 3139 3c2f 7370 616e 3e20 2020 2020 319 │ │ │ -0000ac80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0000ac90: 2020 2020 203c 7370 616e 2063 6c61 7373 b │ │ │ -0000acb0: 6f6f 6c3c 2f73 7061 6e3e 205f 763d 3c73 ool _v=true, │ │ │ -0000ace0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 bool< │ │ │ -0000ad00: 2f73 7061 6e3e 205f 653d 3c73 7061 6e20 /span> _e= │ │ │ -0000ad20: 7472 7565 3c2f 7370 616e 3e2c 203c 7370 true, bool _f=true │ │ │ -0000ad70: 3c2f 7370 616e 3e29 3b3c 2f64 6976 3e0a );
. │ │ │ -0000ad80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ -0000ae10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0000ae20: 6e6f 223e 2020 3332 323c 2f73 7061 6e3e no"> 322 │ │ │ -0000ae30: 2020 3c73 7061 6e20 636c 6173 733d 226b void │ │ │ -0000ae50: 3c2f 7370 616e 3e20 636c 6561 7228 293b clear(); │ │ │ -0000ae60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000aeb0: 2033 3233 3c2f 7370 616e 3e20 3c2f 6469 323 .
333 │ │ │ -0000af10: 3c2f 7370 616e 3e20 203c 7370 616e 2063 void c │ │ │ -0000af40: 6c65 616e 2829 3b3c 2f64 6976 3e0a 3c64 lean();
. │ │ │ -0000af60: 3c61 2069 643d 226c 3030 3333 3422 206e 334
.
342 │ │ │ -0000b000: 3c73 7061 6e20 636c 6173 733d 226b 6579 void clean_keep │ │ │ -0000b030: 5f72 6573 6572 7661 7469 6f6e 2829 3b3c _reservation();< │ │ │ -0000b040: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000b090: 3334 333c 2f73 7061 6e3e 203c 2f64 6976 343
.
344< │ │ │ -0000b0f0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> // │ │ │ -0000b110: 202d 2d2d 206e 756d 6265 7220 6f66 2069 --- number of i │ │ │ -0000b120: 7465 6d73 202d 2d2d 3c2f 7370 616e 3e3c tems ---< │ │ │ -0000b130: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
345 s │ │ │ -0000b1f0: 697a 655f 743c 2f73 7061 6e3e 203c 6120 ize_t n_ │ │ │ -0000b250: 7665 7274 6963 6573 3c2f 613e 2829 3c73 vertices() const over │ │ │ -0000b280: 7269 6465 2020 3c2f 7370 616e 3e7b 203c ride { < │ │ │ -0000b290: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0000b2a0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -0000b2b0: 2f73 7061 6e3e 2076 6572 7469 6365 735f /span> vertices_ │ │ │ -0000b2c0: 2e73 697a 6528 293b 207d 3c2f 6469 763e .size(); }
│ │ │ -0000b2d0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0000b300: 3c2f 613e 3c73 7061 6e20 636c 6173 733d │ │ │ -0000b360: 3334 363c 2f61 3e3c 2f73 7061 6e3e 2020 346 │ │ │ -0000b370: 3c73 7061 6e20 636c 6173 733d 226b 6579 size_t │ │ │ -0000b390: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 n_halfe │ │ │ -0000b3f0: 6467 6573 3c2f 613e 2829 3c73 7061 6e20 dges() │ │ │ -0000b410: 2063 6f6e 7374 206f 7665 7272 6964 6520 const override │ │ │ -0000b420: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -0000b450: 2032 2a65 6467 6573 5f2e 7369 7a65 2829 2*edges_.size() │ │ │ -0000b460: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
347 │ │ │ -0000b500: 3c2f 7370 616e 3e20 203c 7370 616e 2063 size_t │ │ │ -0000b530: 203c 6120 636c 6173 733d 2263 6f64 6520 n_edges()< │ │ │ -0000b590: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0000b5a0: 6f72 6422 3e20 2020 2020 636f 6e73 7420 ord"> const │ │ │ -0000b5b0: 6f76 6572 7269 6465 203c 2f73 7061 6e3e override │ │ │ -0000b5c0: 7b20 3c73 7061 6e20 636c 6173 733d 226b { retu │ │ │ -0000b5e0: 726e 3c2f 7370 616e 3e20 6564 6765 735f rn edges_ │ │ │ -0000b5f0: 2e73 697a 6528 293b 207d 3c2f 6469 763e .size(); }
│ │ │ -0000b600: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0000b630: 3c2f 613e 3c73 7061 6e20 636c 6173 733d │ │ │ -0000b690: 3334 383c 2f61 3e3c 2f73 7061 6e3e 2020 348 │ │ │ -0000b6a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 size_t │ │ │ -0000b6c0: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 n_faces │ │ │ -0000b720: 3c2f 613e 2829 3c73 7061 6e20 636c 6173 () │ │ │ -0000b740: 2063 6f6e 7374 206f 7665 7272 6964 6520 const override │ │ │ -0000b750: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -0000b780: 2066 6163 6573 5f2e 7369 7a65 2829 3b20 faces_.size(); │ │ │ -0000b790: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ -0000b7e0: 2020 3334 393c 2f73 7061 6e3e 203c 2f64 349 .
35 │ │ │ -0000b840: 303c 2f73 7061 6e3e 2020 3c73 7061 6e20 0 bool │ │ │ -0000b870: 7665 7274 6963 6573 5f65 6d70 7479 2829 vertices_empty() │ │ │ -0000b880: 3c73 7061 6e20 636c 6173 733d 226b 6579 const { return v │ │ │ -0000b8d0: 6572 7469 6365 735f 2e65 6d70 7479 2829 ertices_.empty() │ │ │ -0000b8e0: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
351 │ │ │ -0000b940: 3c73 7061 6e20 636c 6173 733d 226b 6579 bool halfedges_ │ │ │ -0000b970: 656d 7074 7928 293c 7370 616e 2063 6c61 empty() co │ │ │ -0000b990: 6e73 7420 3c2f 7370 616e 3e7b 203c 7370 nst { return edges_.empt │ │ │ -0000b9d0: 7928 293b 207d 3c2f 6469 763e 0a3c 6469 y(); }
.< │ │ │ -0000b9f0: 6120 6964 3d22 6c30 3033 3532 2220 6e61 a id="l00352" na │ │ │ -0000ba00: 6d65 3d22 6c30 3033 3532 223e 3c2f 613e me="l00352"> │ │ │ -0000ba10: 3c73 7061 6e20 636c 6173 733d 226c 696e 352 boo │ │ │ -0000ba50: 6c3c 2f73 7061 6e3e 2065 6467 6573 5f65 l edges_e │ │ │ -0000ba60: 6d70 7479 2829 3c73 7061 6e20 636c 6173 mpty() │ │ │ -0000ba80: 2063 6f6e 7374 203c 2f73 7061 6e3e 7b20 const { │ │ │ -0000ba90: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ -0000bab0: 3c2f 7370 616e 3e20 6564 6765 735f 2e65 edges_.e │ │ │ -0000bac0: 6d70 7479 2829 3b20 7d3c 2f64 6976 3e0a mpty(); }
. │ │ │ -0000bad0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
│ │ │ -0000bd00: 2033 3536 3c2f 7370 616e 3e20 3c2f 6469 356 .
.
357< │ │ │ -0000bdf0: 2f73 7061 6e3e 2020 3c61 2063 6c61 7373 /span> HalfedgeHan │ │ │ -0000be30: 646c 653c 2f61 3e20 6861 6c66 6564 6765 dle halfedge │ │ │ -0000be40: 5f68 616e 646c 6528 3c61 2063 6c61 7373 _handle(VertexHandl │ │ │ -0000be80: 653c 2f61 3e20 5f76 6829 3c73 7061 6e20 e _vh) │ │ │ -0000bea0: 2063 6f6e 7374 3c2f 7370 616e 3e3c 2f64 const.
35 │ │ │ -0000bf00: 383c 2f73 7061 6e3e 3c73 7061 6e20 636c 8 │ │ │ -0000bf20: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -0000bf50: 2076 6572 7465 7828 5f76 6829 2e68 616c vertex(_vh).hal │ │ │ -0000bf60: 6665 6467 655f 6861 6e64 6c65 5f3b 207d fedge_handle_; } │ │ │ -0000bf70: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ -0000bf90: 3c61 2069 643d 226c 3030 3335 3922 206e 359
.
360 │ │ │ -0000c030: 3c73 7061 6e20 636c 6173 733d 226b 6579 void set_halfed │ │ │ -0000c060: 6765 5f68 616e 646c 6528 3c61 2063 6c61 ge_handle(VertexHan │ │ │ -0000c0a0: 646c 653c 2f61 3e20 5f76 682c 203c 6120 dle _vh, Halfed │ │ │ -0000c0e0: 6765 4861 6e64 6c65 3c2f 613e 205f 6865 geHandle _he │ │ │ -0000c0f0: 6829 3c2f 6469 763e 0a3c 6469 7620 636c h)
.
361 { │ │ │ -0000c150: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000c1a0: 2033 3632 3c2f 7370 616e 3e3c 7370 616e 362// assert(i │ │ │ -0000c1d0: 735f 7661 6c69 645f 6861 6e64 6c65 285f s_valid_handle(_ │ │ │ -0000c1e0: 6865 6829 293b 3c2f 7370 616e 3e3c 2f64 heh));.
36 │ │ │ -0000c240: 333c 2f73 7061 6e3e 2020 2020 7665 7274 3 vert │ │ │ -0000c250: 6578 285f 7668 292e 6861 6c66 6564 6765 ex(_vh).halfedge │ │ │ -0000c260: 5f68 616e 646c 655f 203d 205f 6865 683b _handle_ = _heh; │ │ │ -0000c270: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000c2c0: 2033 3634 3c2f 7370 616e 3e20 207d 3c2f 364 }.
3 │ │ │ -0000c320: 3635 3c2f 7370 616e 3e20 3c2f 6469 763e 65
│ │ │ -0000c330: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0000c360: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 366 bool is_ │ │ │ -0000c3b0: 6973 6f6c 6174 6564 2856 6572 7465 7848 isolated(VertexH │ │ │ -0000c3c0: 616e 646c 6520 5f76 6829 3c73 7061 6e20 andle _vh) │ │ │ -0000c3e0: 2063 6f6e 7374 3c2f 7370 616e 3e3c 2f64 const.
36 │ │ │ -0000c440: 373c 2f73 7061 6e3e 3c73 7061 6e20 636c 7 │ │ │ -0000c460: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -0000c490: 2021 6861 6c66 6564 6765 5f68 616e 646c !halfedge_handl │ │ │ -0000c4a0: 6528 5f76 6829 2e3c 6120 636c 6173 733d e(_vh).is_valid │ │ │ -0000c500: 3c2f 613e 2829 3b20 7d3c 2f64 6976 3e0a (); }
. │ │ │ -0000c510: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -0000c5a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0000c5b0: 6e6f 223e 2020 3336 393c 2f73 7061 6e3e no"> 369 │ │ │ -0000c5c0: 2020 3c73 7061 6e20 636c 6173 733d 226b void │ │ │ -0000c5e0: 3c2f 7370 616e 3e20 7365 745f 6973 6f6c set_isol │ │ │ -0000c5f0: 6174 6564 2856 6572 7465 7848 616e 646c ated(VertexHandl │ │ │ -0000c600: 6520 5f76 6829 3c2f 6469 763e 0a3c 6469 e _vh)
.< │ │ │ -0000c620: 6120 6964 3d22 6c30 3033 3730 2220 6e61 a id="l00370" na │ │ │ -0000c630: 6d65 3d22 6c30 3033 3730 223e 3c2f 613e me="l00370"> │ │ │ -0000c640: 3c73 7061 6e20 636c 6173 733d 226c 696e 370 { vertex(_vh) │ │ │ -0000c670: 2e68 616c 6665 6467 655f 6861 6e64 6c65 .halfedge_handle │ │ │ -0000c680: 5f2e 696e 7661 6c69 6461 7465 2829 3b20 _.invalidate(); │ │ │ -0000c690: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ -0000c6e0: 2020 3337 313c 2f73 7061 6e3e 203c 2f64 371 .
37 │ │ │ -0000c740: 323c 2f73 7061 6e3e 2020 3c73 7061 6e20 2 unsigned in │ │ │ -0000c790: 743c 2f73 7061 6e3e 2064 656c 6574 655f t delete_ │ │ │ -0000c7a0: 6973 6f6c 6174 6564 5f76 6572 7469 6365 isolated_vertice │ │ │ -0000c7b0: 7328 293b 3c2f 6469 763e 0a3c 6469 7620 s();
.
373 │ │ │ -0000c810: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000c860: 2033 3734 3c2f 7370 616e 3e20 203c 7370 374 // --- halfed │ │ │ -0000c890: 6765 2063 6f6e 6e65 6374 6976 6974 7920 ge connectivity │ │ │ -0000c8a0: 2d2d 2d3c 2f73 7061 6e3e 3c2f 6469 763e ---
│ │ │ -0000c8b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0000c8e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 375 VertexHan │ │ │ -0000c910: 646c 6520 746f 5f76 6572 7465 785f 6861 dle to_vertex_ha │ │ │ -0000c920: 6e64 6c65 2848 616c 6665 6467 6548 616e ndle(HalfedgeHan │ │ │ -0000c930: 646c 6520 5f68 6568 293c 7370 616e 2063 dle _heh) │ │ │ -0000c950: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
376 │ │ │ -0000c9b0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 < │ │ │ -0000c9d0: 2f73 7061 6e3e 7b20 3c73 7061 6e20 636c /span>{ return │ │ │ -0000ca00: 6861 6c66 6564 6765 285f 6865 6829 2e76 halfedge(_heh).v │ │ │ -0000ca10: 6572 7465 785f 6861 6e64 6c65 5f3b 207d ertex_handle_; } │ │ │ -0000ca20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000ca70: 2033 3737 3c2f 7370 616e 3e20 3c2f 6469 377 .
378 │ │ │ -0000cad0: 3c2f 7370 616e 3e20 2056 6572 7465 7848 VertexH │ │ │ -0000cae0: 616e 646c 6520 6672 6f6d 5f76 6572 7465 andle from_verte │ │ │ -0000caf0: 785f 6861 6e64 6c65 2848 616c 6665 6467 x_handle(Halfedg │ │ │ -0000cb00: 6548 616e 646c 6520 5f68 6568 293c 7370 eHandle _heh) const │ │ │ -0000cb30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000cb80: 2033 3739 3c2f 7370 616e 3e3c 7370 616e 379 { return to_vertex_ha │ │ │ -0000cbe0: 6e64 6c65 286f 7070 6f73 6974 655f 6861 ndle(opposite_ha │ │ │ -0000cbf0: 6c66 6564 6765 5f68 616e 646c 6528 5f68 lfedge_handle(_h │ │ │ -0000cc00: 6568 2929 3b20 7d3c 2f64 6976 3e0a 3c64 eh)); }
. │ │ │ -0000cc20: 3c61 2069 643d 226c 3030 3338 3022 206e 380
.
381 │ │ │ -0000ccc0: 3c73 7061 6e20 636c 6173 733d 226b 6579 void set_vertex │ │ │ -0000ccf0: 5f68 616e 646c 6528 4861 6c66 6564 6765 _handle(Halfedge │ │ │ -0000cd00: 4861 6e64 6c65 205f 6865 682c 2056 6572 Handle _heh, Ver │ │ │ -0000cd10: 7465 7848 616e 646c 6520 5f76 6829 3c2f texHandle _vh).
3 │ │ │ -0000cd70: 3832 3c2f 7370 616e 3e20 207b 3c2f 6469 82 {.
383 │ │ │ -0000cdd0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 // │ │ │ -0000cdf0: 2020 2020 6173 7365 7274 2869 735f 7661 assert(is_va │ │ │ -0000ce00: 6c69 645f 6861 6e64 6c65 285f 7668 2929 lid_handle(_vh)) │ │ │ -0000ce10: 3b3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c ;
.< │ │ │ -0000ce20: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000ce30: 3e3c 6120 6964 3d22 6c30 3033 3834 2220 > 384 halfedge( │ │ │ -0000ce80: 5f68 6568 292e 7665 7274 6578 5f68 616e _heh).vertex_han │ │ │ -0000ce90: 646c 655f 203d 205f 7668 3b3c 2f64 6976 dle_ = _vh;
.
385< │ │ │ -0000cef0: 2f73 7061 6e3e 2020 7d3c 2f64 6976 3e0a /span> }
. │ │ │ -0000cf00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
.
│ │ │ -0000d030: 2033 3837 3c2f 613e 3c2f 7370 616e 3e20 387 │ │ │ -0000d040: 203c 6120 636c 6173 733d 2263 6f64 6520 Fa │ │ │ -0000d070: 6365 4861 6e64 6c65 3c2f 613e 2066 6163 ceHandle fac │ │ │ -0000d080: 655f 6861 6e64 6c65 283c 6120 636c 6173 e_handle(HalfedgeHa │ │ │ -0000d0c0: 6e64 6c65 3c2f 613e 205f 6865 6829 3c73 ndle _heh) const
.
│ │ │ -0000d140: 2020 3338 383c 2f73 7061 6e3e 3c73 7061 388 { return halfedge(_h │ │ │ -0000d1a0: 6568 292e 6661 6365 5f68 616e 646c 655f eh).face_handle_ │ │ │ -0000d1b0: 3b20 7d3c 2f64 6976 3e0a 3c2f 6469 763e ; }
.
│ │ │ -0000d1c0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -0000d230: 6120 6964 3d22 6c30 3033 3930 2220 6e61 a id="l00390" na │ │ │ -0000d240: 6d65 3d22 6c30 3033 3930 223e 3c2f 613e me="l00390"> │ │ │ -0000d250: 3c73 7061 6e20 636c 6173 733d 226c 696e 390 voi │ │ │ -0000d290: 643c 2f73 7061 6e3e 2073 6574 5f66 6163 d set_fac │ │ │ -0000d2a0: 655f 6861 6e64 6c65 283c 6120 636c 6173 e_handle(HalfedgeHa │ │ │ -0000d2e0: 6e64 6c65 3c2f 613e 205f 6865 682c 203c ndle _heh, < │ │ │ -0000d2f0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -0000d300: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -0000d310: 3032 3537 342e 6874 6d6c 223e 4661 6365 02574.html">Face │ │ │ -0000d320: 4861 6e64 6c65 3c2f 613e 205f 6668 293c Handle _fh)< │ │ │ -0000d330: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000d380: 3339 313c 2f73 7061 6e3e 2020 7b3c 2f64 391 {.
39 │ │ │ -0000d3e0: 323c 2f73 7061 6e3e 3c73 7061 6e20 636c 2// │ │ │ -0000d400: 2020 2020 2061 7373 6572 7428 6973 5f76 assert(is_v │ │ │ -0000d410: 616c 6964 5f68 616e 646c 6528 5f66 6829 alid_handle(_fh) │ │ │ -0000d420: 293b 3c2f 7370 616e 3e3c 2f64 6976 3e0a );
. │ │ │ -0000d430: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 │ │ │ -0000d4b0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -0000d510: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000d520: 3e3c 6120 6964 3d22 6c30 3033 3935 2220 > 395
.
396 │ │ │ -0000d5c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ -0000d5e0: 2f73 7061 6e3e 2073 6574 5f62 6f75 6e64 /span> set_bound │ │ │ -0000d5f0: 6172 7928 4861 6c66 6564 6765 4861 6e64 ary(HalfedgeHand │ │ │ -0000d600: 6c65 205f 6865 6829 3c2f 6469 763e 0a3c le _heh)
.< │ │ │ -0000d610: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000d620: 3e3c 6120 6964 3d22 6c30 3033 3937 2220 > 397 { halfedge( │ │ │ -0000d670: 5f68 6568 292e 6661 6365 5f68 616e 646c _heh).face_handl │ │ │ -0000d680: 655f 2e3c 6120 636c 6173 733d 2263 6f64 e_.invalidate(); }
. │ │ │ -0000d700: 3c61 2069 643d 226c 3030 3339 3822 206e 398
.
. │ │ │ -0000d790: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -0000d7c0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 4 │ │ │ -0000d820: 3030 3c2f 613e 3c2f 7370 616e 3e20 203c 00 < │ │ │ -0000d830: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0000d840: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype">bool is_boundar │ │ │ -0000d8b0: 793c 2f61 3e28 3c61 2063 6c61 7373 3d22 y(HalfedgeHandl │ │ │ -0000d8f0: 653c 2f61 3e20 5f68 6568 293c 7370 616e e _heh) const.
4 │ │ │ -0000d970: 3031 3c2f 7370 616e 3e3c 7370 616e 2063 01 │ │ │ -0000d990: 203c 2f73 7061 6e3e 7b20 3c73 7061 6e20 { return !face_handle(_ │ │ │ -0000d9d0: 6865 6829 2e69 735f 7661 6c69 6428 293b heh).is_valid(); │ │ │ -0000d9e0: 207d 3c2f 6469 763e 0a3c 2f64 6976 3e0a }
.
. │ │ │ -0000d9f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
.
│ │ │ -0000db20: 2034 3033 3c2f 613e 3c2f 7370 616e 3e20 403 │ │ │ -0000db30: 203c 6120 636c 6173 733d 2263 6f64 6520 Ha │ │ │ -0000db60: 6c66 6564 6765 4861 6e64 6c65 3c2f 613e lfedgeHandle │ │ │ -0000db70: 206e 6578 745f 6861 6c66 6564 6765 5f68 next_halfedge_h │ │ │ -0000db80: 616e 646c 6528 3c61 2063 6c61 7373 3d22 andle(HalfedgeHandl │ │ │ -0000dbc0: 653c 2f61 3e20 5f68 6568 293c 7370 616e e _heh) const.
4 │ │ │ -0000dc40: 3034 3c2f 7370 616e 3e3c 7370 616e 2063 04 │ │ │ -0000dc60: 203c 2f73 7061 6e3e 7b20 3c73 7061 6e20 { return halfedge(_heh) │ │ │ -0000dca0: 2e6e 6578 745f 6861 6c66 6564 6765 5f68 .next_halfedge_h │ │ │ -0000dcb0: 616e 646c 655f 3b20 7d3c 2f64 6976 3e0a andle_; }
. │ │ │ -0000dcc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000dd10: 2034 3035 3c2f 7370 616e 3e20 3c2f 6469 405 .
406 │ │ │ -0000dd70: 3c2f 7370 616e 3e20 203c 7370 616e 2063 void s │ │ │ -0000dda0: 6574 5f6e 6578 745f 6861 6c66 6564 6765 et_next_halfedge │ │ │ -0000ddb0: 5f68 616e 646c 6528 3c61 2063 6c61 7373 _handle(HalfedgeHan │ │ │ -0000ddf0: 646c 653c 2f61 3e20 5f68 6568 2c20 3c61 dle _heh, Halfe │ │ │ -0000de30: 6467 6548 616e 646c 653c 2f61 3e20 5f6e dgeHandle _n │ │ │ -0000de40: 6865 6829 3c2f 6469 763e 0a3c 6469 7620 heh)
.
407 │ │ │ -0000dea0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
408 │ │ │ -0000df00: 2061 7373 6572 7428 6973 5f76 616c 6964 assert(is_valid │ │ │ -0000df10: 5f68 616e 646c 6528 5f6e 6865 6829 293b _handle(_nheh)); │ │ │ -0000df20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000df70: 2034 3039 3c2f 7370 616e 3e3c 7370 616e 409// assert(t │ │ │ -0000dfa0: 6f5f 7665 7274 6578 5f68 616e 646c 6528 o_vertex_handle( │ │ │ -0000dfb0: 5f68 6568 2920 3d3d 2066 726f 6d5f 7665 _heh) == from_ve │ │ │ -0000dfc0: 7274 6578 5f68 616e 646c 6528 5f6e 6865 rtex_handle(_nhe │ │ │ -0000dfd0: 6829 293b 3c2f 7370 616e 3e3c 2f64 6976 h));
.
410< │ │ │ -0000e030: 2f73 7061 6e3e 2020 2020 6861 6c66 6564 /span> halfed │ │ │ -0000e040: 6765 285f 6865 6829 2e6e 6578 745f 6861 ge(_heh).next_ha │ │ │ -0000e050: 6c66 6564 6765 5f68 616e 646c 655f 203d lfedge_handle_ = │ │ │ -0000e060: 205f 6e68 6568 3b3c 2f64 6976 3e0a 3c64 _nheh;
. │ │ │ -0000e080: 3c61 2069 643d 226c 3030 3431 3122 206e 411 set_prev_h │ │ │ -0000e0d0: 616c 6665 6467 655f 6861 6e64 6c65 285f alfedge_handle(_ │ │ │ -0000e0e0: 6e68 6568 2c20 5f68 6568 293b 3c2f 6469 nheh, _heh);.
412 │ │ │ -0000e140: 3c2f 7370 616e 3e20 207d 3c2f 6469 763e }
│ │ │ -0000e150: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -0000e1c0: 6120 6964 3d22 6c30 3034 3134 2220 6e61 a id="l00414" na │ │ │ -0000e1d0: 6d65 3d22 6c30 3034 3134 223e 3c2f 613e me="l00414"> │ │ │ -0000e1e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 414
.
415 < │ │ │ -0000e260: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0000e270: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void set_prev_ha │ │ │ -0000e290: 6c66 6564 6765 5f68 616e 646c 6528 4861 lfedge_handle(Ha │ │ │ -0000e2a0: 6c66 6564 6765 4861 6e64 6c65 205f 6865 lfedgeHandle _he │ │ │ -0000e2b0: 682c 2048 616c 6665 6467 6548 616e 646c h, HalfedgeHandl │ │ │ -0000e2c0: 6520 5f70 6865 6829 3c2f 6469 763e 0a3c e _pheh)
.< │ │ │ -0000e2d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000e2e0: 3e3c 6120 6964 3d22 6c30 3034 3136 2220 > 416 {
.< │ │ │ -0000e340: 6120 6964 3d22 6c30 3034 3137 2220 6e61 a id="l00417" na │ │ │ -0000e350: 6d65 3d22 6c30 3034 3137 223e 3c2f 613e me="l00417"> │ │ │ -0000e360: 3c73 7061 6e20 636c 6173 733d 226c 696e 417 assert(is_v │ │ │ -0000e390: 616c 6964 5f68 616e 646c 6528 5f70 6865 alid_handle(_phe │ │ │ -0000e3a0: 6829 293b 3c2f 6469 763e 0a3c 6469 7620 h));
.
418 │ │ │ -0000e400: 2020 2073 6574 5f70 7265 765f 6861 6c66 set_prev_half │ │ │ -0000e410: 6564 6765 5f68 616e 646c 6528 5f68 6568 edge_handle(_heh │ │ │ -0000e420: 2c20 5f70 6865 682c 2048 6173 5072 6576 , _pheh, HasPrev │ │ │ -0000e430: 4861 6c66 6564 6765 2829 293b 3c2f 6469 Halfedge());.
419 │ │ │ -0000e490: 3c2f 7370 616e 3e20 207d 3c2f 6469 763e }
│ │ │ -0000e4a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -0000e510: 6120 6964 3d22 6c30 3034 3231 2220 6e61 a id="l00421" na │ │ │ -0000e520: 6d65 3d22 6c30 3034 3231 223e 3c2f 613e me="l00421"> │ │ │ -0000e530: 3c73 7061 6e20 636c 6173 733d 226c 696e 421 voi │ │ │ -0000e570: 643c 2f73 7061 6e3e 2073 6574 5f70 7265 d set_pre │ │ │ -0000e580: 765f 6861 6c66 6564 6765 5f68 616e 646c v_halfedge_handl │ │ │ -0000e590: 6528 4861 6c66 6564 6765 4861 6e64 6c65 e(HalfedgeHandle │ │ │ -0000e5a0: 205f 6865 682c 2048 616c 6665 6467 6548 _heh, HalfedgeH │ │ │ -0000e5b0: 616e 646c 6520 5f70 6865 682c 3c2f 6469 andle _pheh,.
422 │ │ │ -0000e610: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ -0000e620: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0000e630: 2020 2020 2020 2047 656e 5072 6f67 3a3a GenProg:: │ │ │ -0000e640: 5472 7565 5479 7065 293c 2f64 6976 3e0a TrueType)
. │ │ │ -0000e650: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ -0000e6f0: 3c61 2069 643d 226c 3030 3432 3422 206e 424
.
425 │ │ │ -0000e790: 3c73 7061 6e20 636c 6173 733d 226b 6579 void set_prev_h │ │ │ -0000e7c0: 616c 6665 6467 655f 6861 6e64 6c65 2848 alfedge_handle(H │ │ │ -0000e7d0: 616c 6665 6467 6548 616e 646c 6520 3c73 alfedgeHandle /* _heh */, HalfedgeH │ │ │ -0000e810: 616e 646c 6520 3c73 7061 6e20 636c 6173 andle /* _ │ │ │ -0000e830: 7068 6568 202a 2f3c 2f73 7061 6e3e 2c3c pheh */,< │ │ │ -0000e840: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000e890: 3432 363c 2f73 7061 6e3e 2020 2020 2020 426 │ │ │ -0000e8a0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0000e8b0: 2020 2020 2020 2020 2020 4765 6e50 726f GenPro │ │ │ -0000e8c0: 673a 3a46 616c 7365 5479 7065 293c 2f64 g::FalseType).
42 │ │ │ -0000e920: 373c 2f73 7061 6e3e 2020 7b7d 3c2f 6469 7 {}.
428 │ │ │ -0000e980: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -0000e990: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ -0000e9a0: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ -0000e9b0: 6e30 3034 3239 2220 6461 7461 2d73 7461 n00429" data-sta │ │ │ -0000e9c0: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ -0000e9d0: 227d 223e 0a3c 6469 7620 636c 6173 733d "}">..
│ │ │ -0000eb80: 2020 3433 303c 2f73 7061 6e3e 3c73 7061 430 { return prev_halfed │ │ │ -0000ebe0: 6765 5f68 616e 646c 6528 5f68 6568 2c20 ge_handle(_heh, │ │ │ -0000ebf0: 4861 7350 7265 7648 616c 6665 6467 6528 HasPrevHalfedge( │ │ │ -0000ec00: 2920 293b 207d 3c2f 6469 763e 0a3c 2f64 ) ); }
..
43 │ │ │ -0000ec60: 313c 2f73 7061 6e3e 203c 2f64 6976 3e0a 1
. │ │ │ -0000ec70: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
.
432 HalfedgeHandle │ │ │ -0000ed90: 3c2f 613e 2070 7265 765f 6861 6c66 6564 prev_halfed │ │ │ -0000eda0: 6765 5f68 616e 646c 6528 3c61 2063 6c61 ge_handle(HalfedgeH │ │ │ -0000ede0: 616e 646c 653c 2f61 3e20 5f68 6568 2c20 andle _heh, │ │ │ -0000edf0: 4765 6e50 726f 673a 3a54 7275 6554 7970 GenProg::TrueTyp │ │ │ -0000ee00: 6529 3c73 7061 6e20 636c 6173 733d 226b e) const
.
< │ │ │ -0000ee60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0000ee70: 6e6f 223e 2020 3433 333c 2f73 7061 6e3e no"> 433 │ │ │ -0000ee80: 3c73 7061 6e20 636c 6173 733d 226b 6579 { │ │ │ -0000eea0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur │ │ │ -0000eec0: 6e3c 2f73 7061 6e3e 2068 616c 6665 6467 n halfedg │ │ │ -0000eed0: 6528 5f68 6568 292e 7072 6576 5f68 616c e(_heh).prev_hal │ │ │ -0000eee0: 6665 6467 655f 6861 6e64 6c65 5f3b 207d fedge_handle_; } │ │ │ -0000eef0: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ -0000ef10: 3c61 2069 643d 226c 3030 3433 3422 206e 434
.
. │ │ │ -0000efa0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -0000efd0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 4 │ │ │ -0000f030: 3335 3c2f 613e 3c2f 7370 616e 3e20 203c 35 < │ │ │ -0000f040: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -0000f050: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -0000f060: 3032 3536 362e 6874 6d6c 223e 4861 6c66 02566.html">Half │ │ │ -0000f070: 6564 6765 4861 6e64 6c65 3c2f 613e 2070 edgeHandle p │ │ │ -0000f080: 7265 765f 6861 6c66 6564 6765 5f68 616e rev_halfedge_han │ │ │ -0000f090: 646c 6528 3c61 2063 6c61 7373 3d22 636f dle(HalfedgeHandle< │ │ │ -0000f0d0: 2f61 3e20 5f68 6568 2c20 4765 6e50 726f /a> _heh, GenPro │ │ │ -0000f0e0: 673a 3a46 616c 7365 5479 7065 293c 7370 g::FalseType) const │ │ │ -0000f110: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000f160: 2034 3336 3c2f 7370 616e 3e3c 7370 616e 436 {
.
437< │ │ │ -0000f1e0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> if (i │ │ │ -0000f210: 735f 626f 756e 6461 7279 285f 6865 6829 s_boundary(_heh) │ │ │ -0000f220: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ -0000f270: 2020 3433 383c 2f73 7061 6e3e 2020 2020 438 │ │ │ -0000f280: 7b3c 7370 616e 2063 6c61 7373 3d22 636f {//iterati │ │ │ -0000f2a0: 6e67 2061 726f 756e 6420 7468 6520 7665 ng around the ve │ │ │ -0000f2b0: 7274 6578 2073 686f 756c 6420 6265 2066 rtex should be f │ │ │ -0000f2c0: 6173 7465 7220 7468 616e 2069 7465 7261 aster than itera │ │ │ -0000f2d0: 7469 6e67 2074 6865 2062 6f75 6e64 6172 ting the boundar │ │ │ -0000f2e0: 793c 2f73 7061 6e3e 3c2f 6469 763e 0a3c y
.< │ │ │ -0000f2f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0000f300: 3e3c 6120 6964 3d22 6c30 3034 3339 2220 > 439 HalfedgeHa │ │ │ -0000f380: 6e64 6c65 3c2f 613e 2063 7572 725f 6865 ndle curr_he │ │ │ -0000f390: 6828 6f70 706f 7369 7465 5f68 616c 6665 h(opposite_halfe │ │ │ -0000f3a0: 6467 655f 6861 6e64 6c65 285f 6865 6829 dge_handle(_heh) │ │ │ -0000f3b0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
440 │ │ │ -0000f410: 2020 203c 6120 636c 6173 733d 2263 6f64 │ │ │ -0000f440: 4861 6c66 6564 6765 4861 6e64 6c65 3c2f HalfedgeHandle next_heh(next │ │ │ -0000f460: 5f68 616c 6665 6467 655f 6861 6e64 6c65 _halfedge_handle │ │ │ -0000f470: 2863 7572 725f 6865 6829 293b 3c2f 6469 (curr_heh));.
441 │ │ │ -0000f4d0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 do │ │ │ -0000f500: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000f550: 2034 3432 3c2f 7370 616e 3e20 2020 2020 442 │ │ │ -0000f560: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
443 │ │ │ -0000f5c0: 2020 2020 2063 7572 725f 6865 6820 3d20 curr_heh = │ │ │ -0000f5d0: 6f70 706f 7369 7465 5f68 616c 6665 6467 opposite_halfedg │ │ │ -0000f5e0: 655f 6861 6e64 6c65 286e 6578 745f 6865 e_handle(next_he │ │ │ -0000f5f0: 6829 3b3c 2f64 6976 3e0a 3c64 6976 2063 h);
.
444 │ │ │ -0000f650: 2020 2020 2020 6e65 7874 5f68 6568 203d next_heh = │ │ │ -0000f660: 206e 6578 745f 6861 6c66 6564 6765 5f68 next_halfedge_h │ │ │ -0000f670: 616e 646c 6528 6375 7272 5f68 6568 293b andle(curr_heh); │ │ │ -0000f680: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000f6d0: 2034 3435 3c2f 7370 616e 3e20 2020 2020 445 │ │ │ -0000f6e0: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
446 │ │ │ -0000f740: 2020 203c 7370 616e 2063 6c61 7373 3d22 whi │ │ │ -0000f760: 6c65 3c2f 7370 616e 3e20 286e 6578 745f le (next_ │ │ │ -0000f770: 6865 6820 213d 205f 6865 6829 3b3c 2f64 heh != _heh);.
44 │ │ │ -0000f7d0: 373c 2f73 7061 6e3e 2020 2020 2020 3c73 7 return curr_heh;< │ │ │ -0000f810: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000f860: 3434 383c 2f73 7061 6e3e 2020 2020 7d3c 448 }< │ │ │ -0000f870: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000f8c0: 3434 393c 2f73 7061 6e3e 2020 2020 3c73 449 else
.
450 │ │ │ -0000f950: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
.
451 │ │ │ -0000f9b0: 2020 2020 3c61 2063 6c61 7373 3d22 636f HalfedgeHandle< │ │ │ -0000f9f0: 2f61 3e20 2068 6568 285f 6865 6829 3b3c /a> heh(_heh);< │ │ │ -0000fa00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000fa50: 3435 323c 2f73 7061 6e3e 2020 2020 2020 452 │ │ │ -0000fa60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Hal │ │ │ -0000fa90: 6665 6467 6548 616e 646c 653c 2f61 3e20 fedgeHandle │ │ │ -0000faa0: 206e 6578 745f 6865 6828 6e65 7874 5f68 next_heh(next_h │ │ │ -0000fab0: 616c 6665 6467 655f 6861 6e64 6c65 2868 alfedge_handle(h │ │ │ -0000fac0: 6568 2929 3b3c 2f64 6976 3e0a 3c64 6976 eh));
.
< │ │ │ -0000fb00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0000fb10: 6e6f 223e 2020 3435 333c 2f73 7061 6e3e no"> 453 │ │ │ -0000fb20: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ -0000fb40: 7768 696c 653c 2f73 7061 6e3e 2028 6e65 while (ne │ │ │ -0000fb50: 7874 5f68 6568 2021 3d20 5f68 6568 2920 xt_heh != _heh) │ │ │ -0000fb60: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ -0000fbb0: 2020 3435 343c 2f73 7061 6e3e 2020 2020 454 │ │ │ -0000fbc0: 2020 2020 6865 6820 3d20 6e65 7874 5f68 heh = next_h │ │ │ -0000fbd0: 6568 3b3c 2f64 6976 3e0a 3c64 6976 2063 eh;
.
455 │ │ │ -0000fc30: 2020 2020 2020 6e65 7874 5f68 6568 203d next_heh = │ │ │ -0000fc40: 206e 6578 745f 6861 6c66 6564 6765 5f68 next_halfedge_h │ │ │ -0000fc50: 616e 646c 6528 6e65 7874 5f68 6568 293b andle(next_heh); │ │ │ -0000fc60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000fcb0: 2034 3536 3c2f 7370 616e 3e20 2020 2020 456 │ │ │ -0000fcc0: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
457 │ │ │ -0000fd20: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret │ │ │ -0000fd40: 7572 6e3c 2f73 7061 6e3e 2068 6568 3b3c urn heh;< │ │ │ -0000fd50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000fda0: 3435 383c 2f73 7061 6e3e 2020 2020 7d3c 458 }< │ │ │ -0000fdb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0000fe00: 3435 393c 2f73 7061 6e3e 2020 7d3c 2f64 459 }.
.
460 │ │ │ -0000fe70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0000fec0: 2034 3631 3c2f 7370 616e 3e20 3c2f 6469 461 .
.
462< │ │ │ -0000ffb0: 2f73 7061 6e3e 2020 3c61 2063 6c61 7373 /span> HalfedgeHan │ │ │ -0000fff0: 646c 653c 2f61 3e20 6f70 706f 7369 7465 dle opposite │ │ │ -00010000: 5f68 616c 6665 6467 655f 6861 6e64 6c65 _halfedge_handle │ │ │ -00010010: 283c 6120 636c 6173 733d 2263 6f64 6520 (Ha │ │ │ -00010040: 6c66 6564 6765 4861 6e64 6c65 3c2f 613e lfedgeHandle │ │ │ -00010050: 205f 6865 6829 3c73 7061 6e20 636c 6173 _heh) con │ │ │ -00010070: 7374 3c2f 7370 616e 3e3c 2f64 6976 3e0a st
. │ │ │ -00010080: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
.
464< │ │ │ -00010220: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00010240: 3c61 2069 643d 226c 3030 3436 3522 206e 465
.
. │ │ │ -000102d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -00010300: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 4 │ │ │ -00010360: 3636 3c2f 613e 3c2f 7370 616e 3e20 203c 66 < │ │ │ -00010370: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -00010380: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct" href="a │ │ │ -00010390: 3032 3536 362e 6874 6d6c 223e 4861 6c66 02566.html">Half │ │ │ -000103a0: 6564 6765 4861 6e64 6c65 3c2f 613e 2063 edgeHandle c │ │ │ -000103b0: 6377 5f72 6f74 6174 6564 5f68 616c 6665 cw_rotated_halfe │ │ │ -000103c0: 6467 655f 6861 6e64 6c65 283c 6120 636c dge_handle(Halfedge │ │ │ -00010400: 4861 6e64 6c65 3c2f 613e 205f 6865 6829 Handle _heh) │ │ │ -00010410: 3c73 7061 6e20 636c 6173 733d 226b 6579 const
.
467 { < │ │ │ -000104b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -000104c0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -000104d0: 2f73 7061 6e3e 206f 7070 6f73 6974 655f /span> opposite_ │ │ │ -000104e0: 6861 6c66 6564 6765 5f68 616e 646c 6528 halfedge_handle( │ │ │ -000104f0: 7072 6576 5f68 616c 6665 6467 655f 6861 prev_halfedge_ha │ │ │ -00010500: 6e64 6c65 285f 6865 6829 293b 207d 3c2f ndle(_heh)); }.
.
< │ │ │ -00010550: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00010560: 6e6f 223e 2020 3436 383c 2f73 7061 6e3e no"> 468 │ │ │ -00010570: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ -000105c0: 2020 3436 393c 2f73 7061 6e3e 203c 2f64 469 .
.
470 │ │ │ -000106b0: 3c2f 7370 616e 3e20 203c 6120 636c 6173 HalfedgeHa │ │ │ -000106f0: 6e64 6c65 3c2f 613e 2063 775f 726f 7461 ndle cw_rota │ │ │ -00010700: 7465 645f 6861 6c66 6564 6765 5f68 616e ted_halfedge_han │ │ │ -00010710: 646c 6528 3c61 2063 6c61 7373 3d22 636f dle(HalfedgeHandle< │ │ │ -00010750: 2f61 3e20 5f68 6568 293c 7370 616e 2063 /a> _heh) │ │ │ -00010770: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
471 │ │ │ -000107d0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 < │ │ │ -000107f0: 2f73 7061 6e3e 7b20 3c73 7061 6e20 636c /span>{ return │ │ │ -00010820: 6e65 7874 5f68 616c 6665 6467 655f 6861 next_halfedge_ha │ │ │ -00010830: 6e64 6c65 286f 7070 6f73 6974 655f 6861 ndle(opposite_ha │ │ │ -00010840: 6c66 6564 6765 5f68 616e 646c 6528 5f68 lfedge_handle(_h │ │ │ -00010850: 6568 2929 3b20 7d3c 2f64 6976 3e0a 3c2f eh)); }
..
4 │ │ │ -000108b0: 3732 3c2f 7370 616e 3e20 3c2f 6469 763e 72
│ │ │ -000108c0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -000108f0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 473 // │ │ │ -00010930: 2d2d 2d20 6564 6765 2063 6f6e 6e65 6374 --- edge connect │ │ │ -00010940: 6976 6974 7920 2d2d 2d3c 2f73 7061 6e3e ivity --- │ │ │ -00010950: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ -000109b0: 6120 6964 3d22 6c30 3034 3734 2220 6e61 a id="l00474" na │ │ │ -000109c0: 6d65 3d22 6c30 3034 3734 223e 3c2f 613e me="l00474"> │ │ │ -000109d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 474< │ │ │ -00010a30: 2f61 3e3c 2f73 7061 6e3e 2020 3c73 7061 /a> static │ │ │ -00010a60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Hal │ │ │ -00010a90: 6665 6467 6548 616e 646c 653c 2f61 3e20 fedgeHandle │ │ │ -00010aa0: 735f 6861 6c66 6564 6765 5f68 616e 646c s_halfedge_handl │ │ │ -00010ab0: 6528 3c61 2063 6c61 7373 3d22 636f 6465 e(E │ │ │ -00010ae0: 6467 6548 616e 646c 653c 2f61 3e20 5f65 dgeHandle _e │ │ │ -00010af0: 682c 203c 7370 616e 2063 6c61 7373 3d22 h, uns │ │ │ -00010b10: 6967 6e65 643c 2f73 7061 6e3e 203c 7370 igned int _i = 0)
. │ │ │ -00010b50: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ -00010bc0: 3c61 2069 643d 226c 3030 3437 3622 206e 476 assert(_i& │ │ │ -00010c10: 6c74 3b3d 3129 3b3c 2f64 6976 3e0a 3c64 lt;=1);
. │ │ │ -00010c30: 3c61 2069 643d 226c 3030 3437 3722 206e 477 │ │ │ -00010c90: 7265 7475 726e 3c2f 7370 616e 3e20 3c61 return Halfe │ │ │ -00010cd0: 6467 6548 616e 646c 653c 2f61 3e28 285f dgeHandle((_ │ │ │ -00010ce0: 6568 2e3c 6120 636c 6173 733d 2263 6f64 eh.idx() &l │ │ │ -00010d40: 743b 266c 743b 2031 2920 2b20 5f69 293b t;< 1) + _i); │ │ │ -00010d50: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00010da0: 2034 3738 3c2f 7370 616e 3e20 207d 3c2f 478 }.
.
< │ │ │ -00010df0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00010e00: 6e6f 223e 2020 3437 393c 2f73 7061 6e3e no"> 479 │ │ │ -00010e10: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
. │ │ │ -00010e70: 3c61 2069 643d 226c 3030 3438 3022 206e 480 │ │ │ -00010ef0: 3c2f 613e 3c2f 7370 616e 3e20 203c 7370 static │ │ │ -00010f20: 203c 6120 636c 6173 733d 2263 6f64 6520 Ed │ │ │ -00010f50: 6765 4861 6e64 6c65 3c2f 613e 2073 5f65 geHandle s_e │ │ │ -00010f60: 6467 655f 6861 6e64 6c65 283c 6120 636c dge_handle(Halfedge │ │ │ -00010fa0: 4861 6e64 6c65 3c2f 613e 205f 6865 6829 Handle _heh) │ │ │ -00010fb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00011000: 2034 3831 3c2f 7370 616e 3e20 207b 203c 481 { < │ │ │ -00011010: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -00011020: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -00011030: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> EdgeHandle(_heh.idx │ │ │ -000110d0: 2829 2026 6774 3b26 6774 3b20 3129 3b20 () >> 1); │ │ │ -000110e0: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
.
.< │ │ │ -000110f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00011100: 3e3c 6120 6964 3d22 6c30 3034 3832 2220 > 482
.
│ │ │ -00011190: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -000111c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d │ │ │ -00011220: 3438 333c 2f61 3e3c 2f73 7061 6e3e 2020 483 │ │ │ -00011230: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Hal │ │ │ -00011260: 6665 6467 6548 616e 646c 653c 2f61 3e20 fedgeHandle │ │ │ -00011270: 6861 6c66 6564 6765 5f68 616e 646c 6528 halfedge_handle( │ │ │ -00011280: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Edg │ │ │ -000112b0: 6548 616e 646c 653c 2f61 3e20 5f65 682c eHandle _eh, │ │ │ -000112c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 unsig │ │ │ -000112e0: 6e65 643c 2f73 7061 6e3e 203c 7370 616e ned int │ │ │ -00011310: 5f69 203d 2030 293c 7370 616e 2063 6c61 _i = 0) co │ │ │ -00011330: 6e73 743c 2f73 7061 6e3e 3c2f 6469 763e nst
│ │ │ -00011340: 0a3c 6469 7620 636c 6173 733d 226c 696e .
.
< │ │ │ -000113f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00011400: 6e6f 223e 2020 3438 353c 2f73 7061 6e3e no"> 485 │ │ │ -00011410: 2020 2020 2020 3c73 7061 6e20 636c 6173 │ │ │ -00011430: 7265 7475 726e 3c2f 7370 616e 3e20 735f return s_ │ │ │ -00011440: 6861 6c66 6564 6765 5f68 616e 646c 6528 halfedge_handle( │ │ │ -00011450: 5f65 682c 205f 6929 3b3c 2f64 6976 3e0a _eh, _i);
. │ │ │ -00011460: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
..
4 │ │ │ -00011510: 3837 3c2f 7370 616e 3e20 3c2f 6469 763e 87
│ │ │ -00011520: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
.
< │ │ │ -000115b0: 6120 636c 6173 733d 226c 696e 6522 2068 a class="line" h │ │ │ -000115c0: 7265 663d 2261 3032 3633 302e 6874 6d6c ref="a02630.html │ │ │ -000115d0: 2361 6338 6261 3330 6361 6463 3633 6435 #ac8ba30cadc63d5 │ │ │ -000115e0: 6336 6333 6561 3834 6266 6539 3731 6361 c6c3ea84bfe971ca │ │ │ -000115f0: 3162 223e 2020 3438 383c 2f61 3e3c 2f73 1b"> 488 EdgeHandle edge_handle(Halfe │ │ │ -00011680: 6467 6548 616e 646c 653c 2f61 3e20 5f68 dgeHandle _h │ │ │ -00011690: 6568 293c 7370 616e 2063 6c61 7373 3d22 eh) const< │ │ │ -000116b0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ -000116d0: 6120 6964 3d22 6c30 3034 3839 2220 6e61 a id="l00489" na │ │ │ -000116e0: 6d65 3d22 6c30 3034 3839 223e 3c2f 613e me="l00489"> │ │ │ -000116f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 489 │ │ │ -00011730: 7b20 3c73 7061 6e20 636c 6173 733d 226b { retu │ │ │ -00011750: 726e 3c2f 7370 616e 3e20 735f 6564 6765 rn s_edge │ │ │ -00011760: 5f68 616e 646c 6528 5f68 6568 293b 207d _handle(_heh); } │ │ │ -00011770: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
.
. │ │ │ -00011790: 3c61 2069 643d 226c 3030 3439 3022 206e 490
.
491 │ │ │ -00011830: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // --- fac │ │ │ -00011850: 6520 636f 6e6e 6563 7469 7669 7479 202d e connectivity - │ │ │ -00011860: 2d2d 3c2f 7370 616e 3e3c 2f64 6976 3e0a --
. │ │ │ -00011870: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
.
492 HalfedgeHandle │ │ │ -00011990: 3c2f 613e 2068 616c 6665 6467 655f 6861 halfedge_ha │ │ │ -000119a0: 6e64 6c65 283c 6120 636c 6173 733d 2263 ndle(FaceHandle │ │ │ -000119e0: 205f 6668 293c 7370 616e 2063 6c61 7373 _fh) cons │ │ │ -00011a00: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
.< │ │ │ -00011a10: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00011a20: 3e3c 6120 6964 3d22 6c30 3034 3933 2220 > 493 { re │ │ │ -00011aa0: 7475 726e 3c2f 7370 616e 3e20 6661 6365 turn face │ │ │ -00011ab0: 285f 6668 292e 6861 6c66 6564 6765 5f68 (_fh).halfedge_h │ │ │ -00011ac0: 616e 646c 655f 3b20 7d3c 2f64 6976 3e0a andle_; }
. │ │ │ -00011ad0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00011b20: 2034 3934 3c2f 7370 616e 3e20 3c2f 6469 494 .
495 │ │ │ -00011b80: 3c2f 7370 616e 3e20 203c 7370 616e 2063 void s │ │ │ -00011bb0: 6574 5f68 616c 6665 6467 655f 6861 6e64 et_halfedge_hand │ │ │ -00011bc0: 6c65 283c 6120 636c 6173 733d 2263 6f64 le( │ │ │ -00011bf0: 4661 6365 4861 6e64 6c65 3c2f 613e 205f FaceHandle _ │ │ │ -00011c00: 6668 2c20 3c61 2063 6c61 7373 3d22 636f fh, HalfedgeHandle< │ │ │ -00011c40: 2f61 3e20 5f68 6568 293c 2f64 6976 3e0a /a> _heh)
. │ │ │ -00011c50: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ -00011cc0: 3c61 2069 643d 226c 3030 3439 3722 206e 497// a │ │ │ -00011d20: 7373 6572 7428 6973 5f76 616c 6964 5f68 ssert(is_valid_h │ │ │ -00011d30: 616e 646c 6528 5f68 6568 2929 3b3c 2f73 andle(_heh));
.
498 │ │ │ -00011da0: 2020 2066 6163 6528 5f66 6829 2e68 616c face(_fh).hal │ │ │ -00011db0: 6665 6467 655f 6861 6e64 6c65 5f20 3d20 fedge_handle_ = │ │ │ -00011dc0: 5f68 6568 3b3c 2f64 6976 3e0a 3c64 6976 _heh;
.
< │ │ │ -00011e00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00011e10: 6e6f 223e 2020 3439 393c 2f73 7061 6e3e no"> 499 │ │ │ -00011e20: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
.
500 < │ │ │ -00011e80: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00011ed0: 3530 323c 2f73 7061 6e3e 2020 3c73 7061 502 //------------ │ │ │ -00011f00: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00011f10: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00011f20: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00011f30: 2076 6572 7465 7820 7374 6174 7573 3c2f vertex status
.
.
│ │ │ -00012020: 2035 3033 3c2f 613e 3c2f 7370 616e 3e20 503 │ │ │ -00012030: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const │ │ │ -00012080: 5374 6174 7573 496e 666f 3c2f 613e 2661 StatusInfo&a │ │ │ -00012090: 6d70 3b20 2020 2020 2020 2020 2020 2020 mp; │ │ │ -000120a0: 2020 2020 2020 2020 2020 2020 3c61 2063 sta │ │ │ -00012100: 7475 733c 2f61 3e28 3c61 2063 6c61 7373 tus(VertexHandl │ │ │ -00012140: 653c 2f61 3e20 5f76 6829 3c73 7061 6e20 e _vh) │ │ │ -00012160: 2063 6f6e 7374 3c2f 7370 616e 3e3c 2f64 const.
50 │ │ │ -000121c0: 343c 2f73 7061 6e3e 3c73 7061 6e20 636c 4 │ │ │ -000121e0: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -00012210: 2070 726f 7065 7274 7928 7665 7274 6578 property(vertex │ │ │ -00012220: 5f73 7461 7475 735f 2c20 5f76 6829 3b20 _status_, _vh); │ │ │ -00012230: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
.
.< │ │ │ -00012240: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00012250: 3e3c 6120 6964 3d22 6c30 3035 3035 2220 > 505
.
506 │ │ │ -000122f0: 2053 7461 7475 7349 6e66 6f26 616d 703b StatusInfo& │ │ │ -00012300: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00012310: 2020 2020 2020 2020 2020 2020 2020 2073 s │ │ │ -00012320: 7461 7475 7328 3c61 2063 6c61 7373 3d22 tatus(VertexHandle< │ │ │ -00012360: 2f61 3e20 5f76 6829 3c2f 6469 763e 0a3c /a> _vh)
.< │ │ │ -00012370: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00012380: 3e3c 6120 6964 3d22 6c30 3035 3037 2220 > 507
{ return p │ │ │ -000123f0: 726f 7065 7274 7928 7665 7274 6578 5f73 roperty(vertex_s │ │ │ -00012400: 7461 7475 735f 2c20 5f76 6829 3b20 7d3c tatus_, _vh); }< │ │ │ -00012410: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00012460: 3530 383c 2f73 7061 6e3e 203c 2f64 6976 508
.
.
│ │ │ -00012500: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 513 void re │ │ │ -000125d0: 7365 745f 7374 6174 7573 3c2f 613e 2829 set_status() │ │ │ -000125e0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
514 │ │ │ -00012640: 2020 203c 6120 636c 6173 733d 2263 6f64 P │ │ │ -00012670: 726f 7065 7274 7954 266c 743b 5374 6174 ropertyT<Stat │ │ │ -00012680: 7573 496e 666f 2667 743b 3c2f 613e 2026 usInfo> & │ │ │ -00012690: 616d 703b 7374 6174 7573 5f70 726f 7020 amp;status_prop │ │ │ -000126a0: 3d20 7072 6f70 6572 7479 2876 6572 7465 = property(verte │ │ │ -000126b0: 785f 7374 6174 7573 5f29 3b3c 2f64 6976 x_status_);
.
515< │ │ │ -00012710: 2f73 7061 6e3e 2020 2020 2020 5072 6f70 /span> Prop │ │ │ -00012720: 6572 7479 5426 6c74 3b53 7461 7475 7349 ertyT<StatusI │ │ │ -00012730: 6e66 6f26 6774 3b3a 3a76 6563 746f 725f nfo>::vector_ │ │ │ -00012740: 7479 7065 2026 616d 703b 7370 726f 705f type &sprop_ │ │ │ -00012750: 7620 3d20 7374 6174 7573 5f70 726f 702e v = status_prop. │ │ │ -00012760: 3c61 2063 6c61 7373 3d22 636f 6465 2068 data_vector │ │ │ -000127c0: 2829 3b3c 2f64 6976 3e0a 3c64 6976 2063 ();
.
516 │ │ │ -00012820: 2020 2020 7374 643a 3a66 696c 6c28 7370 std::fill(sp │ │ │ -00012830: 726f 705f 762e 6265 6769 6e28 292c 2073 rop_v.begin(), s │ │ │ -00012840: 7072 6f70 5f76 2e62 6567 696e 2829 202b prop_v.begin() + │ │ │ -00012850: 206e 5f76 6572 7469 6365 7328 292c 203c n_vertices(), < │ │ │ -00012860: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -00012870: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ -00012880: 3237 3934 2e68 746d 6c22 3e53 7461 7475 2794.html">Statu │ │ │ -00012890: 7349 6e66 6f3c 2f61 3e28 2929 3b3c 2f64 sInfo());.
51 │ │ │ -000128f0: 373c 2f73 7061 6e3e 2020 7d3c 2f64 6976 7 }
.
.
518 .
5 │ │ │ -000129b0: 3139 3c2f 7370 616e 3e20 203c 7370 616e 19 //------------- │ │ │ -000129e0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -000129f0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00012a00: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2068 -------------- h │ │ │ -00012a10: 616c 6665 6467 6520 7374 6174 7573 3c2f alfedge status
.
< │ │ │ -00012a60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00012a70: 6e6f 223e 2020 3532 303c 2f73 7061 6e3e no"> 520 │ │ │ -00012a80: 2020 3c73 7061 6e20 636c 6173 733d 226b const StatusInfo& │ │ │ -00012ab0: 616d 703b 2020 2020 2020 2020 2020 2020 amp; │ │ │ -00012ac0: 2020 2020 2020 2020 2020 2020 2073 7461 sta │ │ │ -00012ad0: 7475 7328 3c61 2063 6c61 7373 3d22 636f tus(HalfedgeHandle< │ │ │ -00012b10: 2f61 3e20 5f68 6829 3c73 7061 6e20 636c /a> _hh) c │ │ │ -00012b30: 6f6e 7374 3c2f 7370 616e 3e3c 2f64 6976 onst
.
521< │ │ │ -00012b90: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> { return p │ │ │ -00012be0: 726f 7065 7274 7928 6861 6c66 6564 6765 roperty(halfedge │ │ │ -00012bf0: 5f73 7461 7475 735f 2c20 5f68 6829 3b20 _status_, _hh); │ │ │ -00012c00: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
522 .
5 │ │ │ -00012cb0: 3233 3c2f 7370 616e 3e20 2053 7461 7475 23 Statu │ │ │ -00012cc0: 7349 6e66 6f26 616d 703b 2020 2020 2020 sInfo& │ │ │ -00012cd0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00012ce0: 2020 2020 2020 2020 2073 7461 7475 7328 status( │ │ │ -00012cf0: 4861 6c66 6564 6765 4861 6e64 6c65 205f HalfedgeHandle _ │ │ │ -00012d00: 6868 293c 2f64 6976 3e0a 3c64 6976 2063 hh)
.
524 │ │ │ -00012d60: 7b20 3c73 7061 6e20 636c 6173 733d 226b { retu │ │ │ -00012d80: 726e 3c2f 7370 616e 3e20 7072 6f70 6572 rn proper │ │ │ -00012d90: 7479 2868 616c 6665 6467 655f 7374 6174 ty(halfedge_stat │ │ │ -00012da0: 7573 5f2c 205f 6868 293b 207d 3c2f 6469 us_, _hh); }.
525 │ │ │ -00012e00: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -00012e10: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00012e20: 3e3c 6120 6964 3d22 6c30 3035 3236 2220 > 526
//--- │ │ │ -00012e80: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00012e90: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00012ea0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00012eb0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2065 6467 ------------ edg │ │ │ -00012ec0: 6520 7374 6174 7573 3c2f 7370 616e 3e3c e status< │ │ │ -00012ed0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00012f20: 3532 373c 2f73 7061 6e3e 2020 3c73 7061 527 const S │ │ │ -00012f50: 7461 7475 7349 6e66 6f26 616d 703b 2020 tatusInfo& │ │ │ -00012f60: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00012f70: 2020 2020 2020 2073 7461 7475 7328 4564 status(Ed │ │ │ -00012f80: 6765 4861 6e64 6c65 205f 6568 293c 7370 geHandle _eh) const │ │ │ -00012fb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00013000: 2035 3238 3c2f 7370 616e 3e3c 7370 616e 528 { return property(edg │ │ │ -00013060: 655f 7374 6174 7573 5f2c 205f 6568 293b e_status_, _eh); │ │ │ -00013070: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
529 .
5 │ │ │ -00013120: 3330 3c2f 7370 616e 3e20 2053 7461 7475 30 Statu │ │ │ -00013130: 7349 6e66 6f26 616d 703b 2020 2020 2020 sInfo& │ │ │ -00013140: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00013150: 2020 2020 2020 2020 2073 7461 7475 7328 status( │ │ │ -00013160: 4564 6765 4861 6e64 6c65 205f 6568 293c EdgeHandle _eh)< │ │ │ -00013170: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -000131c0: 3533 313c 2f73 7061 6e3e 2020 7b20 3c73 531 { return property(e │ │ │ -00013200: 6467 655f 7374 6174 7573 5f2c 205f 6568 dge_status_, _eh │ │ │ -00013210: 293b 207d 3c2f 6469 763e 0a3c 6469 7620 ); }
.
532 │ │ │ -00013270: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000132c0: 2035 3333 3c2f 7370 616e 3e20 203c 7370 533 //----------- │ │ │ -000132f0: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00013300: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00013310: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- │ │ │ -00013320: 2d2d 2d2d 2066 6163 6520 7374 6174 7573 ---- face status │ │ │ -00013330: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00013350: 3c61 2069 643d 226c 3030 3533 3422 206e 534 const< │ │ │ -000133b0: 2f73 7061 6e3e 2053 7461 7475 7349 6e66 /span> StatusInf │ │ │ -000133c0: 6f26 616d 703b 2020 2020 2020 2020 2020 o& │ │ │ -000133d0: 2020 2020 2020 2020 2020 2020 2020 2073 s │ │ │ -000133e0: 7461 7475 7328 4661 6365 4861 6e64 6c65 tatus(FaceHandle │ │ │ -000133f0: 205f 6668 293c 7370 616e 2063 6c61 7373 _fh) cons │ │ │ -00013410: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
.< │ │ │ -00013420: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00013430: 3e3c 6120 6964 3d22 6c30 3035 3335 2220 > 535
{ re │ │ │ -000134b0: 7475 726e 3c2f 7370 616e 3e20 7072 6f70 turn prop │ │ │ -000134c0: 6572 7479 2866 6163 655f 7374 6174 7573 erty(face_status │ │ │ -000134d0: 5f2c 205f 6668 293b 207d 3c2f 6469 763e _, _fh); }
│ │ │ -000134e0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -00013550: 6120 6964 3d22 6c30 3035 3337 2220 6e61 a id="l00537" na │ │ │ -00013560: 6d65 3d22 6c30 3035 3337 223e 3c2f 613e me="l00537"> │ │ │ -00013570: 3c73 7061 6e20 636c 6173 733d 226c 696e 537 StatusInfo&am │ │ │ -000135a0: 703b 2020 2020 2020 2020 2020 2020 2020 p; │ │ │ -000135b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000135c0: 2073 7461 7475 7328 4661 6365 4861 6e64 status(FaceHand │ │ │ -000135d0: 6c65 205f 6668 293c 2f64 6976 3e0a 3c64 le _fh)
. │ │ │ -000135f0: 3c61 2069 643d 226c 3030 3533 3822 206e 538
{ │ │ │ -00013650: 7265 7475 726e 3c2f 7370 616e 3e20 7072 return pr │ │ │ -00013660: 6f70 6572 7479 2866 6163 655f 7374 6174 operty(face_stat │ │ │ -00013670: 7573 5f2c 205f 6668 293b 207d 3c2f 6469 us_, _fh); }.
539 │ │ │ -000136d0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
.< │ │ │ -000136e0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000136f0: 3e3c 6120 6964 3d22 6c30 3035 3430 2220 > 540 inlin │ │ │ -00013750: 653c 2f73 7061 6e3e 203c 7370 616e 2063 e bool │ │ │ -00013780: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00013790: 2020 2020 2020 2020 2020 2020 2068 6173 has │ │ │ -000137a0: 5f76 6572 7465 785f 7374 6174 7573 2829 _vertex_status() │ │ │ -000137b0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const
.
541 { < │ │ │ -00013850: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -00013860: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -00013870: 2f73 7061 6e3e 2076 6572 7465 785f 7374 /span> vertex_st │ │ │ -00013880: 6174 7573 5f2e 6973 5f76 616c 6964 2829 atus_.is_valid() │ │ │ -00013890: 3b20 2020 207d 3c2f 6469 763e 0a3c 6469 ; }
.< │ │ │ -000138b0: 6120 6964 3d22 6c30 3035 3432 2220 6e61 a id="l00542" na │ │ │ -000138c0: 6d65 3d22 6c30 3035 3432 223e 3c2f 613e me="l00542"> │ │ │ -000138d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 542
.
543 < │ │ │ -00013950: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -00013960: 6f72 6422 3e69 6e6c 696e 653c 2f73 7061 ord">inline boo │ │ │ -00013990: 6c3c 2f73 7061 6e3e 2020 2020 2020 2020 l │ │ │ -000139a0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000139b0: 2020 2020 2020 2068 6173 5f68 616c 6665 has_halfe │ │ │ -000139c0: 6467 655f 7374 6174 7573 2829 3c73 7061 dge_status() const< │ │ │ -000139f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00013a40: 3534 343c 2f73 7061 6e3e 3c73 7061 6e20 544 │ │ │ -00013a60: 2020 3c2f 7370 616e 3e7b 203c 7370 616e { return halfedge_stat │ │ │ -00013aa0: 7573 5f2e 6973 5f76 616c 6964 2829 3b20 us_.is_valid(); │ │ │ -00013ab0: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
545 .
5 │ │ │ -00013b60: 3436 3c2f 7370 616e 3e20 203c 7370 616e 46 inline < │ │ │ -00013b90: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -00013ba0: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype">bool │ │ │ -00013bc0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00013bd0: 2020 2068 6173 5f65 6467 655f 7374 6174 has_edge_stat │ │ │ -00013be0: 7573 2829 3c73 7061 6e20 636c 6173 733d us() const │ │ │ -00013c00: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00013c20: 3c61 2069 643d 226c 3030 3534 3722 206e 547 { ret │ │ │ -00013ca0: 7572 6e3c 2f73 7061 6e3e 2065 6467 655f urn edge_ │ │ │ -00013cb0: 7374 6174 7573 5f2e 6973 5f76 616c 6964 status_.is_valid │ │ │ -00013cc0: 2829 3b20 7d3c 2f64 6976 3e0a 3c64 6976 (); }
.
< │ │ │ -00013d00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00013d10: 6e6f 223e 2020 3534 383c 2f73 7061 6e3e no"> 548 │ │ │ -00013d20: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ -00013d70: 2020 3534 393c 2f73 7061 6e3e 2020 3c73 549 inline bool │ │ │ -00013dc0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 │ │ │ -00013dd0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00013de0: 2020 2020 2020 6861 735f 6661 6365 5f73 has_face_s │ │ │ -00013df0: 7461 7475 7328 293c 7370 616e 2063 6c61 tatus() co │ │ │ -00013e10: 6e73 743c 2f73 7061 6e3e 3c2f 6469 763e nst
│ │ │ -00013e20: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00013e50: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 550 { │ │ │ -00013eb0: 7265 7475 726e 3c2f 7370 616e 3e20 6661 return fa │ │ │ -00013ec0: 6365 5f73 7461 7475 735f 2e69 735f 7661 ce_status_.is_va │ │ │ -00013ed0: 6c69 6428 293b 207d 3c2f 6469 763e 0a3c lid(); }
.< │ │ │ -00013ee0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00013ef0: 3e3c 6120 6964 3d22 6c30 3035 3531 2220 > 551
.
552 │ │ │ -00013f90: 203c 7370 616e 2063 6c61 7373 3d22 6b65 inline VertexStatu │ │ │ -00013fc0: 7350 726f 7065 7274 7948 616e 646c 6520 sPropertyHandle │ │ │ -00013fd0: 2020 2020 2020 2020 7665 7274 6578 5f73 vertex_s │ │ │ -00013fe0: 7461 7475 735f 7070 6828 293c 7370 616e tatus_pph() const.
5 │ │ │ -00014060: 3533 3c2f 7370 616e 3e3c 7370 616e 2063 53 │ │ │ -00014080: 203c 2f73 7061 6e3e 7b20 3c73 7061 6e20 { return vertex_status_ │ │ │ -000140c0: 3b20 207d 3c2f 6469 763e 0a3c 6469 7620 ; }
.
554 │ │ │ -00014120: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00014170: 2035 3535 3c2f 7370 616e 3e20 203c 7370 555 inline │ │ │ -000141a0: 2048 616c 6665 6467 6553 7461 7475 7350 HalfedgeStatusP │ │ │ -000141b0: 726f 7065 7274 7948 616e 646c 6520 2020 ropertyHandle │ │ │ -000141c0: 2020 2020 6861 6c66 6564 6765 5f73 7461 halfedge_sta │ │ │ -000141d0: 7475 735f 7070 6828 293c 7370 616e 2063 tus_pph() │ │ │ -000141f0: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
556 │ │ │ -00014250: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 < │ │ │ -00014270: 2f73 7061 6e3e 7b20 3c73 7061 6e20 636c /span>{ return │ │ │ -000142a0: 6861 6c66 6564 6765 5f73 7461 7475 735f halfedge_status_ │ │ │ -000142b0: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
557 < │ │ │ -00014310: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00014360: 3535 383c 2f73 7061 6e3e 2020 3c73 7061 558 inline │ │ │ -00014390: 4564 6765 5374 6174 7573 5072 6f70 6572 EdgeStatusProper │ │ │ -000143a0: 7479 4861 6e64 6c65 2020 2020 2020 2020 tyHandle │ │ │ -000143b0: 2020 2065 6467 655f 7374 6174 7573 5f70 edge_status_p │ │ │ -000143c0: 7068 2829 3c73 7061 6e20 636c 6173 733d ph() const │ │ │ -000143e0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -00014400: 3c61 2069 643d 226c 3030 3535 3922 206e 559 { ret │ │ │ -00014480: 7572 6e3c 2f73 7061 6e3e 2065 6467 655f urn edge_ │ │ │ -00014490: 7374 6174 7573 5f3b 2020 7d3c 2f64 6976 status_; }
.
560< │ │ │ -000144f0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00014510: 3c61 2069 643d 226c 3030 3536 3122 206e 561 inline │ │ │ -00014570: 3c2f 7370 616e 3e20 4661 6365 5374 6174 FaceStat │ │ │ -00014580: 7573 5072 6f70 6572 7479 4861 6e64 6c65 usPropertyHandle │ │ │ -00014590: 2020 2020 2020 2020 2020 2066 6163 655f face_ │ │ │ -000145a0: 7374 6174 7573 5f70 7068 2829 3c73 7061 status_pph() const< │ │ │ -000145d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00014620: 3536 323c 2f73 7061 6e3e 3c73 7061 6e20 562 │ │ │ -00014640: 2020 3c2f 7370 616e 3e7b 203c 7370 616e { return face_status_; │ │ │ -00014680: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
563 .
.
565 │ │ │ -000147e0: 696e 6c69 6e65 3c2f 7370 616e 3e20 3c61 inline Vertex │ │ │ -00014820: 5374 6174 7573 5072 6f70 6572 7479 4861 StatusPropertyHa │ │ │ -00014830: 6e64 6c65 3c2f 613e 2020 2020 2020 2020 ndle │ │ │ -00014840: 203c 6120 636c 6173 733d 2263 6f64 6520 status_pph │ │ │ -000148a0: 283c 6120 636c 6173 733d 2263 6f64 6520 (Ve │ │ │ -000148d0: 7274 6578 4861 6e64 6c65 3c2f 613e 203c rtexHandle < │ │ │ -000148e0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ -000148f0: 656e 7422 3e2f 2a5f 686e 642a 2f3c 2f73 ent">/*_hnd*/) cons │ │ │ -00014920: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
.< │ │ │ -00014930: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00014940: 3e3c 6120 6964 3d22 6c30 3035 3636 2220 > 566 { re │ │ │ -000149c0: 7475 726e 3c2f 7370 616e 3e20 7665 7274 turn vert │ │ │ -000149d0: 6578 5f73 7461 7475 735f 7070 6828 293b ex_status_pph(); │ │ │ -000149e0: 207d 3c2f 6469 763e 0a3c 2f64 6976 3e0a }
.
. │ │ │ -000149f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -00014a80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00014a90: 6e6f 223e 2020 3536 383c 2f73 7061 6e3e no"> 568 │ │ │ -00014aa0: 2020 3c73 7061 6e20 636c 6173 733d 226b inline HalfedgeSt │ │ │ -00014ad0: 6174 7573 5072 6f70 6572 7479 4861 6e64 atusPropertyHand │ │ │ -00014ae0: 6c65 2020 2020 2020 2073 7461 7475 735f le status_ │ │ │ -00014af0: 7070 6828 3c61 2063 6c61 7373 3d22 636f pph(HalfedgeHandle< │ │ │ -00014b30: 2f61 3e20 3c73 7061 6e20 636c 6173 733d /a> /*_hnd │ │ │ -00014b50: 2a2f 3c2f 7370 616e 3e29 3c73 7061 6e20 */) │ │ │ -00014b70: 2063 6f6e 7374 3c2f 7370 616e 3e3c 2f64 const.
56 │ │ │ -00014bd0: 393c 2f73 7061 6e3e 3c73 7061 6e20 636c 9 │ │ │ -00014bf0: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -00014c20: 2068 616c 6665 6467 655f 7374 6174 7573 halfedge_status │ │ │ -00014c30: 5f70 7068 2829 3b20 7d3c 2f64 6976 3e0a _pph(); }
. │ │ │ -00014c40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -00014cd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00014ce0: 6e6f 223e 2020 3537 313c 2f73 7061 6e3e no"> 571 │ │ │ -00014cf0: 2020 3c73 7061 6e20 636c 6173 733d 226b inline EdgeStatus │ │ │ -00014d20: 5072 6f70 6572 7479 4861 6e64 6c65 2020 PropertyHandle │ │ │ -00014d30: 2020 2020 2020 2020 2073 7461 7475 735f status_ │ │ │ -00014d40: 7070 6828 4564 6765 4861 6e64 6c65 203c pph(EdgeHandle < │ │ │ -00014d50: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ -00014d60: 656e 7422 3e2f 2a5f 686e 642a 2f3c 2f73 ent">/*_hnd*/) cons │ │ │ -00014d90: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
.< │ │ │ -00014da0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00014db0: 3e3c 6120 6964 3d22 6c30 3035 3732 2220 > 572 { re │ │ │ -00014e30: 7475 726e 3c2f 7370 616e 3e20 6564 6765 turn edge │ │ │ -00014e40: 5f73 7461 7475 735f 7070 6828 293b 2020 _status_pph(); │ │ │ -00014e50: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ -00014ea0: 2020 3537 333c 2f73 7061 6e3e 203c 2f64 573 .
57 │ │ │ -00014f00: 343c 2f73 7061 6e3e 2020 3c73 7061 6e20 4 │ │ │ -00014f20: 696e 6c69 6e65 3c2f 7370 616e 3e20 4661 inline Fa │ │ │ -00014f30: 6365 5374 6174 7573 5072 6f70 6572 7479 ceStatusProperty │ │ │ -00014f40: 4861 6e64 6c65 2020 2020 2020 2020 2020 Handle │ │ │ -00014f50: 2073 7461 7475 735f 7070 6828 4661 6365 status_pph(Face │ │ │ -00014f60: 4861 6e64 6c65 203c 7370 616e 2063 6c61 Handle /*_ │ │ │ -00014f80: 686e 642a 2f3c 2f73 7061 6e3e 293c 7370 hnd*/) const │ │ │ -00014fb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00015000: 2035 3735 3c2f 7370 616e 3e3c 7370 616e 575 { return face_status_ │ │ │ -00015060: 7070 6828 293b 2020 7d3c 2f64 6976 3e0a pph(); }
. │ │ │ -00015070: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
.
│ │ │ -000151a0: 2035 3738 3c2f 613e 3c2f 7370 616e 3e20 578 │ │ │ -000151b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ -000151d0: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> request_ │ │ │ -00015230: 7665 7274 6578 5f73 7461 7475 733c 2f61 vertex_status()
.
579 │ │ │ -000152a0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
.
│ │ │ -000152f0: 2020 3538 303c 2f73 7061 6e3e 2020 2020 580 │ │ │ -00015300: 3c73 7061 6e20 636c 6173 733d 226b 6579 if (!refcount_v │ │ │ -00015330: 7374 6174 7573 5f2b 2b29 3c2f 6469 763e status_++)
│ │ │ -00015340: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00015370: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 581 add_p │ │ │ -000153a0: 726f 7065 7274 7928 2076 6572 7465 785f roperty( vertex_ │ │ │ -000153b0: 7374 6174 7573 5f2c 203c 7370 616e 2063 status_, "v:sta │ │ │ -000153e0: 7475 7326 7175 6f74 3b3c 2f73 7061 6e3e tus" │ │ │ -000153f0: 2029 3b3c 2f64 6976 3e0a 3c64 6976 2063 );
.
582 │ │ │ -00015450: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
.
.< │ │ │ -00015460: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00015470: 3e3c 6120 6964 3d22 6c30 3035 3833 2220 > 583
.
584 │ │ │ -00015510: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ -00015530: 2f73 7061 6e3e 2072 6571 7565 7374 5f68 /span> request_h │ │ │ -00015540: 616c 6665 6467 655f 7374 6174 7573 2829 alfedge_status() │ │ │ -00015550: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000155a0: 2035 3835 3c2f 7370 616e 3e20 207b 3c2f 585 {.
5 │ │ │ -00015600: 3836 3c2f 7370 616e 3e20 2020 203c 7370 86 if │ │ │ -00015630: 2028 2172 6566 636f 756e 745f 6873 7461 (!refcount_hsta │ │ │ -00015640: 7475 735f 2b2b 293c 2f64 6976 3e0a 3c64 tus_++)
. │ │ │ -00015660: 3c61 2069 643d 226c 3030 3538 3722 206e 587 add_prop │ │ │ -000156b0: 6572 7479 2820 6861 6c66 6564 6765 5f73 erty( halfedge_s │ │ │ -000156c0: 7461 7475 735f 2c20 3c73 7061 6e20 636c tatus_, "h:stat │ │ │ -000156f0: 7573 2671 756f 743b 3c2f 7370 616e 3e20 us" │ │ │ -00015700: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
588 } │ │ │ -00015760: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000157b0: 2035 3839 3c2f 7370 616e 3e20 3c2f 6469 589 .
590 │ │ │ -00015810: 3c2f 7370 616e 3e20 203c 7370 616e 2063 void r │ │ │ -00015840: 6571 7565 7374 5f65 6467 655f 7374 6174 equest_edge_stat │ │ │ -00015850: 7573 2829 3c2f 6469 763e 0a3c 6469 7620 us()
.
591 │ │ │ -000158b0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
592 │ │ │ -00015910: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if (!refcount_ │ │ │ -00015940: 6573 7461 7475 735f 2b2b 293c 2f64 6976 estatus_++)
.
593< │ │ │ -000159a0: 2f73 7061 6e3e 2020 2020 2020 6164 645f /span> add_ │ │ │ -000159b0: 7072 6f70 6572 7479 2820 6564 6765 5f73 property( edge_s │ │ │ -000159c0: 7461 7475 735f 2c20 3c73 7061 6e20 636c tatus_, "e:stat │ │ │ -000159f0: 7573 2671 756f 743b 3c2f 7370 616e 3e20 us" │ │ │ -00015a00: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
594 } │ │ │ -00015a60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00015ab0: 2035 3935 3c2f 7370 616e 3e20 3c2f 6469 595 .
596 │ │ │ -00015b10: 3c2f 7370 616e 3e20 203c 7370 616e 2063 void r │ │ │ -00015b40: 6571 7565 7374 5f66 6163 655f 7374 6174 equest_face_stat │ │ │ -00015b50: 7573 2829 3c2f 6469 763e 0a3c 6469 7620 us()
.
597 │ │ │ -00015bb0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
598 │ │ │ -00015c10: 203c 7370 616e 2063 6c61 7373 3d22 6b65 if (!refcount_ │ │ │ -00015c40: 6673 7461 7475 735f 2b2b 293c 2f64 6976 fstatus_++)
.
599< │ │ │ -00015ca0: 2f73 7061 6e3e 2020 2020 2020 6164 645f /span> add_ │ │ │ -00015cb0: 7072 6f70 6572 7479 2820 6661 6365 5f73 property( face_s │ │ │ -00015cc0: 7461 7475 735f 2c20 3c73 7061 6e20 636c tatus_, "f:stat │ │ │ -00015cf0: 7573 2671 756f 743b 3c2f 7370 616e 3e20 us" │ │ │ -00015d00: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
600 } │ │ │ -00015d60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00015db0: 2036 3031 3c2f 7370 616e 3e20 3c2f 6469 601 . │ │ │ -00016060: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00016090: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 606 remov │ │ │ -000160c0: 655f 7072 6f70 6572 7479 2876 6572 7465 e_property(verte │ │ │ -000160d0: 785f 7374 6174 7573 5f29 3b3c 2f64 6976 x_status_);
.
607< │ │ │ -00016130: 2f73 7061 6e3e 2020 7d3c 2f64 6976 3e0a /span> }
. │ │ │ -00016140: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00016190: 2036 3038 3c2f 7370 616e 3e20 3c2f 6469 608 .
609 │ │ │ -000161f0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 void r │ │ │ -00016220: 656c 6561 7365 5f68 616c 6665 6467 655f elease_halfedge_ │ │ │ -00016230: 7374 6174 7573 2829 3c2f 6469 763e 0a3c status()
.< │ │ │ -00016240: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00016250: 3e3c 6120 6964 3d22 6c30 3036 3130 2220 > 610 {
.< │ │ │ -000162b0: 6120 6964 3d22 6c30 3036 3131 2220 6e61 a id="l00611" na │ │ │ -000162c0: 6d65 3d22 6c30 3036 3131 223e 3c2f 613e me="l00611"> │ │ │ -000162d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 611 i │ │ │ -00016310: 663c 2f73 7061 6e3e 2028 2872 6566 636f f ((refco │ │ │ -00016320: 756e 745f 6873 7461 7475 735f 2026 6774 unt_hstatus_ > │ │ │ -00016330: 3b20 3029 2026 616d 703b 2661 6d70 3b20 ; 0) && │ │ │ -00016340: 2821 202d 2d72 6566 636f 756e 745f 6873 (! --refcount_hs │ │ │ -00016350: 7461 7475 735f 2929 3c2f 6469 763e 0a3c tatus_))
.< │ │ │ -00016360: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00016370: 3e3c 6120 6964 3d22 6c30 3036 3132 2220 > 612 remove_ │ │ │ -000163c0: 7072 6f70 6572 7479 2868 616c 6665 6467 property(halfedg │ │ │ -000163d0: 655f 7374 6174 7573 5f29 3b3c 2f64 6976 e_status_);
.
613< │ │ │ -00016430: 2f73 7061 6e3e 2020 7d3c 2f64 6976 3e0a /span> }
. │ │ │ -00016440: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -000164d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -000164e0: 6e6f 223e 2020 3631 353c 2f73 7061 6e3e no"> 615 │ │ │ -000164f0: 2020 3c73 7061 6e20 636c 6173 733d 226b void │ │ │ -00016510: 3c2f 7370 616e 3e20 7265 6c65 6173 655f release_ │ │ │ -00016520: 6564 6765 5f73 7461 7475 7328 293c 2f64 edge_status().
61 │ │ │ -00016580: 363c 2f73 7061 6e3e 2020 7b3c 2f64 6976 6 {
.
617< │ │ │ -000165e0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> if (( │ │ │ -00016610: 7265 6663 6f75 6e74 5f65 7374 6174 7573 refcount_estatus │ │ │ -00016620: 5f20 2667 743b 2030 2920 2661 6d70 3b26 _ > 0) && │ │ │ -00016630: 616d 703b 2028 2120 2d2d 7265 6663 6f75 amp; (! --refcou │ │ │ -00016640: 6e74 5f65 7374 6174 7573 5f29 293c 2f64 nt_estatus_)).
61 │ │ │ -000166a0: 383c 2f73 7061 6e3e 2020 2020 2020 7265 8 re │ │ │ -000166b0: 6d6f 7665 5f70 726f 7065 7274 7928 6564 move_property(ed │ │ │ -000166c0: 6765 5f73 7461 7475 735f 293b 3c2f 6469 ge_status_);.
619 │ │ │ -00016720: 3c2f 7370 616e 3e20 207d 3c2f 6469 763e }
│ │ │ -00016730: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -000167a0: 6120 6964 3d22 6c30 3036 3231 2220 6e61 a id="l00621" na │ │ │ -000167b0: 6d65 3d22 6c30 3036 3231 223e 3c2f 613e me="l00621"> │ │ │ -000167c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 621 voi │ │ │ -00016800: 643c 2f73 7061 6e3e 2072 656c 6561 7365 d release │ │ │ -00016810: 5f66 6163 655f 7374 6174 7573 2829 3c2f _face_status().
6 │ │ │ -00016870: 3232 3c2f 7370 616e 3e20 207b 3c2f 6469 22 {.
623 │ │ │ -000168d0: 3c2f 7370 616e 3e20 2020 203c 7370 616e if ( │ │ │ -00016900: 2872 6566 636f 756e 745f 6673 7461 7475 (refcount_fstatu │ │ │ -00016910: 735f 2026 6774 3b20 3029 2026 616d 703b s_ > 0) & │ │ │ -00016920: 2661 6d70 3b20 2821 202d 2d72 6566 636f & (! --refco │ │ │ -00016930: 756e 745f 6673 7461 7475 735f 2929 3c2f unt_fstatus_)).
6 │ │ │ -00016990: 3234 3c2f 7370 616e 3e20 2020 2020 2072 24 r │ │ │ -000169a0: 656d 6f76 655f 7072 6f70 6572 7479 2866 emove_property(f │ │ │ -000169b0: 6163 655f 7374 6174 7573 5f29 3b3c 2f64 ace_status_);.
62 │ │ │ -00016a10: 353c 2f73 7061 6e3e 2020 7d3c 2f64 6976 5 }
.
626< │ │ │ -00016a70: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00016a90: 3c61 2069 643d 226c 3030 3632 3822 206e 628
.
636 │ │ │ -00016b30: 3c73 7061 6e20 636c 6173 733d 226b 6579 template < │ │ │ -00016b70: 636c 6173 733c 2f73 7061 6e3e 2048 616e class Han │ │ │ -00016b80: 646c 6554 2667 743b 3c2f 6469 763e 0a3c dleT>
.< │ │ │ -00016b90: 6469 7620 636c 6173 733d 2266 6f6c 646f div class="foldo │ │ │ -00016ba0: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen" id="foldope │ │ │ -00016bb0: 6e30 3036 3337 2220 6461 7461 2d73 7461 n00637" data-sta │ │ │ -00016bc0: 7274 3d22 7b22 2064 6174 612d 656e 643d rt="{" data-end= │ │ │ -00016bd0: 227d 3b22 3e0a 3c64 6976 2063 6c61 7373 "};">.
637 class < │ │ │ -00016c70: 2f73 7061 6e3e 3c61 2063 6c61 7373 3d22 /span>StatusSetT │ │ │ -00016cb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00016d00: 2036 3338 3c2f 7370 616e 3e20 207b 3c2f 638 {.
6 │ │ │ -00016d60: 3339 3c2f 7370 616e 3e20 203c 7370 616e 39 public: │ │ │ -00016d90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00016de0: 2036 3430 3c2f 7370 616e 3e20 2020 203c 640 < │ │ │ -00016df0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -00016e00: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord">typedef HandleT Hand │ │ │ -00016e20: 6c65 3b3c 2f64 6976 3e0a 3c64 6976 2063 le;
.
641 < │ │ │ -00016e80: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00016ed0: 3634 323c 2f73 7061 6e3e 2020 3c73 7061 642 protected:
.
643 │ │ │ -00016f60: 2020 3c61 2063 6c61 7373 3d22 636f 6465 Ar │ │ │ -00016f90: 7261 794b 6572 6e65 6c3c 2f61 3e26 616d rayKernel&am │ │ │ -00016fa0: 703b 206b 6572 6e65 6c5f 3b3c 2f64 6976 p; kernel_;
.
644< │ │ │ -00017000: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -00017020: 3c61 2069 643d 226c 3030 3634 3522 206e 645 public │ │ │ -00017080: 3c2f 7370 616e 3e3a 3c2f 6469 763e 0a3c :
.< │ │ │ -00017090: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000170a0: 3e3c 6120 6964 3d22 6c30 3036 3436 2220 > 646 con │ │ │ -00017100: 7374 3c2f 7370 616e 3e20 3c73 7061 6e20 st unsigned in │ │ │ -00017150: 743c 2f73 7061 6e3e 2062 6974 5f6d 6173 t bit_mas │ │ │ -00017160: 6b5f 3b3c 2f64 6976 3e0a 3c64 6976 2063 k_;
.
647 < │ │ │ -000171c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00017210: 3634 383c 2f73 7061 6e3e 2020 3c73 7061 648 public: │ │ │ -00017240: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00017290: 2036 3439 3c2f 7370 616e 3e20 2020 203c 649 < │ │ │ -000172a0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -000172b0: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ -000172c0: 3234 3236 2e68 746d 6c22 3e53 7461 7475 2426.html">Statu │ │ │ -000172d0: 7353 6574 543c 2f61 3e28 3c61 2063 6c61 sSetT(ArrayKerne │ │ │ -00017310: 6c3c 2f61 3e26 616d 703b 205f 6b65 726e l& _kern │ │ │ -00017320: 656c 2c20 3c73 7061 6e20 636c 6173 733d el, const< │ │ │ -00017340: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> unsigned │ │ │ -00017370: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int _bit_mask) │ │ │ -000173a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000173f0: 2036 3530 3c2f 7370 616e 3e20 2020 203a 650 : │ │ │ -00017400: 206b 6572 6e65 6c5f 285f 6b65 726e 656c kernel_(_kernel │ │ │ -00017410: 292c 2062 6974 5f6d 6173 6b5f 285f 6269 ), bit_mask_(_bi │ │ │ -00017420: 745f 6d61 736b 293c 2f64 6976 3e0a 3c64 t_mask)
. │ │ │ -00017440: 3c61 2069 643d 226c 3030 3635 3122 206e 651 {}
.< │ │ │ -00017490: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000174a0: 3e3c 6120 6964 3d22 6c30 3036 3532 2220 > 652
.
653 │ │ │ -00017540: 2020 203c 6120 636c 6173 733d 2263 6f64 ~ │ │ │ -00017570: 5374 6174 7573 5365 7454 3c2f 613e 2829 StatusSetT() │ │ │ -00017580: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000175d0: 2036 3534 3c2f 7370 616e 3e20 2020 207b 654 { │ │ │ -000175e0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ -00017630: 2020 3635 353c 2f73 7061 6e3e 203c 2f64 655 .
65 │ │ │ -00017690: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 inline │ │ │ -000176c0: 3c73 7061 6e20 636c 6173 733d 226b 6579 bool is_in(Hand │ │ │ -000176f0: 6c65 205f 686e 6429 3c73 7061 6e20 636c le _hnd) c │ │ │ -00017710: 6f6e 7374 3c2f 7370 616e 3e3c 2f64 6976 onst
.
657< │ │ │ -00017770: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span> │ │ │ -00017790: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -000177c0: 206b 6572 6e65 6c5f 2e3c 6120 636c 6173 kernel_.status │ │ │ -00017820: 3c2f 613e 285f 686e 6429 2e3c 6120 636c (_hnd).is_b │ │ │ -00017880: 6974 5f73 6574 3c2f 613e 2862 6974 5f6d it_set(bit_m │ │ │ -00017890: 6173 6b5f 293b 207d 3c2f 6469 763e 0a3c ask_); }
.< │ │ │ -000178a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000178b0: 3e3c 6120 6964 3d22 6c30 3036 3538 2220 > 658
.
659 │ │ │ -00017950: 2020 203c 7370 616e 2063 6c61 7373 3d22 inline< │ │ │ -00017970: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> void ins │ │ │ -000179a0: 6572 7428 4861 6e64 6c65 205f 686e 6429 ert(Handle _hnd) │ │ │ -000179b0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00017a00: 2036 3630 3c2f 7370 616e 3e20 2020 207b 660 { │ │ │ -00017a10: 206b 6572 6e65 6c5f 2e3c 6120 636c 6173 kernel_.status │ │ │ -00017a70: 3c2f 613e 285f 686e 6429 2e3c 6120 636c (_hnd).set_ │ │ │ -00017ad0: 6269 743c 2f61 3e28 6269 745f 6d61 736b bit(bit_mask │ │ │ -00017ae0: 5f29 3b20 7d3c 2f64 6976 3e0a 3c64 6976 _); }
.
< │ │ │ -00017b20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00017b30: 6e6f 223e 2020 3636 313c 2f73 7061 6e3e no"> 661 │ │ │ -00017b40: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ -00017b90: 2020 3636 323c 2f73 7061 6e3e 2020 2020 662 │ │ │ -00017ba0: 3c73 7061 6e20 636c 6173 733d 226b 6579 inline vo │ │ │ -00017be0: 6964 3c2f 7370 616e 3e20 6572 6173 6528 id erase( │ │ │ -00017bf0: 4861 6e64 6c65 205f 686e 6429 3c2f 6469 Handle _hnd).
663 │ │ │ -00017c50: 3c2f 7370 616e 3e20 2020 207b 206b 6572 { ker │ │ │ -00017c60: 6e65 6c5f 2e3c 6120 636c 6173 733d 2263 nel_.status │ │ │ -00017cc0: 285f 686e 6429 2e3c 6120 636c 6173 733d (_hnd).unset_bi │ │ │ -00017d20: 743c 2f61 3e28 6269 745f 6d61 736b 5f29 t(bit_mask_) │ │ │ -00017d30: 3b20 7d3c 2f64 6976 3e0a 3c64 6976 2063 ; }
.
664 < │ │ │ -00017d90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ -00017e10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00017e20: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 666 size_t size() │ │ │ -00017f00: 3c73 7061 6e20 636c 6173 733d 226b 6579 const
.
667 { │ │ │ -00017fa0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00017ff0: 2036 3638 3c2f 7370 616e 3e20 2020 2020 668 │ │ │ -00018000: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const in │ │ │ -00018040: 743c 2f73 7061 6e3e 206e 203d 206b 6572 t n = ker │ │ │ -00018050: 6e65 6c5f 2e3c 6120 636c 6173 733d 2263 nel_.status_pph │ │ │ -000180b0: 3c2f 613e 2848 616e 646c 6528 2929 2e3c (Handle()).< │ │ │ -000180c0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -000180d0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ -000180e0: 2261 3032 3535 382e 6874 6d6c 2361 3165 "a02558.html#a1e │ │ │ -000180f0: 3762 3639 6665 3866 3264 3931 3965 3564 7b69fe8f2d919e5d │ │ │ -00018100: 3730 3836 6239 3564 3166 3330 3962 223e 7086b95d1f309b"> │ │ │ -00018110: 6973 5f76 616c 6964 3c2f 613e 2829 203f is_valid() ? │ │ │ -00018120: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00018170: 2036 3639 3c2f 7370 616e 3e20 2020 2020 669 │ │ │ -00018180: 2020 2869 6e74 296b 6572 6e65 6c5f 2e3c (int)kernel_.< │ │ │ -00018190: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -000181a0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ -000181b0: 2261 3032 3434 322e 6874 6d6c 2361 3839 "a02442.html#a89 │ │ │ -000181c0: 3431 3636 3364 3865 3538 3437 3333 6631 41663d8e584733f1 │ │ │ -000181d0: 3531 6639 6234 6230 3535 3937 6464 223e 51f9b4b05597dd"> │ │ │ -000181e0: 7072 6f70 6572 7479 3c2f 613e 286b 6572 property(ker │ │ │ -000181f0: 6e65 6c5f 2e3c 6120 636c 6173 733d 2263 nel_.status_pph │ │ │ -00018250: 3c2f 613e 2848 616e 646c 6528 2929 292e (Handle())). │ │ │ -00018260: 6e5f 656c 656d 656e 7473 2829 203a 2030 n_elements() : 0 │ │ │ -00018270: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -000182c0: 2020 3637 303c 2f73 7061 6e3e 203c 2f64 670 .
67 │ │ │ -00018320: 313c 2f73 7061 6e3e 2020 2020 2020 3c73 1 size_t sz = 0;.
67 │ │ │ -000183b0: 323c 2f73 7061 6e3e 2020 2020 2020 3c73 2 for (in │ │ │ -00018400: 743c 2f73 7061 6e3e 2069 203d 2030 3b20 t i = 0; │ │ │ -00018410: 6920 266c 743b 206e 3b20 2b2b 6929 3c2f i < n; ++i).
6 │ │ │ -00018470: 3733 3c2f 7370 616e 3e20 2020 2020 2020 73 │ │ │ -00018480: 2073 7a20 2b3d 2028 3c73 7061 6e20 636c sz += (size_t) │ │ │ -000184b0: 6973 5f69 6e28 4861 6e64 6c65 2869 2929 is_in(Handle(i)) │ │ │ -000184c0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -00018510: 2020 3637 343c 2f73 7061 6e3e 2020 2020 674 │ │ │ -00018520: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ -00018540: 726e 3c2f 7370 616e 3e20 737a 3b3c 2f64 rn sz;.
67 │ │ │ -000185a0: 353c 2f73 7061 6e3e 2020 2020 7d3c 2f64 5 }.
.
676 │ │ │ -00018610: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
.< │ │ │ -00018670: 6120 6964 3d22 6c30 3036 3738 2220 6e61 a id="l00678" na │ │ │ -00018680: 6d65 3d22 6c30 3036 3738 223e 3c2f 613e me="l00678"> │ │ │ -00018690: 3c73 7061 6e20 636c 6173 733d 226c 696e 678< │ │ │ -000186f0: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c73 /a> void clear() │ │ │ -00018780: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000187d0: 2036 3739 3c2f 7370 616e 3e20 2020 207b 679 { │ │ │ -000187e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00018830: 2036 3830 3c2f 7370 616e 3e20 2020 2020 680 │ │ │ -00018840: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const in │ │ │ -00018880: 743c 2f73 7061 6e3e 206e 203d 206b 6572 t n = ker │ │ │ -00018890: 6e65 6c5f 2e3c 6120 636c 6173 733d 2263 nel_.status_pph │ │ │ -000188f0: 3c2f 613e 2848 616e 646c 6528 2929 2e3c (Handle()).< │ │ │ -00018900: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -00018910: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ -00018920: 2261 3032 3535 382e 6874 6d6c 2361 3165 "a02558.html#a1e │ │ │ -00018930: 3762 3639 6665 3866 3264 3931 3965 3564 7b69fe8f2d919e5d │ │ │ -00018940: 3730 3836 6239 3564 3166 3330 3962 223e 7086b95d1f309b"> │ │ │ -00018950: 6973 5f76 616c 6964 3c2f 613e 2829 203f is_valid() ? │ │ │ -00018960: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -000189b0: 2036 3831 3c2f 7370 616e 3e20 2020 2020 681 │ │ │ -000189c0: 2020 2869 6e74 296b 6572 6e65 6c5f 2e3c (int)kernel_.< │ │ │ -000189d0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -000189e0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ -000189f0: 2261 3032 3434 322e 6874 6d6c 2361 3839 "a02442.html#a89 │ │ │ -00018a00: 3431 3636 3364 3865 3538 3437 3333 6631 41663d8e584733f1 │ │ │ -00018a10: 3531 6639 6234 6230 3535 3937 6464 223e 51f9b4b05597dd"> │ │ │ -00018a20: 7072 6f70 6572 7479 3c2f 613e 286b 6572 property(ker │ │ │ -00018a30: 6e65 6c5f 2e3c 6120 636c 6173 733d 2263 nel_.status_pph │ │ │ -00018a90: 3c2f 613e 2848 616e 646c 6528 2929 292e (Handle())). │ │ │ -00018aa0: 6e5f 656c 656d 656e 7473 2829 203a 2030 n_elements() : 0 │ │ │ -00018ab0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -00018b00: 2020 3638 323c 2f73 7061 6e3e 203c 2f64 682 .
68 │ │ │ -00018b60: 333c 2f73 7061 6e3e 2020 2020 2020 3c73 3 for (in │ │ │ -00018bb0: 743c 2f73 7061 6e3e 2069 203d 2030 3b20 t i = 0; │ │ │ -00018bc0: 6920 266c 743b 206e 3b20 2b2b 6929 3c2f i < n; ++i).
6 │ │ │ -00018c20: 3834 3c2f 7370 616e 3e20 2020 2020 2020 84 │ │ │ -00018c30: 2065 7261 7365 2848 616e 646c 6528 6929 erase(Handle(i) │ │ │ -00018c40: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
685 │ │ │ -00018ca0: 207d 3c2f 6469 763e 0a3c 2f64 6976 3e0a }
.
. │ │ │ -00018cb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .< │ │ │ -00018d10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00018d60: 3638 373c 2f73 7061 6e3e 203c 2f64 6976 687
.
688< │ │ │ -00018dc0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> fr │ │ │ -00018de0: 6965 6e64 3c2f 7370 616e 3e20 3c73 7061 iend class S │ │ │ -00018e10: 7461 7475 7353 6574 5426 6c74 3b3c 6120 tatusSetT<Vertex │ │ │ -00018e50: 4861 6e64 6c65 3c2f 613e 2667 743b 3b3c Handle>;< │ │ │ -00018e60: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00018eb0: 3638 393c 2f73 7061 6e3e 2020 3c73 7061 689 friend │ │ │ -00018ee0: 3c73 7061 6e20 636c 6173 733d 226b 6579 class StatusSetT< │ │ │ -00018f10: 3b3c 6120 636c 6173 733d 2263 6f64 6520 ;Ed │ │ │ -00018f40: 6765 4861 6e64 6c65 3c2f 613e 2667 743b geHandle> │ │ │ -00018f50: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -00018fa0: 2020 3639 303c 2f73 7061 6e3e 2020 3c73 690 friend class StatusSetT& │ │ │ -00019000: 6c74 3b3c 6120 636c 6173 733d 2263 6f64 lt; │ │ │ -00019030: 4661 6365 4861 6e64 6c65 3c2f 613e 2667 FaceHandle&g │ │ │ -00019040: 743b 3b3c 2f64 6976 3e0a 3c64 6976 2063 t;;
.
691 │ │ │ -000190a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 friend class │ │ │ -000190e0: 3c2f 7370 616e 3e53 7461 7475 7353 6574 StatusSet │ │ │ -000190f0: 5426 6c74 3b3c 6120 636c 6173 733d 2263 T<HalfedgeHandle │ │ │ -00019130: 3c2f 613e 2667 743b 3b3c 2f64 6976 3e0a >;
. │ │ │ -00019140: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ -000191d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -000191e0: 6e6f 223e 2020 3639 343c 2f73 7061 6e3e no"> 694 │ │ │ -000191f0: 2020 3c73 7061 6e20 636c 6173 733d 226b template │ │ │ -00019210: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <class H │ │ │ -00019240: 616e 646c 6554 2667 743b 3c2f 6469 763e andleT>
│ │ │ -00019250: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
.
│ │ │ -000192e0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 695 class │ │ │ -00019330: 203c 2f73 7061 6e3e 3c61 2063 6c61 7373 AutoStatusSe │ │ │ -00019370: 7454 3c2f 613e 203a 203c 7370 616e 2063 tT : p │ │ │ -00019390: 7562 6c69 633c 2f73 7061 6e3e 203c 6120 ublic StatusS │ │ │ -000193d0: 6574 543c 2f61 3e26 6c74 3b48 616e 646c etT<Handl │ │ │ -000193e0: 6554 2667 743b 3c2f 6469 763e 0a3c 6469 eT>
.< │ │ │ -00019400: 6120 6964 3d22 6c30 3036 3936 2220 6e61 a id="l00696" na │ │ │ -00019410: 6d65 3d22 6c30 3036 3936 223e 3c2f 613e me="l00696"> │ │ │ -00019420: 3c73 7061 6e20 636c 6173 733d 226c 696e 696 {
.
697 │ │ │ -000194a0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 private:
.< │ │ │ -000194e0: 6120 6964 3d22 6c30 3036 3938 2220 6e61 a id="l00698" na │ │ │ -000194f0: 6d65 3d22 6c30 3036 3938 223e 3c2f 613e me="l00698"> │ │ │ -00019500: 3c73 7061 6e20 636c 6173 733d 226c 696e 698 typed │ │ │ -00019540: 6566 3c2f 7370 616e 3e20 4861 6e64 6c65 ef Handle │ │ │ -00019550: 5420 4861 6e64 6c65 3b3c 2f64 6976 3e0a T Handle;
. │ │ │ -00019560: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
700< │ │ │ -000196b0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -000196d0: 3c61 2069 643d 226c 3030 3730 3122 206e 701 public │ │ │ -00019730: 3c2f 7370 616e 3e3a 3c2f 6469 763e 0a3c :
.< │ │ │ -00019740: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00019750: 3e3c 6120 6964 3d22 6c30 3037 3032 2220 > 702 exp │ │ │ -000197b0: 6c69 6369 743c 2f73 7061 6e3e 203c 6120 licit AutoSta │ │ │ -000197f0: 7475 7353 6574 543c 2f61 3e28 3c61 2063 tusSetT(ArrayKer │ │ │ -00019830: 6e65 6c3c 2f61 3e26 616d 703b 205f 6b65 nel& _ke │ │ │ -00019840: 726e 656c 293c 2f64 6976 3e0a 3c64 6976 rnel)
.
< │ │ │ -00019880: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00019890: 6e6f 223e 2020 3730 333c 2f73 7061 6e3e no"> 703 │ │ │ -000198a0: 2020 2020 3a20 3c61 2063 6c61 7373 3d22 : StatusSetT< │ │ │ -000198e0: 4861 6e64 6c65 2667 743b 3c2f 613e 285f Handle>(_ │ │ │ -000198f0: 6b65 726e 656c 2c20 5f6b 6572 6e65 6c2e kernel, _kernel. │ │ │ -00019900: 706f 705f 6269 745f 6d61 736b 2848 616e pop_bit_mask(Han │ │ │ -00019910: 646c 6528 2929 293c 2f64 6976 3e0a 3c64 dle()))
. │ │ │ -00019930: 3c61 2069 643d 226c 3030 3730 3422 206e 704 { /* │ │ │ -00019990: 6173 7365 7274 2873 697a 6528 2920 3d3d assert(size() == │ │ │ -000199a0: 2030 293b 2a2f 3c2f 7370 616e 3e20 7d20 0);*/ } │ │ │ -000199b0: 3c73 7061 6e20 636c 6173 733d 2263 6f6d //the set │ │ │ -000199d0: 7368 6f75 6c64 2062 6520 656d 7074 7920 should be empty │ │ │ -000199e0: 6f6e 2063 7265 6174 696f 6e3c 2f73 7061 on creation
.
705 .
7 │ │ │ -00019aa0: 3036 3c2f 7370 616e 3e20 2020 203c 6120 06 ~AutoSt │ │ │ -00019ae0: 6174 7573 5365 7454 3c2f 613e 2829 3c2f atusSetT().
7 │ │ │ -00019b40: 3037 3c2f 7370 616e 3e20 2020 207b 3c2f 07 {.
7 │ │ │ -00019ba0: 3038 3c2f 7370 616e 3e20 2020 2020 203c 08 < │ │ │ -00019bb0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ -00019bc0: 656e 7422 3e2f 2f61 7373 6572 7428 7369 ent">//assert(si │ │ │ -00019bd0: 7a65 2829 203d 3d20 3029 3b2f 2f74 6865 ze() == 0);//the │ │ │ -00019be0: 2073 6574 2073 686f 756c 6420 6265 2065 set should be e │ │ │ -00019bf0: 6d70 7479 206f 6e20 6c65 6176 653f 3c2f mpty on leave?
.
< │ │ │ -00019c40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00019c50: 6e6f 223e 2020 3730 393c 2f73 7061 6e3e no"> 709 │ │ │ -00019c60: 2020 2020 2020 4261 7365 3a3a 6b65 726e Base::kern │ │ │ -00019c70: 656c 5f2e 7075 7368 5f62 6974 5f6d 6173 el_.push_bit_mas │ │ │ -00019c80: 6b28 4861 6e64 6c65 2829 2c20 4261 7365 k(Handle(), Base │ │ │ -00019c90: 3a3a 6269 745f 6d61 736b 5f29 3b3c 2f64 ::bit_mask_);.
71 │ │ │ -00019cf0: 303c 2f73 7061 6e3e 2020 2020 7d3c 2f64 0 }.
71 │ │ │ -00019d50: 313c 2f73 7061 6e3e 2020 7d3b 3c2f 6469 1 };.
.
712 < │ │ │ -00019dc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00019e10: 3731 333c 2f73 7061 6e3e 2020 3c73 7061 713 friend │ │ │ -00019e40: 3c73 7061 6e20 636c 6173 733d 226b 6579 class A │ │ │ -00019e90: 7574 6f53 7461 7475 7353 6574 543c 2f61 utoStatusSetT<VertexHandle>;
. │ │ │ -00019f00: 3c61 2069 643d 226c 3030 3731 3422 206e 714 friend │ │ │ -00019f60: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c cl │ │ │ -00019f80: 6173 7320 3c2f 7370 616e 3e3c 6120 636c ass AutoStatu │ │ │ -00019fc0: 7353 6574 543c 2f61 3e26 6c74 3b3c 6120 sSetT<EdgeHa │ │ │ -0001a000: 6e64 6c65 3c2f 613e 2667 743b 3b3c 2f64 ndle>;.
71 │ │ │ -0001a060: 353c 2f73 7061 6e3e 2020 3c73 7061 6e20 5 │ │ │ -0001a080: 6672 6965 6e64 3c2f 7370 616e 3e20 3c73 friend class Aut │ │ │ -0001a0e0: 6f53 7461 7475 7353 6574 543c 2f61 3e26 oStatusSetT& │ │ │ -0001a0f0: 6c74 3b3c 6120 636c 6173 733d 2263 6f64 lt; │ │ │ -0001a120: 4661 6365 4861 6e64 6c65 3c2f 613e 2667 FaceHandle&g │ │ │ -0001a130: 743b 3b3c 2f64 6976 3e0a 3c64 6976 2063 t;;
.
716 │ │ │ -0001a190: 3c73 7061 6e20 636c 6173 733d 226b 6579 friend class │ │ │ -0001a1d0: 3c2f 7370 616e 3e3c 6120 636c 6173 733d AutoStatusSet │ │ │ -0001a210: 543c 2f61 3e26 6c74 3b3c 6120 636c 6173 T<HalfedgeHa │ │ │ -0001a250: 6e64 6c65 3c2f 613e 2667 743b 3b3c 2f64 ndle>;.
71 │ │ │ -0001a2b0: 373c 2f73 7061 6e3e 203c 2f64 6976 3e0a 7
. │ │ │ -0001a2c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
.
720< │ │ │ -0001a540: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> ty │ │ │ -0001a560: 7065 6465 663c 2f73 7061 6e3e 203c 6120 pedef AutoSta │ │ │ -0001a5a0: 7475 7353 6574 5426 6c74 3b46 6163 6548 tusSetT<FaceH │ │ │ -0001a5b0: 616e 646c 6526 6774 3b3c 2f61 3e20 2020 andle> │ │ │ -0001a5c0: 2020 2020 203c 6120 636c 6173 733d 2263 FaceStatusSet;
.
721 │ │ │ -0001a660: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef AutoStatusSetT& │ │ │ -0001a6c0: 6c74 3b48 616c 6665 6467 6548 616e 646c lt;HalfedgeHandl │ │ │ -0001a6d0: 6526 6774 3b3c 2f61 3e20 2020 203c 6120 e> Halfedg │ │ │ -0001a710: 6553 7461 7475 7353 6574 3c2f 613e 3b3c eStatusSet;< │ │ │ -0001a720: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001a770: 3732 323c 2f73 7061 6e3e 203c 2f64 6976 722
.
724< │ │ │ -0001a7d0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> te │ │ │ -0001a7f0: 6d70 6c61 7465 3c2f 7370 616e 3e20 266c mplate &l │ │ │ -0001a800: 743b 3c73 7061 6e20 636c 6173 733d 226b t;class HandleT> │ │ │ -0001a830: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
. │ │ │ -0001a890: 3c61 2069 643d 226c 3030 3732 3522 206e 725 class ExtSta │ │ │ -0001a950: 7475 7353 6574 543c 2f61 3e20 3a20 3c73 tusSetT : public Au │ │ │ -0001a9b0: 746f 5374 6174 7573 5365 7454 3c2f 613e toStatusSetT │ │ │ -0001a9c0: 266c 743b 4861 6e64 6c65 5426 6774 3b3c <HandleT>< │ │ │ -0001a9d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001aa20: 3732 363c 2f73 7061 6e3e 2020 7b3c 2f64 726 {.
72 │ │ │ -0001aa80: 373c 2f73 7061 6e3e 2020 3c73 7061 6e20 7 │ │ │ -0001aaa0: 7075 626c 6963 3c2f 7370 616e 3e3a 3c2f public:.
7 │ │ │ -0001ab00: 3238 3c2f 7370 616e 3e20 2020 203c 7370 28 typedef HandleT Handle │ │ │ -0001ab40: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -0001ab90: 2020 3732 393c 2f73 7061 6e3e 2020 2020 729 │ │ │ -0001aba0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef AutoStatusSetT& │ │ │ -0001ac00: 6c74 3b48 616e 646c 6526 6774 3b3c 2f61 lt;Handle> Ba │ │ │ -0001ac40: 7365 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 se;
. │ │ │ -0001ac60: 3c61 2069 643d 226c 3030 3733 3022 206e 730
.
731 │ │ │ -0001ad00: 3c73 7061 6e20 636c 6173 733d 226b 6579 protected< │ │ │ -0001ad20: 2f73 7061 6e3e 3a3c 2f64 6976 3e0a 3c64 /span>:
. │ │ │ -0001ad40: 3c61 2069 643d 226c 3030 3733 3222 206e 732 type │ │ │ -0001ada0: 6465 663c 2f73 7061 6e3e 2073 7464 3a3a def std:: │ │ │ -0001adb0: 7665 6374 6f72 266c 743b 4861 6e64 6c65 vector<Handle │ │ │ -0001adc0: 2667 743b 2020 2020 2020 2020 2020 2020 > │ │ │ -0001add0: 2048 616e 646c 6543 6f6e 7461 696e 6572 HandleContainer │ │ │ -0001ade0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -0001ae30: 2020 3733 333c 2f73 7061 6e3e 2020 2020 733 │ │ │ -0001ae40: 4861 6e64 6c65 436f 6e74 6169 6e65 7220 HandleContainer │ │ │ -0001ae50: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0001ae60: 2020 2020 2020 2020 6861 6e64 6c65 735f handles_ │ │ │ -0001ae70: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -0001aec0: 2020 3733 343c 2f73 7061 6e3e 203c 2f64 734 .
73 │ │ │ -0001af20: 353c 2f73 7061 6e3e 2020 3c73 7061 6e20 5 │ │ │ -0001af40: 7075 626c 6963 3c2f 7370 616e 3e3a 3c2f public:.
7 │ │ │ -0001afa0: 3336 3c2f 7370 616e 3e20 2020 203c 7370 36 typedef typename │ │ │ -0001aff0: 3c2f 7370 616e 3e20 4861 6e64 6c65 436f HandleCo │ │ │ -0001b000: 6e74 6169 6e65 723a 3a69 7465 7261 746f ntainer::iterato │ │ │ -0001b010: 723c 2f64 6976 3e0a 3c64 6976 2063 6c61 r
.
│ │ │ -0001b060: 2020 3733 373c 2f73 7061 6e3e 2020 2020 737 │ │ │ -0001b070: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0001b080: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0001b090: 2020 2020 2020 2020 6974 6572 6174 6f72 iterator │ │ │ -0001b0a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -0001b0f0: 2020 3733 383c 2f73 7061 6e3e 2020 2020 738 │ │ │ -0001b100: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef typen │ │ │ -0001b140: 616d 653c 2f73 7061 6e3e 2048 616e 646c ame Handl │ │ │ -0001b150: 6543 6f6e 7461 696e 6572 3a3a 636f 6e73 eContainer::cons │ │ │ -0001b160: 745f 6974 6572 6174 6f72 3c2f 6469 763e t_iterator
│ │ │ -0001b170: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001b1a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 739 │ │ │ -0001b1d0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0001b1e0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0001b1f0: 2063 6f6e 7374 5f69 7465 7261 746f 723b const_iterator; │ │ │ -0001b200: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001b250: 2037 3430 3c2f 7370 616e 3e20 203c 7370 740 public │ │ │ -0001b280: 3a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 :
.
│ │ │ -0001b2d0: 2020 3734 313c 2f73 7061 6e3e 2020 2020 741 │ │ │ -0001b2e0: 3c73 7061 6e20 636c 6173 733d 226b 6579 explicit ExtStatusSetT< │ │ │ -0001b340: 2f61 3e28 3c61 2063 6c61 7373 3d22 636f /a>( │ │ │ -0001b370: 4172 7261 794b 6572 6e65 6c3c 2f61 3e26 ArrayKernel& │ │ │ -0001b380: 616d 703b 205f 6b65 726e 656c 2c20 3c73 amp; _kernel, size_t _capacity_ │ │ │ -0001b3c0: 6869 6e74 203d 2030 293c 2f64 6976 3e0a hint = 0)
. │ │ │ -0001b3d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -0001b400: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 742 : Base(_ │ │ │ -0001b460: 6b65 726e 656c 293c 2f64 6976 3e0a 3c64 kernel)
. │ │ │ -0001b480: 3c61 2069 643d 226c 3030 3734 3322 206e 743 { handles_ │ │ │ -0001b4d0: 2e72 6573 6572 7665 285f 6361 7061 6369 .reserve(_capaci │ │ │ -0001b4e0: 7479 5f68 696e 7429 3b20 7d3c 2f64 6976 ty_hint); }
.
744< │ │ │ -0001b540: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -0001b560: 3c61 2069 643d 226c 3030 3734 3522 206e 745 ~ExtStatusSetT │ │ │ -0001b5e0: 3c2f 613e 2829 3c2f 6469 763e 0a3c 6469 ()
.< │ │ │ -0001b600: 6120 6964 3d22 6c30 3037 3436 2220 6e61 a id="l00746" na │ │ │ -0001b610: 6d65 3d22 6c30 3037 3436 223e 3c2f 613e me="l00746"> │ │ │ -0001b620: 3c73 7061 6e20 636c 6173 733d 226c 696e 746 { Base::cle │ │ │ -0001b650: 6172 2829 3b20 7d3c 2f64 6976 3e0a 3c64 ar(); }
. │ │ │ -0001b670: 3c61 2069 643d 226c 3030 3734 3722 206e 747
.
748 │ │ │ -0001b710: 2020 3c73 7061 6e20 636c 6173 733d 2263 // Compl │ │ │ -0001b730: 6578 6974 793a 204f 2831 293c 2f73 7061 exity: O(1)
.
749 │ │ │ -0001b7a0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 inline v │ │ │ -0001b7e0: 6f69 643c 2f73 7061 6e3e 2069 6e73 6572 oid inser │ │ │ -0001b7f0: 7428 4861 6e64 6c65 205f 686e 6429 3c2f t(Handle _hnd).
7 │ │ │ -0001b850: 3530 3c2f 7370 616e 3e20 2020 207b 3c2f 50 {.
7 │ │ │ -0001b8b0: 3531 3c2f 7370 616e 3e20 2020 2020 203c 51 < │ │ │ -0001b8c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001b8d0: 6f72 6466 6c6f 7722 3e69 663c 2f73 7061 ordflow">if (!Base::is_in │ │ │ -0001b8f0: 285f 686e 6429 293c 2f64 6976 3e0a 3c64 (_hnd))
. │ │ │ -0001b910: 3c61 2069 643d 226c 3030 3735 3222 206e 752 {
. │ │ │ -0001b960: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ -0001b990: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 753 Base │ │ │ -0001b9c0: 3a3a 696e 7365 7274 285f 686e 6429 3b3c ::insert(_hnd);< │ │ │ -0001b9d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001ba20: 3735 343c 2f73 7061 6e3e 2020 2020 2020 754 │ │ │ -0001ba30: 2020 6861 6e64 6c65 735f 2e70 7573 685f handles_.push_ │ │ │ -0001ba40: 6261 636b 285f 686e 6429 3b3c 2f64 6976 back(_hnd);
.
755< │ │ │ -0001baa0: 2f73 7061 6e3e 2020 2020 2020 7d3c 2f64 /span> }.
75 │ │ │ -0001bb00: 363c 2f73 7061 6e3e 2020 2020 7d3c 2f64 6 }.
75 │ │ │ -0001bb60: 373c 2f73 7061 6e3e 203c 2f64 6976 3e0a 7
. │ │ │ -0001bb70: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
.
759 inl │ │ │ -0001bc70: 696e 653c 2f73 7061 6e3e 203c 7370 616e ine void │ │ │ -0001bca0: 203c 6120 636c 6173 733d 2263 6f64 6520 erase(Hand │ │ │ -0001bd00: 6c65 205f 686e 6429 3c2f 6469 763e 0a3c le _hnd)
.< │ │ │ -0001bd10: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0001bd20: 3e3c 6120 6964 3d22 6c30 3037 3630 2220 > 760 {
.< │ │ │ -0001bd70: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0001bd80: 3e3c 6120 6964 3d22 6c30 3037 3631 2220 > 761 if (is │ │ │ -0001bdf0: 5f69 6e28 5f68 6e64 2929 3c2f 6469 763e _in(_hnd))
│ │ │ -0001be00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001be30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 762 {.
763 │ │ │ -0001beb0: 3c2f 7370 616e 3e20 2020 2020 2020 2069 i │ │ │ -0001bec0: 7465 7261 746f 7220 6974 203d 2073 7464 terator it = std │ │ │ -0001bed0: 3a3a 6669 6e64 2862 6567 696e 2829 2c20 ::find(begin(), │ │ │ -0001bee0: 656e 6428 292c 205f 686e 6429 3b3c 2f64 end(), _hnd);.
76 │ │ │ -0001bf40: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 │ │ │ -0001bf50: 6572 6173 6528 6974 293b 3c2f 6469 763e erase(it);
│ │ │ -0001bf60: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001bf90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 765 }.
766 │ │ │ -0001c010: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
.
767 < │ │ │ -0001c080: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
.
< │ │ │ -0001c100: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0001c110: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no"> 769 inline │ │ │ -0001c190: 203c 7370 616e 2063 6c61 7373 3d22 6b65 void< │ │ │ -0001c1b0: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> erase(iterator _it)< │ │ │ -0001c220: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001c270: 3737 303c 2f73 7061 6e3e 2020 2020 7b3c 770 {< │ │ │ -0001c280: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001c2d0: 3737 313c 2f73 7061 6e3e 2020 2020 2020 771 │ │ │ -0001c2e0: 6173 7365 7274 285f 6974 2021 3d20 3c73 assert(_it != const_cast&l │ │ │ -0001c310: 743b 3c2f 7370 616e 3e3c 7370 616e 2063 t;c │ │ │ -0001c330: 6f6e 7374 203c 2f73 7061 6e3e 3c61 2063 onst ExtStatu │ │ │ -0001c370: 7353 6574 543c 2f61 3e2a 3c73 7061 6e20 sSetT* │ │ │ -0001c390: 2667 743b 3c2f 7370 616e 3e28 3c73 7061 >(this)-& │ │ │ -0001c3c0: 6774 3b65 6e64 2829 2026 616d 703b 2661 gt;end() &&a │ │ │ -0001c3d0: 6d70 3b3c 2f64 6976 3e0a 3c64 6976 2063 mp;
.
772 │ │ │ -0001c430: 2020 2020 2020 2020 2020 2042 6173 653a Base: │ │ │ -0001c440: 3a69 735f 696e 282a 5f69 7429 293b 3c2f :is_in(*_it));.
7 │ │ │ -0001c4a0: 3733 3c2f 7370 616e 3e20 2020 2020 2042 73 B │ │ │ -0001c4b0: 6173 653a 3a65 7261 7365 282a 5f69 7429 ase::erase(*_it) │ │ │ -0001c4c0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -0001c510: 2020 3737 343c 2f73 7061 6e3e 2020 2020 774 │ │ │ -0001c520: 2020 2a5f 6974 203d 2068 616e 646c 6573 *_it = handles │ │ │ -0001c530: 5f2e 6261 636b 2829 3b3c 2f64 6976 3e0a _.back();
. │ │ │ -0001c540: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ -0001c5b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ -0001c610: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001c660: 2037 3737 3c2f 7370 616e 3e20 3c2f 6469 777 .
778 │ │ │ -0001c6c0: 3c2f 7370 616e 3e20 2020 203c 7370 616e inline < │ │ │ -0001c6f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001c700: 6f72 6474 7970 6522 3e76 6f69 643c 2f73 ordtype">void clear().
779 │ │ │ -0001c770: 3c2f 7370 616e 3e20 2020 207b 3c2f 6469 {.
780 │ │ │ -0001c7d0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 for (iterator it = │ │ │ -0001c810: 2062 6567 696e 2829 3b20 6974 2021 3d20 begin(); it != │ │ │ -0001c820: 656e 6428 293b 202b 2b69 7429 3c2f 6469 end(); ++it).
781 │ │ │ -0001c880: 3c2f 7370 616e 3e20 2020 2020 207b 3c2f {.
7 │ │ │ -0001c8e0: 3832 3c2f 7370 616e 3e20 2020 2020 2020 82 │ │ │ -0001c8f0: 2061 7373 6572 7428 4261 7365 3a3a 6973 assert(Base::is │ │ │ -0001c900: 5f69 6e28 2a69 7429 293b 3c2f 6469 763e _in(*it));
│ │ │ -0001c910: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001c940: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 783 Bas │ │ │ -0001c970: 653a 3a65 7261 7365 282a 6974 293b 3c2f e::erase(*it);.
7 │ │ │ -0001c9d0: 3834 3c2f 7370 616e 3e20 2020 2020 207d 84 } │ │ │ -0001c9e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001ca30: 2037 3835 3c2f 7370 616e 3e20 2020 2020 785 │ │ │ -0001ca40: 2068 616e 646c 6573 5f2e 636c 6561 7228 handles_.clear( │ │ │ -0001ca50: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
.
786 │ │ │ -0001cab0: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
787 .
.
789 inline │ │ │ -0001cc20: 3c73 7061 6e20 636c 6173 733d 226b 6579 unsign │ │ │ -0001cc40: 6564 3c2f 7370 616e 3e20 3c73 7061 6e20 ed int < │ │ │ -0001cc70: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ -0001cc80: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ -0001cc90: 2261 3032 3433 342e 6874 6d6c 2361 3836 "a02434.html#a86 │ │ │ -0001cca0: 6662 3333 6566 3064 6661 3037 6639 6438 fb33ef0dfa07f9d8 │ │ │ -0001ccb0: 3862 6436 3463 3162 6331 6162 3465 223e 8bd64c1bc1ab4e"> │ │ │ -0001ccc0: 7369 7a65 3c2f 613e 2829 3c73 7061 6e20 size() │ │ │ -0001cce0: 2063 6f6e 7374 3c2f 7370 616e 3e3c 2f64 const.
79 │ │ │ -0001cd40: 303c 2f73 7061 6e3e 3c73 7061 6e20 636c 0 │ │ │ -0001cd60: 2020 3c2f 7370 616e 3e7b 203c 7370 616e { return handles_.size │ │ │ -0001cda0: 2829 3b20 7d3c 2f64 6976 3e0a 3c2f 6469 (); }
..
791 │ │ │ -0001ce00: 3c2f 7370 616e 3e20 2020 203c 7370 616e inline < │ │ │ -0001ce30: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001ce40: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype">bool empty() const< │ │ │ -0001ce80: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001ced0: 3739 323c 2f73 7061 6e3e 3c73 7061 6e20 792 │ │ │ -0001cef0: 2020 2020 3c2f 7370 616e 3e7b 203c 7370 { return handles_.em │ │ │ -0001cf30: 7074 7928 293b 207d 3c2f 6469 763e 0a3c pty(); }
.< │ │ │ -0001cf40: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0001cf50: 3e3c 6120 6964 3d22 6c30 3037 3933 2220 > 793
.
794 │ │ │ -0001cff0: 2020 203c 7370 616e 2063 6c61 7373 3d22 //Vecto │ │ │ -0001d010: 7220 4150 493c 2f73 7061 6e3e 3c2f 6469 r API.
795 │ │ │ -0001d070: 3c2f 7370 616e 3e20 2020 203c 7370 616e inline i │ │ │ -0001d0a0: 7465 7261 746f 7220 6265 6769 6e28 293c terator begin()< │ │ │ -0001d0b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001d100: 3739 363c 2f73 7061 6e3e 2020 2020 7b20 796 { │ │ │ -0001d110: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ -0001d130: 3c2f 7370 616e 3e20 6861 6e64 6c65 735f handles_ │ │ │ -0001d140: 2e62 6567 696e 2829 3b20 7d3c 2f64 6976 .begin(); }
.
797< │ │ │ -0001d1a0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> │ │ │ -0001d1c0: 696e 6c69 6e65 3c2f 7370 616e 3e20 636f inline co │ │ │ -0001d1d0: 6e73 745f 6974 6572 6174 6f72 2062 6567 nst_iterator beg │ │ │ -0001d1e0: 696e 2829 3c73 7061 6e20 636c 6173 733d in() const │ │ │ -0001d200: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ -0001d220: 3c61 2069 643d 226c 3030 3739 3822 206e 798 { r │ │ │ -0001d2a0: 6574 7572 6e3c 2f73 7061 6e3e 2068 616e eturn han │ │ │ -0001d2b0: 646c 6573 5f2e 6265 6769 6e28 293b 207d dles_.begin(); } │ │ │ -0001d2c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001d310: 2037 3939 3c2f 7370 616e 3e20 3c2f 6469 799 .
800 │ │ │ -0001d370: 3c2f 7370 616e 3e20 2020 203c 7370 616e inline i │ │ │ -0001d3a0: 7465 7261 746f 7220 656e 6428 293c 2f64 terator end().
80 │ │ │ -0001d400: 313c 2f73 7061 6e3e 2020 2020 7b20 3c73 1 { return handles_.e │ │ │ -0001d440: 6e64 2829 3b20 7d3c 2f64 6976 3e0a 3c64 nd(); }
. │ │ │ -0001d460: 3c61 2069 643d 226c 3030 3830 3222 206e 802 inli │ │ │ -0001d4c0: 6e65 3c2f 7370 616e 3e20 636f 6e73 745f ne const_ │ │ │ -0001d4d0: 6974 6572 6174 6f72 2065 6e64 2829 3c73 iterator end() const
.
│ │ │ -0001d550: 2020 3830 333c 2f73 7061 6e3e 3c73 7061 803 { < │ │ │ -0001d580: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001d590: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -0001d5a0: 2f73 7061 6e3e 2068 616e 646c 6573 5f2e /span> handles_. │ │ │ -0001d5b0: 656e 6428 293b 207d 3c2f 6469 763e 0a3c end(); }
.< │ │ │ -0001d5c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0001d5d0: 3e3c 6120 6964 3d22 6c30 3038 3034 2220 > 804
.
805 │ │ │ -0001d670: 2020 203c 7370 616e 2063 6c61 7373 3d22 inline< │ │ │ -0001d690: 2f73 7061 6e3e 2048 616e 646c 6526 616d /span> Handle&am │ │ │ -0001d6a0: 703b 2066 726f 6e74 2829 3c2f 6469 763e p; front()
│ │ │ -0001d6b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001d6e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 806 { return handles_.fron │ │ │ -0001d740: 7428 293b 207d 3c2f 6469 763e 0a3c 6469 t(); }
.< │ │ │ -0001d760: 6120 6964 3d22 6c30 3038 3037 2220 6e61 a id="l00807" na │ │ │ -0001d770: 6d65 3d22 6c30 3038 3037 223e 3c2f 613e me="l00807"> │ │ │ -0001d780: 3c73 7061 6e20 636c 6173 733d 226c 696e 807 inlin │ │ │ -0001d7c0: 653c 2f73 7061 6e3e 203c 7370 616e 2063 e c │ │ │ -0001d7e0: 6f6e 7374 3c2f 7370 616e 3e20 4861 6e64 onst Hand │ │ │ -0001d7f0: 6c65 2661 6d70 3b20 6672 6f6e 7428 293c le& front()< │ │ │ -0001d800: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001d810: 6f72 6422 3e20 636f 6e73 743c 2f73 7061 ord"> const
.
808 { │ │ │ -0001d8a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ -0001d8c0: 3c2f 7370 616e 3e20 6861 6e64 6c65 735f handles_ │ │ │ -0001d8d0: 2e66 726f 6e74 2829 3b20 7d3c 2f64 6976 .front(); }
.
809< │ │ │ -0001d930: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
. │ │ │ -0001d950: 3c61 2069 643d 226c 3030 3831 3022 206e 810 inli │ │ │ -0001d9b0: 6e65 3c2f 7370 616e 3e20 4861 6e64 6c65 ne Handle │ │ │ -0001d9c0: 2661 6d70 3b20 6261 636b 2829 3c2f 6469 & back().
811 │ │ │ -0001da20: 3c2f 7370 616e 3e20 2020 207b 203c 7370 { return handles_.ba │ │ │ -0001da60: 636b 2829 3b20 7d3c 2f64 6976 3e0a 3c64 ck(); }
. │ │ │ -0001da80: 3c61 2069 643d 226c 3030 3831 3222 206e 812 inli │ │ │ -0001dae0: 6e65 3c2f 7370 616e 3e20 3c73 7061 6e20 ne │ │ │ -0001db00: 636f 6e73 743c 2f73 7061 6e3e 2048 616e const Han │ │ │ -0001db10: 646c 6526 616d 703b 2062 6163 6b28 293c dle& back()< │ │ │ -0001db20: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001db30: 6f72 6422 3e20 636f 6e73 743c 2f73 7061 ord"> const
.
813 { │ │ │ -0001dbc0: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ -0001dbe0: 3c2f 7370 616e 3e20 6861 6e64 6c65 735f handles_ │ │ │ -0001dbf0: 2e62 6163 6b28 293b 207d 3c2f 6469 763e .back(); }
│ │ │ -0001dc00: 0a3c 6469 7620 636c 6173 733d 226c 696e .. │ │ │ -0001dc60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001dcb0: 2038 3135 3c2f 7370 616e 3e20 3c2f 6469 815 .
816 │ │ │ -0001dd10: 3c2f 7370 616e 3e20 203c 7370 616e 2063 t │ │ │ -0001dd30: 7970 6564 6566 3c2f 7370 616e 3e20 4578 ypedef Ex │ │ │ -0001dd40: 7453 7461 7475 7353 6574 5426 6c74 3b46 tStatusSetT<F │ │ │ -0001dd50: 6163 6548 616e 646c 6526 6774 3b20 2020 aceHandle> │ │ │ -0001dd60: 2020 2020 2020 4578 7446 6163 6553 7461 ExtFaceSta │ │ │ -0001dd70: 7475 7353 6574 3b3c 2f64 6976 3e0a 3c64 tusSet;
. │ │ │ -0001dd90: 3c61 2069 643d 226c 3030 3831 3722 206e 817 typede │ │ │ -0001ddf0: 663c 2f73 7061 6e3e 2045 7874 5374 6174 f ExtStat │ │ │ -0001de00: 7573 5365 7454 266c 743b 5665 7274 6578 usSetT<Vertex │ │ │ -0001de10: 4861 6e64 6c65 2667 743b 2020 2020 2020 Handle> │ │ │ -0001de20: 2045 7874 5665 7274 6578 5374 6174 7573 ExtVertexStatus │ │ │ -0001de30: 5365 743b 3c2f 6469 763e 0a3c 6469 7620 Set;
.
818 │ │ │ -0001de90: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typedef ExtStatusS │ │ │ -0001dec0: 6574 5426 6c74 3b45 6467 6548 616e 646c etT<EdgeHandl │ │ │ -0001ded0: 6526 6774 3b20 2020 2020 2020 2020 4578 e> Ex │ │ │ -0001dee0: 7445 6467 6553 7461 7475 7353 6574 3b3c tEdgeStatusSet;< │ │ │ -0001def0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001df40: 3831 393c 2f73 7061 6e3e 2020 3c73 7061 819 typedef │ │ │ -0001df70: 2045 7874 5374 6174 7573 5365 7454 266c ExtStatusSetT&l │ │ │ -0001df80: 743b 4861 6c66 6564 6765 4861 6e64 6c65 t;HalfedgeHandle │ │ │ -0001df90: 2667 743b 2020 2020 2045 7874 4861 6c66 > ExtHalf │ │ │ -0001dfa0: 6564 6765 5374 6174 7573 5365 743b 3c2f edgeStatusSet;.
8 │ │ │ -0001e000: 3230 3c2f 7370 616e 3e20 3c2f 6469 763e 20
│ │ │ -0001e010: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001e040: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 821priva │ │ │ -0001e080: 7465 3c2f 7370 616e 3e3a 3c2f 6469 763e te:
│ │ │ -0001e090: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001e0c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 822 // │ │ │ -0001e100: 6974 6572 6174 6f72 733c 2f73 7061 6e3e iterators │ │ │ -0001e110: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001e160: 2038 3233 3c2f 7370 616e 3e20 203c 7370 823 typedef std::vector< │ │ │ -0001e1a0: 3b56 6572 7465 7826 6774 3b20 2020 2020 ;Vertex> │ │ │ -0001e1b0: 2020 2020 2020 2020 2020 2056 6572 7465 Verte │ │ │ -0001e1c0: 7843 6f6e 7461 696e 6572 3b3c 2f64 6976 xContainer;
.
824< │ │ │ -0001e220: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> ty │ │ │ -0001e240: 7065 6465 663c 2f73 7061 6e3e 2073 7464 pedef std │ │ │ -0001e250: 3a3a 7665 6374 6f72 266c 743b 4564 6765 ::vector<Edge │ │ │ -0001e260: 2667 743b 2020 2020 2020 2020 2020 2020 > │ │ │ -0001e270: 2020 2020 2020 4564 6765 436f 6e74 6169 EdgeContai │ │ │ -0001e280: 6e65 723b 3c2f 6469 763e 0a3c 6469 7620 ner;
.
825 │ │ │ -0001e2e0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typedef std::vecto │ │ │ -0001e310: 7226 6c74 3b46 6163 6526 6774 3b20 2020 r<Face> │ │ │ -0001e320: 2020 2020 2020 2020 2020 2020 2020 2046 F │ │ │ -0001e330: 6163 6543 6f6e 7461 696e 6572 3b3c 2f64 aceContainer;.
82 │ │ │ -0001e390: 363c 2f73 7061 6e3e 2020 3c73 7061 6e20 6 │ │ │ -0001e3b0: 7479 7065 6465 663c 2f73 7061 6e3e 2056 typedef V │ │ │ -0001e3c0: 6572 7465 7843 6f6e 7461 696e 6572 3a3a ertexContainer:: │ │ │ -0001e3d0: 6974 6572 6174 6f72 2020 2020 2020 2020 iterator │ │ │ -0001e3e0: 2020 4b65 726e 656c 5665 7274 6578 4974 KernelVertexIt │ │ │ -0001e3f0: 6572 3b3c 2f64 6976 3e0a 3c64 6976 2063 er;
.
827 │ │ │ -0001e450: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef VertexConta │ │ │ -0001e480: 696e 6572 3a3a 636f 6e73 745f 6974 6572 iner::const_iter │ │ │ -0001e490: 6174 6f72 2020 2020 4b65 726e 656c 436f ator KernelCo │ │ │ -0001e4a0: 6e73 7456 6572 7465 7849 7465 723b 3c2f nstVertexIter;.
8 │ │ │ -0001e500: 3238 3c2f 7370 616e 3e20 203c 7370 616e 28 typedef │ │ │ -0001e530: 4564 6765 436f 6e74 6169 6e65 723a 3a69 EdgeContainer::i │ │ │ -0001e540: 7465 7261 746f 7220 2020 2020 2020 2020 terator │ │ │ -0001e550: 2020 204b 6572 6e65 6c45 6467 6549 7465 KernelEdgeIte │ │ │ -0001e560: 723b 3c2f 6469 763e 0a3c 6469 7620 636c r;
.
829 < │ │ │ -0001e5c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001e5d0: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord">typedef EdgeContaine │ │ │ -0001e5f0: 723a 3a63 6f6e 7374 5f69 7465 7261 746f r::const_iterato │ │ │ -0001e600: 7220 2020 2020 204b 6572 6e65 6c43 6f6e r KernelCon │ │ │ -0001e610: 7374 4564 6765 4974 6572 3b3c 2f64 6976 stEdgeIter;
.
830< │ │ │ -0001e670: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> ty │ │ │ -0001e690: 7065 6465 663c 2f73 7061 6e3e 2046 6163 pedef Fac │ │ │ -0001e6a0: 6543 6f6e 7461 696e 6572 3a3a 6974 6572 eContainer::iter │ │ │ -0001e6b0: 6174 6f72 2020 2020 2020 2020 2020 2020 ator │ │ │ -0001e6c0: 4b65 726e 656c 4661 6365 4974 6572 3b3c KernelFaceIter;< │ │ │ -0001e6d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001e720: 3833 313c 2f73 7061 6e3e 2020 3c73 7061 831 typedef │ │ │ -0001e750: 2046 6163 6543 6f6e 7461 696e 6572 3a3a FaceContainer:: │ │ │ -0001e760: 636f 6e73 745f 6974 6572 6174 6f72 2020 const_iterator │ │ │ -0001e770: 2020 2020 4b65 726e 656c 436f 6e73 7446 KernelConstF │ │ │ -0001e780: 6163 6549 7465 723b 3c2f 6469 763e 0a3c aceIter;
.< │ │ │ -0001e790: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0001e7a0: 3e3c 6120 6964 3d22 6c30 3038 3332 2220 > 832 typed │ │ │ -0001e800: 6566 3c2f 7370 616e 3e20 7374 643a 3a76 ef std::v │ │ │ -0001e810: 6563 746f 7226 6c74 3b75 6e73 6967 6e65 ector<unsigne │ │ │ -0001e820: 6420 696e 7426 6774 3b20 2020 2020 2020 d int> │ │ │ -0001e830: 2020 2042 6974 4d61 736b 436f 6e74 6169 BitMaskContai │ │ │ -0001e840: 6e65 723b 3c2f 6469 763e 0a3c 6469 7620 ner;
.
833 │ │ │ -0001e8a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001e8f0: 2038 3334 3c2f 7370 616e 3e20 3c2f 6469 834 .
835 │ │ │ -0001e950: 3c2f 7370 616e 3e20 204b 6572 6e65 6c56 KernelV │ │ │ -0001e960: 6572 7465 7849 7465 7220 2020 2020 2076 ertexIter v │ │ │ -0001e970: 6572 7469 6365 735f 6265 6769 6e28 2920 ertices_begin() │ │ │ -0001e980: 2020 2020 2020 207b 203c 7370 616e 2063 { return │ │ │ -0001e9b0: 2076 6572 7469 6365 735f 2e62 6567 696e vertices_.begin │ │ │ -0001e9c0: 2829 3b20 7d3c 2f64 6976 3e0a 3c64 6976 (); }
.
< │ │ │ -0001ea00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0001ea10: 6e6f 223e 2020 3833 363c 2f73 7061 6e3e no"> 836 │ │ │ -0001ea20: 2020 4b65 726e 656c 436f 6e73 7456 6572 KernelConstVer │ │ │ -0001ea30: 7465 7849 7465 7220 7665 7274 6963 6573 texIter vertices │ │ │ -0001ea40: 5f62 6567 696e 2829 3c73 7061 6e20 636c _begin() c │ │ │ -0001ea60: 6f6e 7374 2020 3c2f 7370 616e 3e7b 203c onst { < │ │ │ -0001ea70: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001ea80: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -0001ea90: 2f73 7061 6e3e 2076 6572 7469 6365 735f /span> vertices_ │ │ │ -0001eaa0: 2e62 6567 696e 2829 3b20 7d3c 2f64 6976 .begin(); }
.
837< │ │ │ -0001eb00: 2f73 7061 6e3e 2020 4b65 726e 656c 5665 /span> KernelVe │ │ │ -0001eb10: 7274 6578 4974 6572 2020 2020 2020 7665 rtexIter ve │ │ │ -0001eb20: 7274 6963 6573 5f65 6e64 2829 2020 2020 rtices_end() │ │ │ -0001eb30: 2020 2020 2020 7b20 3c73 7061 6e20 636c { return │ │ │ -0001eb60: 7665 7274 6963 6573 5f2e 656e 6428 293b vertices_.end(); │ │ │ -0001eb70: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
838 K │ │ │ -0001ebd0: 6572 6e65 6c43 6f6e 7374 5665 7274 6578 ernelConstVertex │ │ │ -0001ebe0: 4974 6572 2076 6572 7469 6365 735f 656e Iter vertices_en │ │ │ -0001ebf0: 6428 293c 7370 616e 2063 6c61 7373 3d22 d() const │ │ │ -0001ec10: 2020 203c 2f73 7061 6e3e 7b20 3c73 7061 { return vertices_.en │ │ │ -0001ec50: 6428 293b 207d 3c2f 6469 763e 0a3c 6469 d(); }
.< │ │ │ -0001ec70: 6120 6964 3d22 6c30 3038 3339 2220 6e61 a id="l00839" na │ │ │ -0001ec80: 6d65 3d22 6c30 3038 3339 223e 3c2f 613e me="l00839"> │ │ │ -0001ec90: 3c73 7061 6e20 636c 6173 733d 226c 696e 839
.
840 K │ │ │ -0001ed10: 6572 6e65 6c45 6467 6549 7465 7220 2020 ernelEdgeIter │ │ │ -0001ed20: 2020 2020 2065 6467 6573 5f62 6567 696e edges_begin │ │ │ -0001ed30: 2829 2020 2020 2020 2020 2020 207b 203c () { < │ │ │ -0001ed40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ -0001ed50: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow">return< │ │ │ -0001ed60: 2f73 7061 6e3e 2065 6467 6573 5f2e 6265 /span> edges_.be │ │ │ -0001ed70: 6769 6e28 293b 207d 3c2f 6469 763e 0a3c gin(); }
.< │ │ │ -0001ed80: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -0001ed90: 3e3c 6120 6964 3d22 6c30 3038 3431 2220 > 841 KernelConst │ │ │ -0001ede0: 4564 6765 4974 6572 2020 2065 6467 6573 EdgeIter edges │ │ │ -0001edf0: 5f62 6567 696e 2829 3c73 7061 6e20 636c _begin() c │ │ │ -0001ee10: 6f6e 7374 2020 2020 203c 2f73 7061 6e3e onst │ │ │ -0001ee20: 7b20 3c73 7061 6e20 636c 6173 733d 226b { retu │ │ │ -0001ee40: 726e 3c2f 7370 616e 3e20 6564 6765 735f rn edges_ │ │ │ -0001ee50: 2e62 6567 696e 2829 3b20 7d3c 2f64 6976 .begin(); }
.
842< │ │ │ -0001eeb0: 2f73 7061 6e3e 2020 4b65 726e 656c 4564 /span> KernelEd │ │ │ -0001eec0: 6765 4974 6572 2020 2020 2020 2020 6564 geIter ed │ │ │ -0001eed0: 6765 735f 656e 6428 2920 2020 2020 2020 ges_end() │ │ │ -0001eee0: 2020 2020 2020 7b20 3c73 7061 6e20 636c { return │ │ │ -0001ef10: 6564 6765 735f 2e65 6e64 2829 3b20 7d3c edges_.end(); }< │ │ │ -0001ef20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -0001ef70: 3834 333c 2f73 7061 6e3e 2020 4b65 726e 843 Kern │ │ │ -0001ef80: 656c 436f 6e73 7445 6467 6549 7465 7220 elConstEdgeIter │ │ │ -0001ef90: 2020 6564 6765 735f 656e 6428 293c 7370 edges_end() const │ │ │ -0001efc0: 3c2f 7370 616e 3e7b 203c 7370 616e 2063 { return │ │ │ -0001eff0: 2065 6467 6573 5f2e 656e 6428 293b 207d edges_.end(); } │ │ │ -0001f000: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001f050: 2038 3434 3c2f 7370 616e 3e20 3c2f 6469 844 .
845 │ │ │ -0001f0b0: 3c2f 7370 616e 3e20 204b 6572 6e65 6c46 KernelF │ │ │ -0001f0c0: 6163 6549 7465 7220 2020 2020 2020 2066 aceIter f │ │ │ -0001f0d0: 6163 6573 5f62 6567 696e 2829 2020 2020 aces_begin() │ │ │ -0001f0e0: 2020 2020 2020 207b 203c 7370 616e 2063 { return │ │ │ -0001f110: 2066 6163 6573 5f2e 6265 6769 6e28 293b faces_.begin(); │ │ │ -0001f120: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
846 K │ │ │ -0001f180: 6572 6e65 6c43 6f6e 7374 4661 6365 4974 ernelConstFaceIt │ │ │ -0001f190: 6572 2020 2066 6163 6573 5f62 6567 696e er faces_begin │ │ │ -0001f1a0: 2829 3c73 7061 6e20 636c 6173 733d 226b () const │ │ │ -0001f1c0: 2020 203c 2f73 7061 6e3e 7b20 3c73 7061 { return faces_.begin │ │ │ -0001f200: 2829 3b20 7d3c 2f64 6976 3e0a 3c64 6976 (); }
.
< │ │ │ -0001f240: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0001f250: 6e6f 223e 2020 3834 373c 2f73 7061 6e3e no"> 847 │ │ │ -0001f260: 2020 4b65 726e 656c 4661 6365 4974 6572 KernelFaceIter │ │ │ -0001f270: 2020 2020 2020 2020 6661 6365 735f 656e faces_en │ │ │ -0001f280: 6428 2920 2020 2020 2020 2020 2020 2020 d() │ │ │ -0001f290: 7b20 3c73 7061 6e20 636c 6173 733d 226b { retu │ │ │ -0001f2b0: 726e 3c2f 7370 616e 3e20 6661 6365 735f rn faces_ │ │ │ -0001f2c0: 2e65 6e64 2829 3b20 7d3c 2f64 6976 3e0a .end(); }
. │ │ │ -0001f2d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
│ │ │ -0001f3b0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -0001f420: 6120 6964 3d22 6c30 3038 3531 2220 6e61 a id="l00851" na │ │ │ -0001f430: 6d65 3d22 6c30 3038 3531 223e 3c2f 613e me="l00851"> │ │ │ -0001f440: 3c73 7061 6e20 636c 6173 733d 226c 696e 851 inline< │ │ │ -0001f480: 2f73 7061 6e3e 2042 6974 4d61 736b 436f /span> BitMaskCo │ │ │ -0001f490: 6e74 6169 6e65 7226 616d 703b 2020 2020 ntainer& │ │ │ -0001f4a0: 2020 2020 2020 2020 2020 2020 2020 6269 bi │ │ │ -0001f4b0: 745f 6d61 736b 7328 5665 7274 6578 4861 t_masks(VertexHa │ │ │ -0001f4c0: 6e64 6c65 203c 7370 616e 2063 6c61 7373 ndle /*_du │ │ │ -0001f4e0: 6d6d 795f 686e 642a 2f3c 2f73 7061 6e3e mmy_hnd*/ │ │ │ -0001f4f0: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
.
│ │ │ -0001f540: 2020 3835 323c 2f73 7061 6e3e 2020 7b20 852 { │ │ │ -0001f550: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ -0001f570: 3c2f 7370 616e 3e20 7665 7274 6578 5f62 vertex_b │ │ │ -0001f580: 6974 5f6d 6173 6b73 5f3b 207d 3c2f 6469 it_masks_; }.
853 │ │ │ -0001f5e0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 i │ │ │ -0001f600: 6e6c 696e 653c 2f73 7061 6e3e 2042 6974 nline Bit │ │ │ -0001f610: 4d61 736b 436f 6e74 6169 6e65 7226 616d MaskContainer&am │ │ │ -0001f620: 703b 2020 2020 2020 2020 2020 2020 2020 p; │ │ │ -0001f630: 2020 2020 6269 745f 6d61 736b 7328 4564 bit_masks(Ed │ │ │ -0001f640: 6765 4861 6e64 6c65 203c 7370 616e 2063 geHandle / │ │ │ -0001f660: 2a5f 6475 6d6d 795f 686e 642a 2f3c 2f73 *_dummy_hnd*/)
.
< │ │ │ -0001f6b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -0001f6c0: 6e6f 223e 2020 3835 343c 2f73 7061 6e3e no"> 854 │ │ │ -0001f6d0: 2020 7b20 3c73 7061 6e20 636c 6173 733d { re │ │ │ -0001f6f0: 7475 726e 3c2f 7370 616e 3e20 6564 6765 turn edge │ │ │ -0001f700: 5f62 6974 5f6d 6173 6b73 5f3b 207d 3c2f _bit_masks_; }.
8 │ │ │ -0001f760: 3535 3c2f 7370 616e 3e20 203c 7370 616e 55 inline B │ │ │ -0001f790: 6974 4d61 736b 436f 6e74 6169 6e65 7226 itMaskContainer& │ │ │ -0001f7a0: 616d 703b 2020 2020 2020 2020 2020 2020 amp; │ │ │ -0001f7b0: 2020 2020 2020 6269 745f 6d61 736b 7328 bit_masks( │ │ │ -0001f7c0: 4661 6365 4861 6e64 6c65 203c 7370 616e FaceHandle /*_dummy_hnd*/< │ │ │ -0001f7f0: 2f73 7061 6e3e 293c 2f64 6976 3e0a 3c64 /span>)
. │ │ │ -0001f810: 3c61 2069 643d 226c 3030 3835 3622 206e 856 { │ │ │ -0001f870: 7265 7475 726e 3c2f 7370 616e 3e20 6661 return fa │ │ │ -0001f880: 6365 5f62 6974 5f6d 6173 6b73 5f3b 207d ce_bit_masks_; } │ │ │ -0001f890: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -0001f8e0: 2038 3537 3c2f 7370 616e 3e20 203c 7370 857 inline │ │ │ -0001f910: 2042 6974 4d61 736b 436f 6e74 6169 6e65 BitMaskContaine │ │ │ -0001f920: 7226 616d 703b 2020 2020 2020 2020 2020 r& │ │ │ -0001f930: 2020 2020 2020 2020 6269 745f 6d61 736b bit_mask │ │ │ -0001f940: 7328 4861 6c66 6564 6765 4861 6e64 6c65 s(HalfedgeHandle │ │ │ -0001f950: 203c 7370 616e 2063 6c61 7373 3d22 636f /*_dummy_ │ │ │ -0001f970: 686e 642a 2f3c 2f73 7061 6e3e 293c 2f64 hnd*/).
85 │ │ │ -0001f9d0: 383c 2f73 7061 6e3e 2020 7b20 3c73 7061 8 { return halfedge_bit │ │ │ -0001fa10: 5f6d 6173 6b73 5f3b 207d 3c2f 6469 763e _masks_; }
│ │ │ -0001fa20: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -0001fa90: 6120 6964 3d22 6c30 3038 3630 2220 6e61 a id="l00860" na │ │ │ -0001faa0: 6d65 3d22 6c30 3038 3630 223e 3c2f 613e me="l00860"> │ │ │ -0001fab0: 3c73 7061 6e20 636c 6173 733d 226c 696e 860 templat │ │ │ -0001faf0: 653c 2f73 7061 6e3e 2026 6c74 3b3c 7370 e <class │ │ │ -0001fb20: 4861 6e64 6c65 2667 743b 3c2f 6469 763e Handle>
│ │ │ -0001fb30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001fb60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 861 unsigned │ │ │ -0001fbb0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int │ │ │ -0001fbe0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -0001fbf0: 2020 2070 6f70 5f62 6974 5f6d 6173 6b28 pop_bit_mask( │ │ │ -0001fc00: 4861 6e64 6c65 205f 686e 6429 3c2f 6469 Handle _hnd).
862 │ │ │ -0001fc60: 3c2f 7370 616e 3e20 207b 3c2f 6469 763e {
│ │ │ -0001fc70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -0001fca0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 863 assert( │ │ │ -0001fcd0: 2162 6974 5f6d 6173 6b73 285f 686e 6429 !bit_masks(_hnd) │ │ │ -0001fce0: 2e65 6d70 7479 2829 293b 3c73 7061 6e20 .empty()); │ │ │ -0001fd00: 2f2f 6368 6563 6b20 6966 2074 6865 2063 //check if the c │ │ │ -0001fd10: 6c69 656e 7420 7265 7175 6573 7420 746f lient request to │ │ │ -0001fd20: 6f20 6d61 6e79 2073 7461 7475 7320 7365 o many status se │ │ │ -0001fd30: 7473 3c2f 7370 616e 3e3c 2f64 6976 3e0a ts
. │ │ │ -0001fd40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
. │ │ │ -0001fe10: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
866 │ │ │ -0001fee0: 2020 3c73 7061 6e20 636c 6173 733d 226b retu │ │ │ -0001ff00: 726e 3c2f 7370 616e 3e20 6269 745f 6d61 rn bit_ma │ │ │ -0001ff10: 736b 3b3c 2f64 6976 3e0a 3c64 6976 2063 sk;
.
867 │ │ │ -0001ff70: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ -0001ffc0: 2020 3836 383c 2f73 7061 6e3e 203c 2f64 868 .
86 │ │ │ -00020020: 393c 2f73 7061 6e3e 2020 3c73 7061 6e20 9 │ │ │ -00020040: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template │ │ │ -00020050: 266c 743b 3c73 7061 6e20 636c 6173 733d <class< │ │ │ -00020070: 2f73 7061 6e3e 2048 616e 646c 6526 6774 /span> Handle> │ │ │ -00020080: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -000200d0: 2020 3837 303c 2f73 7061 6e3e 2020 3c73 870 void │ │ │ -00020110: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00020120: 2020 2020 2020 2020 2070 7573 685f 6269 push_bi │ │ │ -00020130: 745f 6d61 736b 2848 616e 646c 6520 5f68 t_mask(Handle _h │ │ │ -00020140: 6e64 2c20 3c73 7061 6e20 636c 6173 733d nd, un │ │ │ -00020160: 7369 676e 6564 3c2f 7370 616e 3e20 3c73 signed int _bit_mask).
87 │ │ │ -000201f0: 313c 2f73 7061 6e3e 2020 7b3c 2f64 6976 1 {
.
872< │ │ │ -00020250: 2f73 7061 6e3e 2020 2020 6173 7365 7274 /span> assert │ │ │ -00020260: 2873 7464 3a3a 6669 6e64 2862 6974 5f6d (std::find(bit_m │ │ │ -00020270: 6173 6b73 285f 686e 6429 2e62 6567 696e asks(_hnd).begin │ │ │ -00020280: 2829 2c20 6269 745f 6d61 736b 7328 5f68 (), bit_masks(_h │ │ │ -00020290: 6e64 292e 656e 6428 292c 205f 6269 745f nd).end(), _bit_ │ │ │ -000202a0: 6d61 736b 2920 3d3d 3c2f 6469 763e 0a3c mask) ==
.< │ │ │ -000202b0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -000202c0: 3e3c 6120 6964 3d22 6c30 3038 3733 2220 > 873 bi │ │ │ -00020310: 745f 6d61 736b 7328 5f68 6e64 292e 656e t_masks(_hnd).en │ │ │ -00020320: 6428 2929 3b3c 7370 616e 2063 6c61 7373 d());//thi │ │ │ -00020340: 7320 6d61 736b 2073 686f 756c 6420 6265 s mask should be │ │ │ -00020350: 206e 6f74 2061 6c72 6561 6479 2075 7365 not already use │ │ │ -00020360: 643c 2f73 7061 6e3e 3c2f 6469 763e 0a3c d
.< │ │ │ -00020370: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ -00020380: 3e3c 6120 6964 3d22 6c30 3038 3734 2220 > 874 bit_masks │ │ │ -000203d0: 285f 686e 6429 2e70 7573 685f 6261 636b (_hnd).push_back │ │ │ -000203e0: 285f 6269 745f 6d61 736b 293b 3c2f 6469 (_bit_mask);.
875 │ │ │ -00020440: 3c2f 7370 616e 3e20 207d 3c2f 6469 763e }
│ │ │ -00020450: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -000204c0: 6120 6964 3d22 6c30 3038 3737 2220 6e61 a id="l00877" na │ │ │ -000204d0: 6d65 3d22 6c30 3038 3737 223e 3c2f 613e me="l00877"> │ │ │ -000204e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 877 voi │ │ │ -00020520: 643c 2f73 7061 6e3e 2020 2020 2020 2020 d │ │ │ -00020530: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00020540: 2020 2020 2020 2020 2020 2020 2020 696e in │ │ │ -00020550: 6974 5f62 6974 5f6d 6173 6b73 2842 6974 it_bit_masks(Bit │ │ │ -00020560: 4d61 736b 436f 6e74 6169 6e65 7226 616d MaskContainer&am │ │ │ -00020570: 703b 205f 626d 6329 3b3c 2f64 6976 3e0a p; _bmc);
. │ │ │ -00020580: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
879 .
8 │ │ │ -000206e0: 3830 3c2f 7370 616e 3e3c 7370 616e 2063 80p │ │ │ -00020700: 726f 7465 6374 6564 3c2f 7370 616e 3e3a rotected: │ │ │ -00020710: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00020760: 2038 3831 3c2f 7370 616e 3e20 3c2f 6469 881 .
882 │ │ │ -000207c0: 3c2f 7370 616e 3e20 2056 6572 7465 7853 VertexS │ │ │ -000207d0: 7461 7475 7350 726f 7065 7274 7948 616e tatusPropertyHan │ │ │ -000207e0: 646c 6520 2020 2020 2020 2020 2020 2020 dle │ │ │ -000207f0: 2020 2076 6572 7465 785f 7374 6174 7573 vertex_status │ │ │ -00020800: 5f3b 3c2f 6469 763e 0a3c 6469 7620 636c _;
.
883 H │ │ │ -00020860: 616c 6665 6467 6553 7461 7475 7350 726f alfedgeStatusPro │ │ │ -00020870: 7065 7274 7948 616e 646c 6520 2020 2020 pertyHandle │ │ │ -00020880: 2020 2020 2020 2020 2068 616c 6665 6467 halfedg │ │ │ -00020890: 655f 7374 6174 7573 5f3b 3c2f 6469 763e e_status_;
│ │ │ -000208a0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -000208d0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 884 EdgeStatu │ │ │ -00020900: 7350 726f 7065 7274 7948 616e 646c 6520 sPropertyHandle │ │ │ -00020910: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00020920: 2065 6467 655f 7374 6174 7573 5f3b 3c2f edge_status_;.
8 │ │ │ -00020980: 3835 3c2f 7370 616e 3e20 2046 6163 6553 85 FaceS │ │ │ -00020990: 7461 7475 7350 726f 7065 7274 7948 616e tatusPropertyHan │ │ │ -000209a0: 646c 6520 2020 2020 2020 2020 2020 2020 dle │ │ │ -000209b0: 2020 2020 2066 6163 655f 7374 6174 7573 face_status │ │ │ -000209c0: 5f3b 3c2f 6469 763e 0a3c 6469 7620 636c _;
.
886 .
8 │ │ │ -00020a70: 3837 3c2f 7370 616e 3e20 203c 7370 616e 87 unsigned i │ │ │ -00020ac0: 6e74 3c2f 7370 616e 3e20 2020 2020 2020 nt │ │ │ -00020ad0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00020ae0: 2020 2020 2020 2072 6566 636f 756e 745f refcount_ │ │ │ -00020af0: 7673 7461 7475 735f 3b3c 2f64 6976 3e0a vstatus_;
. │ │ │ -00020b00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
889 │ │ │ -00020c30: 203c 7370 616e 2063 6c61 7373 3d22 6b65 unsig │ │ │ -00020c50: 6e65 643c 2f73 7061 6e3e 203c 7370 616e ned int │ │ │ -00020c80: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00020c90: 2020 2020 2020 2020 2020 2020 2072 6566 ref │ │ │ -00020ca0: 636f 756e 745f 6573 7461 7475 735f 3b3c count_estatus_;< │ │ │ -00020cb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -00020d00: 3839 303c 2f73 7061 6e3e 2020 3c73 7061 890 unsigned │ │ │ -00020d50: 696e 743c 2f73 7061 6e3e 2020 2020 2020 int │ │ │ -00020d60: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00020d70: 2020 2020 2020 2020 7265 6663 6f75 6e74 refcount │ │ │ -00020d80: 5f66 7374 6174 7573 5f3b 3c2f 6469 763e _fstatus_;
│ │ │ -00020d90: 0a3c 6469 7620 636c 6173 733d 226c 696e ..< │ │ │ -00020e00: 6120 6964 3d22 6c30 3038 3932 2220 6e61 a id="l00892" na │ │ │ -00020e10: 6d65 3d22 6c30 3038 3932 223e 3c2f 613e me="l00892"> │ │ │ -00020e20: 3c73 7061 6e20 636c 6173 733d 226c 696e 892private:
.< │ │ │ -00020e80: 6120 6964 3d22 6c30 3038 3933 2220 6e61 a id="l00893" na │ │ │ -00020e90: 6d65 3d22 6c30 3038 3933 223e 3c2f 613e me="l00893"> │ │ │ -00020ea0: 3c73 7061 6e20 636c 6173 733d 226c 696e 893 VertexContain │ │ │ -00020ed0: 6572 2020 2020 2020 2020 2020 2020 2020 er │ │ │ -00020ee0: 2020 2020 2020 2020 2020 2020 2076 6572 ver │ │ │ -00020ef0: 7469 6365 735f 3b3c 2f64 6976 3e0a 3c64 tices_;
. │ │ │ -00020f10: 3c61 2069 643d 226c 3030 3839 3422 206e 894 EdgeContaine │ │ │ -00020f60: 7220 2020 2020 2020 2020 2020 2020 2020 r │ │ │ -00020f70: 2020 2020 2020 2020 2020 2020 2020 6564 ed │ │ │ -00020f80: 6765 735f 3b3c 2f64 6976 3e0a 3c64 6976 ges_;
.
< │ │ │ -00020fc0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00020fd0: 6e6f 223e 2020 3839 353c 2f73 7061 6e3e no"> 895 │ │ │ -00020fe0: 2020 4661 6365 436f 6e74 6169 6e65 7220 FaceContainer │ │ │ -00020ff0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00021000: 2020 2020 2020 2020 2020 2020 6661 6365 face │ │ │ -00021010: 735f 3b3c 2f64 6976 3e0a 3c64 6976 2063 s_;
.
896 < │ │ │ -00021070: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ -000210c0: 3839 373c 2f73 7061 6e3e 2020 4269 744d 897 BitM │ │ │ -000210d0: 6173 6b43 6f6e 7461 696e 6572 2020 2020 askContainer │ │ │ -000210e0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000210f0: 2020 2020 2020 6861 6c66 6564 6765 5f62 halfedge_b │ │ │ -00021100: 6974 5f6d 6173 6b73 5f3b 3c2f 6469 763e it_masks_;
│ │ │ -00021110: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00021140: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 898 BitMaskCo │ │ │ -00021170: 6e74 6169 6e65 7220 2020 2020 2020 2020 ntainer │ │ │ -00021180: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00021190: 2065 6467 655f 6269 745f 6d61 736b 735f edge_bit_masks_ │ │ │ -000211a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -000211f0: 2020 3839 393c 2f73 7061 6e3e 2020 4269 899 Bi │ │ │ -00021200: 744d 6173 6b43 6f6e 7461 696e 6572 2020 tMaskContainer │ │ │ -00021210: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -00021220: 2020 2020 2020 2020 7665 7274 6578 5f62 vertex_b │ │ │ -00021230: 6974 5f6d 6173 6b73 5f3b 3c2f 6469 763e it_masks_;
│ │ │ -00021240: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00021270: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 900 BitMaskCo │ │ │ -000212a0: 6e74 6169 6e65 7220 2020 2020 2020 2020 ntainer │ │ │ -000212b0: 2020 2020 2020 2020 2020 2020 2020 2020 │ │ │ -000212c0: 2066 6163 655f 6269 745f 6d61 736b 735f face_bit_masks_ │ │ │ -000212d0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ -00021320: 2020 3930 313c 2f73 7061 6e3e 7d3b 3c2f 901};.
.
< │ │ │ -00021370: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00021380: 6e6f 223e 2020 3930 323c 2f73 7061 6e3e no"> 902 │ │ │ -00021390: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ -000213e0: 2020 3930 333c 2f73 7061 6e3e 203c 2f64 903 .
90 │ │ │ -00021440: 343c 2f73 7061 6e3e 3c73 7061 6e20 636c 4// │ │ │ -00021460: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021470: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021480: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021490: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -000214a0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3c 2f73 =============
.
905} │ │ │ -00021510: 203c 7370 616e 2063 6c61 7373 3d22 636f // namesp │ │ │ -00021530: 6163 6520 4f70 656e 4d65 7368 3c2f 7370 ace OpenMesh
.
906//========== │ │ │ -000215c0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -000215d0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -000215e0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -000215f0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021600: 3d3d 3d3c 2f73 7061 6e3e 3c2f 6469 763e ===
│ │ │ -00021610: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ -00021640: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 907 │ │ │ -00021680: 2369 6620 6465 6669 6e65 6428 4f4d 5f49 #if defined(OM_I │ │ │ -00021690: 4e43 4c55 4445 5f54 454d 504c 4154 4553 NCLUDE_TEMPLATES │ │ │ -000216a0: 2920 2661 6d70 3b26 616d 703b 2021 6465 ) && !de │ │ │ -000216b0: 6669 6e65 6428 4f50 454e 4d45 5348 5f41 fined(OPENMESH_A │ │ │ -000216c0: 5252 4159 5f4b 4552 4e45 4c5f 4329 3c2f RRAY_KERNEL_C)
.
< │ │ │ -00021710: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ -00021720: 6e6f 223e 2020 3930 383c 2f73 7061 6e3e no"> 908 │ │ │ -00021730: 3c73 7061 6e20 636c 6173 733d 2270 7265 # de │ │ │ -00021750: 6669 6e65 204f 5045 4e4d 4553 485f 4152 fine OPENMESH_AR │ │ │ -00021760: 5241 595f 4b45 524e 454c 5f54 454d 504c RAY_KERNEL_TEMPL │ │ │ -00021770: 4154 4553 3c2f 7370 616e 3e3c 2f64 6976 ATES
.
909< │ │ │ -000217d0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span># include &quo │ │ │ -00021800: 743b 4172 7261 794b 6572 6e65 6c54 5f69 t;ArrayKernelT_i │ │ │ -00021810: 6d70 6c2e 6868 2671 756f 743b 3c2f 7370 mpl.hh"
.
910#endif< │ │ │ -000218a0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ -000218c0: 6120 6964 3d22 6c30 3039 3131 2220 6e61 a id="l00911" na │ │ │ -000218d0: 6d65 3d22 6c30 3039 3131 223e 3c2f 613e me="l00911"> │ │ │ -000218e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 911//======= │ │ │ -00021920: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021930: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021940: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021950: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021960: 3d3d 3d3d 3d3d 3c2f 7370 616e 3e3c 2f64 ======.
91 │ │ │ -000219c0: 323c 2f73 7061 6e3e 3c73 7061 6e20 636c 2#endif // OPENME │ │ │ -00021a10: 5348 5f41 5252 4159 5f4b 4552 4e45 4c5f SH_ARRAY_KERNEL_ │ │ │ -00021a20: 4848 2064 6566 696e 6564 3c2f 7370 616e HH defined
.
│ │ │ -00021a80: 2020 3931 333c 2f73 7061 6e3e 3c73 7061 913//============ │ │ │ -00021ab0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021ac0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021ad0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021ae0: 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d 3d3d ================ │ │ │ -00021af0: 3d3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c =
.< │ │ │ -00021b00: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ -00021b10: 6964 3d22 6161 3031 3234 325f 6874 6d6c id="aa01242_html │ │ │ -00021b20: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">Contains all th │ │ │ -00021b80: 6520 6d65 7368 2069 6e67 7265 6469 656e e mesh ingredien │ │ │ -00021b90: 7473 206c 696b 6520 7468 6520 706f 6c79 ts like the poly │ │ │ -00021ba0: 676f 6e61 6c20 6d65 7368 2c20 7468 6520 gonal mesh, the │ │ │ -00021bb0: 7472 6961 6e67 6c65 206d 6573 682c 2064 triangle mesh, d │ │ │ -00021bc0: 6966 6665 7265 6e74 206d 6573 6820 6b65 ifferent mesh ke │ │ │ -00021bd0: 726e 656c 7320 2e2e 2e3c 2f64 6976 3e3c rnels ...
< │ │ │ -00021be0: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ -00021bf0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ -00021c00: 2f62 3e20 4d65 7368 4974 656d 732e 6868 /b> MeshItems.hh │ │ │ -00021c10: 3a35 393c 2f64 6976 3e3c 2f64 6976 3e0a :59
. │ │ │ -00021c20: 3c64 6976 2063 6c61 7373 3d22 7474 6322
M │ │ │ -00021ca0: 6573 6820 6b65 726e 656c 2075 7369 6e67 esh kernel using │ │ │ -00021cb0: 2061 7272 6179 7320 666f 7220 6d65 7368 arrays for mesh │ │ │ -00021cc0: 2069 7465 6d20 7374 6f72 6167 652e 3c2f item storage.
Defini │ │ │ -00021cf0: 7469 6f6e 3c2f 623e 2041 7272 6179 4b65 tion ArrayKe │ │ │ -00021d00: 726e 656c 2e68 683a 3838 3c2f 6469 763e rnel.hh:88
│ │ │ -00021d10: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ -00021d70: 3c61 2068 7265 663d 2261 3032 3432 322e OpenMesh │ │ │ -00021db0: 3a3a 4172 7261 794b 6572 6e65 6c3a 3a73 ::ArrayKernel::s │ │ │ -00021dc0: 7461 7475 735f 7070 683c 2f61 3e3c 2f64 tatus_pph
VertexSta │ │ │ -00021df0: 7475 7350 726f 7065 7274 7948 616e 646c tusPropertyHandl │ │ │ -00021e00: 6520 7374 6174 7573 5f70 7068 2856 6572 e status_pph(Ver │ │ │ -00021e10: 7465 7848 616e 646c 6529 2063 6f6e 7374 texHandle) const │ │ │ -00021e20: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
status │ │ │ -00021e40: 7072 6f70 6572 7479 2062 7920 6861 6e64 property by hand │ │ │ -00021e50: 6c65 3c2f 6469 763e 3c64 6976 2063 6c61 le
De │ │ │ -00021e70: 6669 6e69 7469 6f6e 3c2f 623e 2041 7272 finition Arr │ │ │ -00021e80: 6179 4b65 726e 656c 2e68 683a 3536 353c ayKernel.hh:565< │ │ │ -00021e90: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
vo │ │ │ -00021f70: 6964 2072 6573 6574 5f73 7461 7475 7328 id reset_status( │ │ │ -00021f80: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
Reinit │ │ │ -00021fa0: 6961 6c69 7a65 7320 7468 6520 7374 6174 ializes the stat │ │ │ -00021fb0: 7573 206f 6620 616c 6c20 7665 7274 6963 us of all vertic │ │ │ -00021fc0: 6573 2075 7369 6e67 2074 6865 2053 7461 es using the Sta │ │ │ -00021fd0: 7475 7349 6e66 6f20 6465 6661 756c 7420 tusInfo default │ │ │ -00021fe0: 636f 6e73 7472 7563 746f 722c 2e2e 2e3c constructor,...< │ │ │ -00021ff0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ -00022010: 6974 696f 6e3c 2f62 3e20 4172 7261 794b ition ArrayK │ │ │ -00022020: 6572 6e65 6c2e 6868 3a35 3133 3c2f 6469 ernel.hh:513
. │ │ │ -00022100: 3c64 6976 2063 6c61 7373 3d22 7474 6465
void release │ │ │ -00022120: 5f76 6572 7465 785f 7374 6174 7573 2829 _vertex_status() │ │ │ -00022130: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Status │ │ │ -00022150: 5265 6c65 6173 6520 4150 492e 3c2f 6469 Release API.
Definiti │ │ │ -00022180: 6f6e 3c2f 623e 2041 7272 6179 4b65 726e on ArrayKern │ │ │ -00022190: 656c 2e68 683a 3630 333c 2f64 6976 3e3c el.hh:603
< │ │ │ -000221a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
< │ │ │ -00022200: 6120 6872 6566 3d22 6130 3234 3232 2e68 a href="a02422.h │ │ │ -00022210: 746d 6c23 6135 3366 3436 3037 6462 3264 tml#a53f4607db2d │ │ │ -00022220: 3736 6664 3836 3037 3661 6134 3434 3965 76fd86076aa4449e │ │ │ -00022230: 3162 3337 3422 3e4f 7065 6e4d 6573 683a 1b374">OpenMesh: │ │ │ -00022240: 3a41 7272 6179 4b65 726e 656c 3a3a 6e5f :ArrayKernel::n_ │ │ │ -00022250: 7665 7274 6963 6573 3c2f 613e 3c2f 6469 vertices
size_t n_v │ │ │ -00022280: 6572 7469 6365 7328 2920 636f 6e73 7420 ertices() const │ │ │ -00022290: 6f76 6572 7269 6465 3c2f 6469 763e 3c64 override
You should not │ │ │ -000222c0: 7573 6520 7468 6973 2066 756e 6374 696f use this functio │ │ │ -000222d0: 6e20 6469 7265 6374 6c79 2e3c 2f64 6976 n directly.
Definitio │ │ │ -00022300: 6e3c 2f62 3e20 4172 7261 794b 6572 6e65 n ArrayKerne │ │ │ -00022310: 6c2e 6868 3a33 3435 3c2f 6469 763e 3c2f l.hh:345
.
│ │ │ -00022400: 766f 6964 2072 6571 7565 7374 5f76 6572 void request_ver │ │ │ -00022410: 7465 785f 7374 6174 7573 2829 3c2f 6469 tex_status()
Status Requ │ │ │ -00022440: 6573 7420 4150 492e 3c2f 6469 763e 3c64 est API.
Definition ArrayKernel.h │ │ │ -00022480: 683a 3537 383c 2f64 6976 3e3c 2f64 6976 h:578
.
s │ │ │ -00022560: 697a 655f 7420 6e5f 6564 6765 7328 2920 ize_t n_edges() │ │ │ -00022570: 636f 6e73 7420 6f76 6572 7269 6465 3c2f const override
You shoul │ │ │ -000225a0: 6420 6e6f 7420 7573 6520 7468 6973 2066 d not use this f │ │ │ -000225b0: 756e 6374 696f 6e20 6469 7265 6374 6c79 unction directly │ │ │ -000225c0: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ -000225e0: 696e 6974 696f 6e3c 2f62 3e20 4172 7261 inition Arra │ │ │ -000225f0: 794b 6572 6e65 6c2e 6868 3a33 3437 3c2f yKernel.hh:347
.
..
< │ │ │ -00022950: 6469 7620 636c 6173 733d 2274 746e 616d div class="ttnam │ │ │ -00022960: 6522 3e3c 6120 6872 6566 3d22 6130 3234 e">OpenM │ │ │ -000229a0: 6573 683a 3a41 7272 6179 4b65 726e 656c esh::ArrayKernel │ │ │ -000229b0: 3a3a 7374 6174 7573 3c2f 613e 3c2f 6469 ::status
const Stat │ │ │ -000229e0: 7573 496e 666f 2026 616d 703b 2073 7461 usInfo & sta │ │ │ -000229f0: 7475 7328 5665 7274 6578 4861 6e64 6c65 tus(VertexHandle │ │ │ -00022a00: 205f 7668 2920 636f 6e73 743c 2f64 6976 _vh) const
Status Query │ │ │ -00022a30: 2041 5049 2e3c 2f64 6976 3e3c 6469 7620 API.
Definition │ │ │ -00022a60: 4172 7261 794b 6572 6e65 6c2e 6868 3a35 ArrayKernel.hh:5 │ │ │ -00022a70: 3033 3c2f 6469 763e 3c2f 6469 763e 0a3c 03
.< │ │ │ -00022a80: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ -00022a90: 6964 3d22 6161 3032 3432 325f 6874 6d6c id="aa02422_html │ │ │ -00022aa0: 5f61 6239 6330 3164 3663 6433 3364 3761 _ab9c01d6cd33d7a │ │ │ -00022ab0: 3638 3736 3032 3737 6666 6135 3436 3536 68760277ffa54656 │ │ │ -00022ac0: 3135 223e 3c64 6976 2063 6c61 7373 3d22 15">.
Ve │ │ │ -00022cd0: 7274 6578 4861 6e64 6c65 206e 6577 5f76 rtexHandle new_v │ │ │ -00022ce0: 6572 7465 785f 6469 7274 7928 293c 2f64 ertex_dirty()
Same as ne │ │ │ -00022d10: 775f 7665 7274 6578 2829 2062 7574 2075 w_vertex() but u │ │ │ -00022d20: 7365 7320 5072 6f70 6572 7479 436f 6e74 ses PropertyCont │ │ │ -00022d30: 6169 6e65 723a 3a72 6573 697a 655f 6966 ainer::resize_if │ │ │ -00022d40: 5f73 6d61 6c6c 6572 2829 2074 6f20 7265 _smaller() to re │ │ │ -00022d50: 7369 7a65 2074 6865 2076 6572 7465 7820 size the vertex │ │ │ -00022d60: 7072 6f70 6572 7479 2063 6f2e 2e2e 3c2f property co...
Defini │ │ │ -00022d90: 7469 6f6e 3c2f 623e 2041 7272 6179 4b65 tion ArrayKe │ │ │ -00022da0: 726e 656c 2e68 683a 3233 343c 2f64 6976 rnel.hh:234
.
OpenMes │ │ │ -00022e50: 683a 3a41 7272 6179 4b65 726e 656c 3a3a h::ArrayKernel:: │ │ │ -00022e60: 6e5f 6861 6c66 6564 6765 733c 2f61 3e3c n_halfedges< │ │ │ -00022e70: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
size_t │ │ │ -00022e90: 6e5f 6861 6c66 6564 6765 7328 2920 636f n_halfedges() co │ │ │ -00022ea0: 6e73 7420 6f76 6572 7269 6465 3c2f 6469 nst override
You should │ │ │ -00022ed0: 6e6f 7420 7573 6520 7468 6973 2066 756e not use this fun │ │ │ -00022ee0: 6374 696f 6e20 6469 7265 6374 6c79 2e3c ction directly.< │ │ │ -00022ef0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ -00022f10: 6974 696f 6e3c 2f62 3e20 4172 7261 794b ition ArrayK │ │ │ -00022f20: 6572 6e65 6c2e 6868 3a33 3436 3c2f 6469 ernel.hh:346
.
... StatusSe │ │ │ -00022fd0: 7420 4150 4920 e280 943c 2f64 6976 3e3c t API ...
< │ │ │ -00022fe0: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ -00022ff0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ -00023000: 2f62 3e20 4172 7261 794b 6572 6e65 6c2e /b> ArrayKernel. │ │ │ -00023010: 6868 3a36 3338 3c2f 6469 763e 3c2f 6469 hh:638
.
void c │ │ │ -00023100: 6c65 6172 2829 3c2f 6469 763e 3c64 6976 lear()
N │ │ │ -00023120: 6f74 653a 204f 286e 2920 636f 6d70 6c65 ote: O(n) comple │ │ │ -00023130: 7869 7479 2e3c 2f64 6976 3e3c 6469 7620 xity.
Definition │ │ │ -00023160: 4172 7261 794b 6572 6e65 6c2e 6868 3a36 ArrayKernel.hh:6 │ │ │ -00023170: 3738 3c2f 6469 763e 3c2f 6469 763e 0a3c 78
.< │ │ │ -00023180: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ -00023190: 6964 3d22 6161 3032 3432 365f 6874 6d6c id="aa02426_html │ │ │ -000231a0: 5f61 3833 6438 6366 6436 3762 6263 3435 _a83d8cfd67bbc45 │ │ │ -000231b0: 6361 3064 6535 3834 6661 6135 3634 3935 ca0de584faa56495 │ │ │ -000231c0: 3131 223e 3c64 6976 2063 6c61 7373 3d22 11">
size_t size │ │ │ -00023260: 2829 2063 6f6e 7374 3c2f 6469 763e 3c64 () const
Note: 0(n) comp │ │ │ -00023290: 6c65 7869 7479 2e3c 2f64 6976 3e3c 6469 lexity.
│ │ │ -000232b0: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition ArrayKernel.hh │ │ │ -000232d0: 3a36 3636 3c2f 6469 763e 3c2f 6469 763e :666
│ │ │ -000232e0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
│ │ │ -00023370: 4175 746f 5374 6174 7573 5365 7454 3a20 AutoStatusSetT: │ │ │ -00023380: 4120 7374 6174 7573 2073 6574 2074 6861 A status set tha │ │ │ -00023390: 7420 6175 746f 6d61 7469 6361 6c6c 7920 t automatically │ │ │ -000233a0: 7069 636b 7320 6120 7374 6174 7573 2062 picks a status b │ │ │ -000233b0: 6974 2e3c 2f64 6976 3e3c 6469 7620 636c it.
D │ │ │ -000233d0: 6566 696e 6974 696f 6e3c 2f62 3e20 4172 efinition Ar │ │ │ -000233e0: 7261 794b 6572 6e65 6c2e 6868 3a36 3936 rayKernel.hh:696 │ │ │ -000233f0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
. │ │ │ -00023420: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 .void erase(ite │ │ │ -000235f0: 7261 746f 7220 5f69 7429 3c2f 6469 763e rator _it)
│ │ │ -00023600: 3c64 6976 2063 6c61 7373 3d22 7474 646f
Complexity: O │ │ │ -00023620: 2831 293c 2f64 6976 3e3c 6469 7620 636c (1)
D │ │ │ -00023640: 6566 696e 6974 696f 6e3c 2f62 3e20 4172 efinition Ar │ │ │ -00023650: 7261 794b 6572 6e65 6c2e 6868 3a37 3639 rayKernel.hh:769 │ │ │ -00023660: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
Op │ │ │ -00023700: 656e 4d65 7368 3a3a 4172 7261 794b 6572 enMesh::ArrayKer │ │ │ -00023710: 6e65 6c3a 3a45 7874 5374 6174 7573 5365 nel::ExtStatusSe │ │ │ -00023720: 7454 3a3a 6572 6173 653c 2f61 3e3c 2f64 tT::erase
void eras │ │ │ -00023750: 6528 4861 6e64 6c65 205f 686e 6429 3c2f e(Handle _hnd)
Complexit │ │ │ -00023780: 793a 204f 286b 292c 2028 6b20 2d20 6e75 y: O(k), (k - nu │ │ │ -00023790: 6d62 6572 206f 6620 7468 6520 656c 656d mber of the elem │ │ │ -000237a0: 656e 7473 2069 6e20 7468 6520 7365 7429 ents in the set) │ │ │ -000237b0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ -000237d0: 6e69 7469 6f6e 3c2f 623e 2041 7272 6179 nition Array │ │ │ -000237e0: 4b65 726e 656c 2e68 683a 3735 393c 2f64 Kernel.hh:759
.< │ │ │ -000238c0: 6469 7620 636c 6173 733d 2274 7464 6563 div class="ttdec │ │ │ -000238d0: 6922 3e75 6e73 6967 6e65 6420 696e 7420 i">unsigned int │ │ │ -000238e0: 7369 7a65 2829 2063 6f6e 7374 3c2f 6469 size() const
Complexity: │ │ │ -00023910: 2030 2831 293c 2f64 6976 3e3c 6469 7620 0(1)
Definition │ │ │ -00023940: 4172 7261 794b 6572 6e65 6c2e 6868 3a37 ArrayKernel.hh:7 │ │ │ -00023950: 3839 3c2f 6469 763e 3c2f 6469 763e 0a3c 89
.< │ │ │ -00023960: 6469 7620 636c 6173 733d 2274 7463 2220 div class="ttc" │ │ │ -00023970: 6964 3d22 6161 3032 3434 325f 6874 6d6c id="aa02442_html │ │ │ -00023980: 223e 3c64 6976 2063 6c61 7373 3d22 7474 ">
Thi │ │ │ -000239e0: 7320 636c 6173 7320 7072 6f76 6964 6573 s class provides │ │ │ -000239f0: 206c 6f77 2d6c 6576 656c 2070 726f 7065 low-level prope │ │ │ -00023a00: 7274 7920 6d61 6e61 6765 6d65 6e74 206c rty management l │ │ │ -00023a10: 696b 6520 6164 6469 6e67 2f72 656d 6f76 ike adding/remov │ │ │ -00023a20: 696e 6720 7072 6f70 6572 7469 6573 2061 ing properties a │ │ │ -00023a30: 6e64 2061 6363 6573 7320 746f 2070 726f nd access to pro │ │ │ -00023a40: 7065 2e2e 2e3c 2f64 6976 3e3c 6469 7620 pe...
Definition │ │ │ -00023a70: 4261 7365 4b65 726e 656c 2e68 683a 3938 BaseKernel.hh:98 │ │ │ -00023a80: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
Proper │ │ │ -00023b60: 7479 5426 6c74 3b20 5420 2667 743b 2026 tyT< T > & │ │ │ -00023b70: 616d 703b 2070 726f 7065 7274 7928 5650 amp; property(VP │ │ │ -00023b80: 726f 7048 616e 646c 6554 266c 743b 2054 ropHandleT< T │ │ │ -00023b90: 2026 6774 3b20 5f70 6829 3c2f 6469 763e > _ph)
│ │ │ -00023ba0: 3c64 6976 2063 6c61 7373 3d22 7474 646f
In most cases │ │ │ -00023bc0: 2079 6f75 2073 686f 756c 6420 7573 6520 you should use │ │ │ -00023bd0: 7468 6520 636f 6e76 656e 6965 6e74 2050 the convenient P │ │ │ -00023be0: 726f 7065 7274 794d 616e 6167 6572 2077 ropertyManager w │ │ │ -00023bf0: 7261 7070 6572 2061 6e64 2075 7365 206f rapper and use o │ │ │ -00023c00: 6620 7468 6973 2066 756e 6374 696f 6e20 f this function │ │ │ -00023c10: 7368 6f75 6c64 206e 2e2e 2e3c 2f64 6976 should n...
Definitio │ │ │ -00023c40: 6e3c 2f62 3e20 4261 7365 4b65 726e 656c n BaseKernel │ │ │ -00023c50: 2e68 683a 3331 303c 2f64 6976 3e3c 2f64 .hh:310
.
T │ │ │ -00023d60: 6865 2068 616e 646c 6520 6973 2076 616c he handle is val │ │ │ -00023d70: 6964 2069 6666 2074 6865 2069 6e64 6578 id iff the index │ │ │ -00023d80: 2069 7320 6e6f 7420 6e65 6761 7469 7665 is not negative │ │ │ -00023d90: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ -00023db0: 696e 6974 696f 6e3c 2f62 3e20 4861 6e64 inition Hand │ │ │ -00023dc0: 6c65 732e 6868 3a37 323c 2f64 6976 3e3c les.hh:72
< │ │ │ -00023dd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
< │ │ │ -00023e30: 6120 6872 6566 3d22 6130 3235 3538 2e68 a href="a02558.h │ │ │ -00023e40: 746d 6c23 6162 3032 3563 3030 6439 3930 tml#ab025c00d990 │ │ │ -00023e50: 6363 3639 6364 3230 6533 3365 3934 6162 cc69cd20e33e94ab │ │ │ -00023e60: 6432 6462 3922 3e4f 7065 6e4d 6573 683a d2db9">OpenMesh: │ │ │ -00023e70: 3a42 6173 6548 616e 646c 653a 3a69 6e76 :BaseHandle::inv │ │ │ -00023e80: 616c 6964 6174 653c 2f61 3e3c 2f64 6976 alidate
void invali │ │ │ -00023eb0: 6461 7465 2829 3c2f 6469 763e 3c64 6976 date()
r │ │ │ -00023ed0: 6573 6574 2068 616e 646c 6520 746f 2062 eset handle to b │ │ │ -00023ee0: 6520 696e 7661 6c69 643c 2f64 6976 3e3c e invalid
< │ │ │ -00023ef0: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ -00023f00: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ -00023f10: 2f62 3e20 4861 6e64 6c65 732e 6868 3a37 /b> Handles.hh:7 │ │ │ -00023f20: 373c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 7
.
O │ │ │ -00023fc0: 7065 6e4d 6573 683a 3a42 6173 6548 616e penMesh::BaseHan │ │ │ -00023fd0: 646c 653a 3a69 6478 3c2f 613e 3c2f 6469 dle::idx
int idx() │ │ │ -00024000: 636f 6e73 743c 2f64 6976 3e3c 6469 7620 const
Ge │ │ │ -00024020: 7420 7468 6520 756e 6465 726c 7969 6e67 t the underlying │ │ │ -00024030: 2069 6e64 6578 206f 6620 7468 6973 2068 index of this h │ │ │ -00024040: 616e 646c 652e 3c2f 6469 763e 3c64 6976 andle.
< │ │ │ -00024060: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ -00024070: 2048 616e 646c 6573 2e68 683a 3639 3c2f Handles.hh:69
.
.
Ha │ │ │ -000241f0: 6e64 6c65 2066 6f72 2061 2068 616c 6665 ndle for a halfe │ │ │ -00024200: 6467 6520 656e 7469 7479 2e3c 2f64 6976 dge entity.
Definitio │ │ │ -00024230: 6e3c 2f62 3e20 4861 6e64 6c65 732e 6868 n Handles.hh │ │ │ -00024240: 3a31 3238 3c2f 6469 763e 3c2f 6469 763e :128
│ │ │ -00024250: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
H │ │ │ -000242d0: 616e 646c 6520 666f 7220 6120 6564 6765 andle for a edge │ │ │ -000242e0: 2065 6e74 6974 792e 3c2f 6469 763e 3c64 entity.
Definition Handles.hh:13 │ │ │ -00024320: 353c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 5
..
OpenMesh │ │ │ -00024460: 3a3a 4174 7472 6962 7574 6573 3a3a 5374 ::Attributes::St │ │ │ -00024470: 6174 7573 496e 666f 3c2f 613e 3c2f 6469 atusInfo
Add status │ │ │ -000244a0: 696e 666f 726d 6174 696f 6e20 746f 2061 information to a │ │ │ -000244b0: 2062 6173 6520 636c 6173 732e 3c2f 6469 base class.
Definiti │ │ │ -000244e0: 6f6e 3c2f 623e 2053 7461 7475 732e 6868 on Status.hh │ │ │ -000244f0: 3a39 353c 2f64 6976 3e3c 2f64 6976 3e0a :95
. │ │ │ -00024500: 3c64 6976 2063 6c61 7373 3d22 7474 6322
bool │ │ │ -000245e0: 6973 5f62 6974 5f73 6574 2875 6e73 6967 is_bit_set(unsig │ │ │ -000245f0: 6e65 6420 696e 7420 5f73 2920 636f 6e73 ned int _s) cons │ │ │ -00024600: 743c 2f64 6976 3e3c 6469 7620 636c 6173 t
is a c │ │ │ -00024620: 6572 7461 696e 2062 6974 2073 6574 203f ertain bit set ? │ │ │ -00024630: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Defi │ │ │ -00024650: 6e69 7469 6f6e 3c2f 623e 2053 7461 7475 nition Statu │ │ │ -00024660: 732e 6868 3a31 3537 3c2f 6469 763e 3c2f s.hh:157
.
unset │ │ │ -000248f0: 2061 2063 6572 7461 696e 2062 6974 3c2f a certain bit
Defini │ │ │ -00024920: 7469 6f6e 3c2f 623e 2053 7461 7475 732e tion Status. │ │ │ -00024930: 6868 3a31 3631 3c2f 6469 763e 3c2f 6469 hh:161
.
│ │ │ -000249c0: 4465 6661 756c 7420 7072 6f70 6572 7479 Default property │ │ │ -000249d0: 2063 6c61 7373 2066 6f72 2061 6e79 2074 class for any t │ │ │ -000249e0: 7970 6520 542e 3c2f 6469 763e 3c64 6976 ype T.
< │ │ │ -00024a00: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ -00024a10: 2050 726f 7065 7274 792e 6868 3a39 333c Property.hh:93< │ │ │ -00024a20: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
.
vecto │ │ │ -00024b00: 725f 7479 7065 2026 616d 703b 2064 6174 r_type & dat │ │ │ -00024b10: 615f 7665 6374 6f72 2829 3c2f 6469 763e a_vector()
│ │ │ -00024b20: 3c64 6976 2063 6c61 7373 3d22 7474 646f
Get reference │ │ │ -00024b40: 2074 6f20 7072 6f70 6572 7479 2076 6563 to property vec │ │ │ -00024b50: 746f 7220 2862 6520 6361 7265 6675 6c2c tor (be careful, │ │ │ -00024b60: 2069 6d70 726f 7065 7220 7573 6167 652c improper usage, │ │ │ -00024b70: 2065 2e67 2e20 7265 7369 7a69 6e67 2c20 e.g. resizing, │ │ │ -00024b80: 6d61 7920 6372 6173 6820 4f70 656e 4d65 may crash OpenMe │ │ │ -00024b90: 7368 212e 2e2e 3c2f 6469 763e 3c64 6976 sh!...
< │ │ │ -00024bb0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition │ │ │ -00024bc0: 2050 726f 7065 7274 792e 6868 3a31 3835 Property.hh:185 │ │ │ -00024bd0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
. │ │ │ -00024c00: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
Han │ │ │ -00024c60: 646c 6520 7265 7072 6573 656e 7469 6e67 dle representing │ │ │ -00024c70: 2061 2076 6572 7465 7820 7072 6f70 6572 a vertex proper │ │ │ -00024c80: 7479 2e3c 2f64 6976 3e3c 6469 7620 636c ty.
D │ │ │ -00024ca0: 6566 696e 6974 696f 6e3c 2f62 3e20 5072 efinition Pr │ │ │ -00024cb0: 6f70 6572 7479 2e68 683a 3431 373c 2f64 operty.hh:417
.
Handle │ │ │ -00024d50: 2072 6570 7265 7365 6e74 696e 6720 6120 representing a │ │ │ -00024d60: 6861 6c66 6564 6765 2070 726f 7065 7274 halfedge propert │ │ │ -00024d70: 792e 3c2f 6469 763e 3c64 6976 2063 6c61 y.
De │ │ │ -00024d90: 6669 6e69 7469 6f6e 3c2f 623e 2050 726f finition Pro │ │ │ -00024da0: 7065 7274 792e 6868 3a34 3332 3c2f 6469 perty.hh:432
.
│ │ │ -00024df0: 3c61 2068 7265 663d 2261 3032 3935 342e OpenMesh:: │ │ │ -00024e10: 4550 726f 7048 616e 646c 6554 3c2f 613e EPropHandleT │ │ │ -00024e20: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
Handle │ │ │ -00024e40: 7265 7072 6573 656e 7469 6e67 2061 6e20 representing an │ │ │ -00024e50: 6564 6765 2070 726f 7065 7274 792e 3c2f edge property.
Defini │ │ │ -00024e80: 7469 6f6e 3c2f 623e 2050 726f 7065 7274 tion Propert │ │ │ -00024e90: 792e 6868 3a34 3437 3c2f 6469 763e 3c2f y.hh:447
.
OpenMesh::FPro │ │ │ -00024f00: 7048 616e 646c 6554 3c2f 613e 3c2f 6469 pHandleT
Handle repr │ │ │ -00024f30: 6573 656e 7469 6e67 2061 2066 6163 6520 esenting a face │ │ │ -00024f40: 7072 6f70 6572 7479 2e3c 2f64 6976 3e3c property.
< │ │ │ -00024f50: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ -00024f60: 223e 3c62 3e44 6566 696e 6974 696f 6e3c ">Definition< │ │ │ -00024f70: 2f62 3e20 5072 6f70 6572 7479 2e68 683a /b> Property.hh: │ │ │ -00024f80: 3436 323c 2f64 6976 3e3c 2f64 6976 3e0a 462
. │ │ │ -00024f90: 3c2f 6469 763e 3c21 2d2d 2066 7261 676d
.< │ │ │ -00024fc0: 2f64 6976 3e3c 212d 2d20 646f 632d 636f /div>.
.< │ │ │ -00024fe0: 6164 6472 6573 733e 0a3c 736d 616c 6c3e address>. │ │ │ -00024ff0: 0a3c 6120 6872 6566 3d22 6874 7470 3a2f ...Proje │ │ │ -00025040: 6374 203c 623e 4f70 656e 4d65 7368 3c2f ct OpenMesh, .©  │ │ │ -00025060: 3b20 5669 7375 616c 2043 6f6d 7075 7469 ; Visual Computi │ │ │ -00025070: 6e67 2049 6e73 7469 7475 7465 2c20 5257 ng Institute, RW │ │ │ -00025080: 5448 2041 6163 6865 6e2e 0a44 6f63 756d TH Aachen..Docum │ │ │ -00025090: 656e 7461 7469 6f6e 2067 656e 6572 6174 entation generat │ │ │ -000250a0: 6564 2075 7369 6e67 200a 3c61 2063 6c61 ed using ..doxygen │ │ │ -000250f0: 0a3c 2f61 3e2e 0a3c 2f73 6d61 6c6c 3e0a .... │ │ │ -00025100: 3c2f 6164 6472 6573 733e 0a3c 2f62 6f64
... │ │ │ +000001c0: 6e4d 6573 682f 436f 7265 2f55 7469 6c73 nMesh/Core/Utils │ │ │ +000001d0: 2f74 7970 656e 616d 652e 6868 2053 6f75 /typename.hh Sou │ │ │ +000001e0: 7263 6520 4669 6c65 3c2f 7469 746c 653e rce File │ │ │ +000001f0: 0a3c 6c69 6e6b 2068 7265 663d 2274 6162 ... │ │ │ +000002a0: 0a3c 6c69 6e6b 2068 7265 663d 226e 6176 ..... │ │ │ +000003d0: 3c73 6372 6970 7420 7479 7065 3d22 7465 . │ │ │ +00000750: 3c73 6372 6970 7420 7479 7065 3d22 7465 ...
...
.. │ │ │ +00000d00: 3c21 2d2d 2069 6672 616d 6520 7368 6f77 .< │ │ │ +00000d40: 6469 7620 6964 3d22 4d53 6561 7263 6852 div id="MSearchR │ │ │ +00000d50: 6573 756c 7473 5769 6e64 6f77 223e 0a3c esultsWindow">.< │ │ │ +00000d60: 6469 7620 6964 3d22 4d53 6561 7263 6852 div id="MSearchR │ │ │ +00000d70: 6573 756c 7473 223e 0a3c 6469 7620 636c esults">.
. │ │ │ +00000da0: 0a3c 6469 7620 6964 3d22 5352 5265 7375 .
.
L │ │ │ +00000de0: 6f61 6469 6e67 2e2e 2e3c 2f64 6976 3e0a oading...
. │ │ │ +00000df0: 3c64 6976 2063 6c61 7373 3d22 5352 5374 .
No │ │ │ +00000e50: 4d61 7463 6865 733c 2f64 6976 3e0a 3c2f Matches
..
....
. │ │ │ +00000e90: 2020 3c64 6976 2063 6c61 7373 3d22 6865
ty │ │ │ +00000ec0: 7065 6e61 6d65 2e68 683c 2f64 6976 3e3c pename.hh
< │ │ │ +00000ed0: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>.
.
│ │ │ +00000f00: 0a3c 6469 7620 636c 6173 733d 2266 7261 .
│ │ │ +00000f60: 2020 2031 3c2f 7370 616e 3e3c 7370 616e 1#pragma on │ │ │ +00000f90: 6365 3c2f 7370 616e 3e3c 2f64 6976 3e0a ce
. │ │ │ +00000fa0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ +00001030: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ +00001040: 6e6f 223e 2020 2020 373c 2f73 7061 6e3e no"> 7 │ │ │ +00001050: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ +000010a0: 2020 2020 383c 2f73 7061 6e3e 3c73 7061 8#include │ │ │ +000010d0: 266c 743b 7374 7269 6e67 2667 743b 3c2f <string>
.
< │ │ │ +00001120: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ +00001130: 6e6f 223e 2020 2020 393c 2f73 7061 6e3e no"> 9 │ │ │ +00001140: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ +00001160: 7564 6520 266c 743b 7479 7065 696e 666f ude <typeinfo │ │ │ +00001170: 2667 743b 3c2f 7370 616e 3e3c 2f64 6976 >
.
10< │ │ │ +000011d0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#include <ve │ │ │ +00001200: 6374 6f72 2667 743b 3c2f 7370 616e 3e3c ctor>< │ │ │ +00001210: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ +00001260: 2031 313c 2f73 7061 6e3e 3c73 7061 6e20 11#include &l │ │ │ +00001290: 743b 4f70 656e 4d65 7368 2f43 6f72 652f t;OpenMesh/Core/ │ │ │ +000012a0: 4d65 7368 2f48 616e 646c 6573 2e68 6826 Mesh/Handles.hh& │ │ │ +000012b0: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
│ │ │ +000012c0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ +000012f0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 12 │ │ │ +00001330: 2369 6e63 6c75 6465 2026 6c74 3b4f 7065 #include <Ope │ │ │ +00001340: 6e4d 6573 682f 436f 7265 2f47 656f 6d65 nMesh/Core/Geome │ │ │ +00001350: 7472 792f 5665 6374 6f72 542e 6868 2667 try/VectorT.hh&g │ │ │ +00001360: 743b 3c2f 7370 616e 3e3c 2f64 6976 3e0a t;
. │ │ │ +00001370: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ +00001400: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ +00001410: 6e6f 223e 2020 2031 343c 2f73 7061 6e3e no"> 14 │ │ │ +00001420: 3c73 7061 6e20 636c 6173 733d 226b 6579 namespace │ │ │ +00001440: 3c2f 7370 616e 3e3c 6120 636c 6173 733d OpenMesh< │ │ │ +00001480: 2f61 3e20 7b3c 2f64 6976 3e0a 3c64 6976 /a> {
.
< │ │ │ +000014c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ +000014d0: 6e6f 223e 2020 2031 353c 2f73 7061 6e3e no"> 15 │ │ │ +000014e0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ +00001530: 2020 2031 363c 2f73 7061 6e3e 3c73 7061 16template <type │ │ │ +00001580: 6e61 6d65 3c2f 7370 616e 3e20 5426 6774 name T> │ │ │ +00001590: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ +000015e0: 2020 2031 373c 2f73 7061 6e3e 7374 643a 17std: │ │ │ +000015f0: 3a73 7472 696e 6720 6765 745f 7479 7065 :string get_type │ │ │ +00001600: 5f6e 616d 6528 293c 2f64 6976 3e0a 3c64 _name()
. │ │ │ +00001620: 3c61 2069 643d 226c 3030 3031 3822 206e 18{
.
19#ifdef │ │ │ +000016e0: 5f4d 5343 5f56 4552 3c2f 7370 616e 3e3c _MSC_VER< │ │ │ +000016f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ +00001740: 2032 303c 2f73 7061 6e3e 2020 2020 3c73 20 // MSVC' │ │ │ +00001770: 5320 7479 7065 5f6e 616d 6520 7265 7475 S type_name retu │ │ │ +00001780: 726e 7320 6f6e 6c79 2061 2066 7269 656e rns only a frien │ │ │ +00001790: 646c 7920 6e61 6d65 2077 6974 6820 6e61 dly name with na │ │ │ +000017a0: 6d65 2829 206d 6574 686f 642c 3c2f 7370 me() method,
.
21 │ │ │ +00001810: 2020 3c73 7061 6e20 636c 6173 733d 2263 // to ge │ │ │ +00001830: 7420 6120 756e 6971 7565 206e 616d 6520 t a unique name │ │ │ +00001840: 7573 6520 7261 775f 6e61 6d65 2829 206d use raw_name() m │ │ │ +00001850: 6574 686f 6420 696e 7374 6561 643c 2f73 ethod instead
.
22 │ │ │ +000018c0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret │ │ │ +000018e0: 7572 6e3c 2f73 7061 6e3e 203c 7370 616e urn typeid(T │ │ │ +00001910: 292e 7261 775f 6e61 6d65 2829 3b3c 2f64 ).raw_name();.
2 │ │ │ +00001970: 333c 2f73 7061 6e3e 3c73 7061 6e20 636c 3#else< │ │ │ +000019a0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ +000019f0: 2032 343c 2f73 7061 6e3e 2020 2020 3c73 24 // GCC and c │ │ │ +00001a20: 6c61 6e67 2063 7572 656e 746c 7920 7265 lang curently re │ │ │ +00001a30: 7475 726e 206d 616e 676c 6564 206e 616d turn mangled nam │ │ │ +00001a40: 6520 6173 206e 616d 6528 292c 2074 6865 e as name(), the │ │ │ +00001a50: 7265 2069 7320 6e6f 2072 6177 5f6e 616d re is no raw_nam │ │ │ +00001a60: 6528 2920 6d65 7468 6f64 3c2f 7370 616e e() method
.
│ │ │ +00001ac0: 2020 2032 353c 2f73 7061 6e3e 2020 2020 25 │ │ │ +00001ad0: 3c73 7061 6e20 636c 6173 733d 226b 6579 return │ │ │ +00001af0: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c ty │ │ │ +00001b10: 7065 6964 3c2f 7370 616e 3e28 5429 2e6e peid(T).n │ │ │ +00001b20: 616d 6528 293b 3c2f 6469 763e 0a3c 6469 ame();
.< │ │ │ +00001b40: 6120 6964 3d22 6c30 3030 3236 2220 6e61 a id="l00026" na │ │ │ +00001b50: 6d65 3d22 6c30 3030 3236 223e 3c2f 613e me="l00026"> │ │ │ +00001b60: 3c73 7061 6e20 636c 6173 733d 226c 696e 26#end │ │ │ +00001ba0: 6966 3c2f 7370 616e 3e3c 2f64 6976 3e0a if
. │ │ │ +00001bb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
< │ │ │ +00001c40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ +00001c50: 6e6f 223e 2020 2032 383c 2f73 7061 6e3e no"> 28 │ │ │ +00001c60: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ +00001cb0: 2020 2032 393c 2f73 7061 6e3e 7d3c 7370 29}//namespace O │ │ │ +00001ce0: 7065 6e4d 6573 683c 2f73 7061 6e3e 3c2f penMesh.
OpenMesh
Contains │ │ │ +00001d70: 616c 6c20 7468 6520 6d65 7368 2069 6e67 all the mesh ing │ │ │ +00001d80: 7265 6469 656e 7473 206c 696b 6520 7468 redients like th │ │ │ +00001d90: 6520 706f 6c79 676f 6e61 6c20 6d65 7368 e polygonal mesh │ │ │ +00001da0: 2c20 7468 6520 7472 6961 6e67 6c65 206d , the triangle m │ │ │ +00001db0: 6573 682c 2064 6966 6665 7265 6e74 206d esh, different m │ │ │ +00001dc0: 6573 6820 6b65 726e 656c 7320 2e2e 2e3c esh kernels ...< │ │ │ +00001dd0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ +00001df0: 6974 696f 6e3c 2f62 3e20 4d65 7368 4974 ition MeshIt │ │ │ +00001e00: 656d 732e 6868 3a35 393c 2f64 6976 3e3c ems.hh:59
< │ │ │ +00001e10: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>.
.
. │ │ │ +00001e60: 3c68 723e 0a3c 6164 6472 6573 733e 0a3c
.
.< │ │ │ +00001e70: 736d 616c 6c3e 0a3c 6120 6872 6566 3d22 small>.. │ │ │ +00001ec0: 0a50 726f 6a65 6374 203c 623e 4f70 656e .Project Open │ │ │ +00001ed0: 4d65 7368 3c2f 623e 2c20 0a26 636f 7079 Mesh, .© │ │ │ +00001ee0: 3b26 6e62 7370 3b20 5669 7375 616c 2043 ;  Visual C │ │ │ +00001ef0: 6f6d 7075 7469 6e67 2049 6e73 7469 7475 omputing Institu │ │ │ +00001f00: 7465 2c20 5257 5448 2041 6163 6865 6e2e te, RWTH Aachen. │ │ │ +00001f10: 0a44 6f63 756d 656e 7461 7469 6f6e 2067 .Documentation g │ │ │ +00001f20: 656e 6572 6174 6564 2075 7369 6e67 200a enerated using . │ │ │ +00001f30: 3c61 2063 6c61 7373 3d22 656c 2220 6872 .doxyg │ │ │ +00001f70: 656e 3c2f 623e 0a3c 2f61 3e2e 0a3c 2f73 en....
│ │ │ +00001f90: 0a3c 2f62 6f64 793e 0a3c 2f68 746d 6c3e .. │ │ │ +00001fa0: 0a . │ │ │ ├── html2text {} │ │ │ │ @@ -1,980 +1,38 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -ArrayKernel.hh │ │ │ │ -1/* ========================================================================= * │ │ │ │ -2 * * │ │ │ │ -3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ -5 * Department of Computer Graphics and Multimedia * │ │ │ │ -6 * All rights reserved. * │ │ │ │ -7 * www.openmesh.org * │ │ │ │ -8 * * │ │ │ │ -9 *---------------------------------------------------------------------------* │ │ │ │ -10 * This file is part of OpenMesh. * │ │ │ │ -11 *--------------------------------------------------------------------------- │ │ │ │ -* │ │ │ │ -12 * * │ │ │ │ -13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ -14 * modification, are permitted provided that the following conditions * │ │ │ │ -15 * are met: * │ │ │ │ -16 * * │ │ │ │ -17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ -* │ │ │ │ -18 * this list of conditions and the following disclaimer. * │ │ │ │ -19 * * │ │ │ │ -20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ -21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ -22 * documentation and/or other materials provided with the distribution. * │ │ │ │ -23 * * │ │ │ │ -24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ -25 * contributors may be used to endorse or promote products derived from * │ │ │ │ -26 * this software without specific prior written permission. * │ │ │ │ -27 * * │ │ │ │ -28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ -29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ -* │ │ │ │ -30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ -31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ -* │ │ │ │ -32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ -33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ -34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ -35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ -36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ -37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ -38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ -39 * * │ │ │ │ -40 * ========================================================================= │ │ │ │ -*/ │ │ │ │ -41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS ArrayKernel │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef OPENMESH_ARRAY_KERNEL_HH │ │ │ │ -53#define OPENMESH_ARRAY_KERNEL_HH │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -57#include │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61 │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65 │ │ │ │ -66//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -67namespace _O_p_e_n_M_e_s_h { │ │ │ │ -68 │ │ │ │ -69 │ │ │ │ -70//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -_8_7class OPENMESHDLLEXPORT _A_r_r_a_y_K_e_r_n_e_l : public _B_a_s_e_K_e_r_n_e_l, public ArrayItems │ │ │ │ -88{ │ │ │ │ -89public: │ │ │ │ -90 │ │ │ │ -91 // handles │ │ │ │ -92 typedef _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e _V_e_r_t_e_x_H_a_n_d_l_e; │ │ │ │ -93 typedef _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e _H_a_l_f_e_d_g_e_H_a_n_d_l_e; │ │ │ │ -94 typedef _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e _E_d_g_e_H_a_n_d_l_e; │ │ │ │ -95 typedef _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e _F_a_c_e_H_a_n_d_l_e; │ │ │ │ -96 typedef _A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o _S_t_a_t_u_s_I_n_f_o; │ │ │ │ -97 typedef _V_P_r_o_p_H_a_n_d_l_e_T_<_S_t_a_t_u_s_I_n_f_o_> _V_e_r_t_e_x_S_t_a_t_u_s_P_r_o_p_e_r_t_y_H_a_n_d_l_e; │ │ │ │ -98 typedef _H_P_r_o_p_H_a_n_d_l_e_T_<_S_t_a_t_u_s_I_n_f_o_> _H_a_l_f_e_d_g_e_S_t_a_t_u_s_P_r_o_p_e_r_t_y_H_a_n_d_l_e; │ │ │ │ -99 typedef _E_P_r_o_p_H_a_n_d_l_e_T_<_S_t_a_t_u_s_I_n_f_o_> _E_d_g_e_S_t_a_t_u_s_P_r_o_p_e_r_t_y_H_a_n_d_l_e; │ │ │ │ -100 typedef _F_P_r_o_p_H_a_n_d_l_e_T_<_S_t_a_t_u_s_I_n_f_o_> _F_a_c_e_S_t_a_t_u_s_P_r_o_p_e_r_t_y_H_a_n_d_l_e; │ │ │ │ -101 │ │ │ │ -102public: │ │ │ │ -103 │ │ │ │ -104 // --- constructor/destructor --- │ │ │ │ -105 _A_r_r_a_y_K_e_r_n_e_l(); │ │ │ │ -106 virtual _~_A_r_r_a_y_K_e_r_n_e_l(); │ │ │ │ -107 │ │ │ │ -114 void assign_connectivity(const _A_r_r_a_y_K_e_r_n_e_l& _other); │ │ │ │ -115 │ │ │ │ -116 // --- handle -> item --- │ │ │ │ -117 _V_e_r_t_e_x_H_a_n_d_l_e handle(const Vertex& _v) const; │ │ │ │ -118 │ │ │ │ -119 _H_a_l_f_e_d_g_e_H_a_n_d_l_e handle(const Halfedge& _he) const; │ │ │ │ -120 │ │ │ │ -121 _E_d_g_e_H_a_n_d_l_e handle(const Edge& _e) const; │ │ │ │ -122 │ │ │ │ -123 _F_a_c_e_H_a_n_d_l_e handle(const Face& _f) const; │ │ │ │ -124 │ │ │ │ -125 │ │ │ │ -127 bool is_valid_handle(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const; │ │ │ │ -128 │ │ │ │ -130 bool is_valid_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -131 │ │ │ │ -133 bool is_valid_handle(_E_d_g_e_H_a_n_d_l_e _eh) const; │ │ │ │ -134 │ │ │ │ -136 bool is_valid_handle(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -137 │ │ │ │ -138 │ │ │ │ -139 // --- item -> handle --- │ │ │ │ -140 const Vertex& vertex(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -141 { │ │ │ │ -142 assert(is_valid_handle(_vh)); │ │ │ │ -143 return vertices_[_vh._i_d_x()]; │ │ │ │ -144 } │ │ │ │ -145 │ │ │ │ -146 Vertex& vertex(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -147 { │ │ │ │ -148 assert(is_valid_handle(_vh)); │ │ │ │ -149 return vertices_[_vh._i_d_x()]; │ │ │ │ -150 } │ │ │ │ -151 │ │ │ │ -152 const Halfedge& halfedge(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -153 { │ │ │ │ -154 assert(is_valid_handle(_heh)); │ │ │ │ -155 return edges_[_heh._i_d_x() >> 1].halfedges_[_heh._i_d_x() & 1]; │ │ │ │ -156 } │ │ │ │ -157 │ │ │ │ -158 Halfedge& halfedge(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -159 { │ │ │ │ -160 assert(is_valid_handle(_heh)); │ │ │ │ -161 return edges_[_heh._i_d_x() >> 1].halfedges_[_heh._i_d_x() & 1]; │ │ │ │ -162 } │ │ │ │ -163 │ │ │ │ -164 const Edge& edge(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -165 { │ │ │ │ -166 assert(is_valid_handle(_eh)); │ │ │ │ -167 return edges_[_eh._i_d_x()]; │ │ │ │ -168 } │ │ │ │ -169 │ │ │ │ -170 Edge& edge(_E_d_g_e_H_a_n_d_l_e _eh) │ │ │ │ -171 { │ │ │ │ -172 assert(is_valid_handle(_eh)); │ │ │ │ -173 return edges_[_eh._i_d_x()]; │ │ │ │ -174 } │ │ │ │ -175 │ │ │ │ -176 const Face& face(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ -177 { │ │ │ │ -178 assert(is_valid_handle(_fh)); │ │ │ │ -179 return faces_[_fh._i_d_x()]; │ │ │ │ -180 } │ │ │ │ -181 │ │ │ │ -182 Face& face(_F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ -183 { │ │ │ │ -184 assert(is_valid_handle(_fh)); │ │ │ │ -185 return faces_[_fh._i_d_x()]; │ │ │ │ -186 } │ │ │ │ -187 │ │ │ │ -188 // --- get i'th items --- │ │ │ │ -189 │ │ │ │ -190 _V_e_r_t_e_x_H_a_n_d_l_e vertex_handle(unsigned int _i) const │ │ │ │ -191 { return (_i < n_vertices()) ? handle( vertices_[_i] ) : _V_e_r_t_e_x_H_a_n_d_l_e(); } │ │ │ │ -192 │ │ │ │ -_1_9_3 _H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(unsigned int _i) const │ │ │ │ -194 { │ │ │ │ -195 return (_i < n_halfedges()) ? │ │ │ │ -196 halfedge_handle(edge_handle(_i/2), _i%2) : _H_a_l_f_e_d_g_e_H_a_n_d_l_e(); │ │ │ │ -197 } │ │ │ │ -198 │ │ │ │ -_1_9_9 _E_d_g_e_H_a_n_d_l_e edge_handle(unsigned int _i) const │ │ │ │ -200 { return (_i < n_edges()) ? handle(edges_[_i]) : _E_d_g_e_H_a_n_d_l_e(); } │ │ │ │ -201 │ │ │ │ -_2_0_2 _F_a_c_e_H_a_n_d_l_e face_handle(unsigned int _i) const │ │ │ │ -203 { return (_i < n_faces()) ? handle(faces_[_i]) : _F_a_c_e_H_a_n_d_l_e(); } │ │ │ │ -204 │ │ │ │ -205public: │ │ │ │ -206 │ │ │ │ -_2_1_6 inline _V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x() │ │ │ │ -217 { │ │ │ │ -218 vertices_.push_back(Vertex()); │ │ │ │ -219 vprops_resize(n_vertices());//TODO:should it be push_back()? │ │ │ │ -220 │ │ │ │ -221 return handle(vertices_.back()); │ │ │ │ -222 } │ │ │ │ -223 │ │ │ │ -_2_3_4 inline _V_e_r_t_e_x_H_a_n_d_l_e _n_e_w___v_e_r_t_e_x___d_i_r_t_y() │ │ │ │ -235 { │ │ │ │ -236 vertices_.push_back(Vertex()); │ │ │ │ -237 vprops_resize_if_smaller(n_vertices());//TODO:should it be push_back()? │ │ │ │ -238 │ │ │ │ -239 return handle(vertices_.back()); │ │ │ │ -240 } │ │ │ │ -241 │ │ │ │ -242 inline _H_a_l_f_e_d_g_e_H_a_n_d_l_e new_edge(_V_e_r_t_e_x_H_a_n_d_l_e _start_vh, _V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -_end_vh) │ │ │ │ -243 { │ │ │ │ -244// assert(_start_vh != _end_vh); │ │ │ │ -245 edges_.push_back(Edge()); │ │ │ │ -246 eprops_resize(n_edges());//TODO:should it be push_back()? │ │ │ │ -247 hprops_resize(n_halfedges());//TODO:should it be push_back()? │ │ │ │ -248 │ │ │ │ -249 _E_d_g_e_H_a_n_d_l_e eh(handle(edges_.back())); │ │ │ │ -250 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh0(halfedge_handle(eh, 0)); │ │ │ │ -251 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh1(halfedge_handle(eh, 1)); │ │ │ │ -252 set_vertex_handle(heh0, _end_vh); │ │ │ │ -253 set_vertex_handle(heh1, _start_vh); │ │ │ │ -254 return heh0; │ │ │ │ -255 } │ │ │ │ -256 │ │ │ │ -257 inline FaceHandle new_face() │ │ │ │ -258 { │ │ │ │ -259 faces_.push_back(Face()); │ │ │ │ -260 fprops_resize(n_faces()); │ │ │ │ -261 return handle(faces_.back()); │ │ │ │ -262 } │ │ │ │ -263 │ │ │ │ -264 inline FaceHandle new_face(const Face& _f) │ │ │ │ -265 { │ │ │ │ -266 faces_.push_back(_f); │ │ │ │ -267 fprops_resize(n_faces()); │ │ │ │ -268 return handle(faces_.back()); │ │ │ │ -269 } │ │ │ │ -270 │ │ │ │ -271public: │ │ │ │ -272 // --- resize/reserve --- │ │ │ │ -273 void resize( size_t _n_vertices, size_t _n_edges, size_t _n_faces ); │ │ │ │ -274 void reserve(size_t _n_vertices, size_t _n_edges, size_t _n_faces ); │ │ │ │ -275 │ │ │ │ -276 // --- deletion --- │ │ │ │ -292 void garbage_collection(bool _v=true, bool _e=true, bool _f=true); │ │ │ │ -293 │ │ │ │ -313 template │ │ │ │ -316 void garbage_collection(std_API_Container_VHandlePointer& vh_to_update, │ │ │ │ -317 std_API_Container_HHandlePointer& hh_to_update, │ │ │ │ -318 std_API_Container_FHandlePointer& fh_to_update, │ │ │ │ -319 bool _v=true, bool _e=true, bool _f=true); │ │ │ │ -320 │ │ │ │ -322 void clear(); │ │ │ │ -323 │ │ │ │ -333 void clean(); │ │ │ │ -334 │ │ │ │ -342 void clean_keep_reservation(); │ │ │ │ -343 │ │ │ │ -344 // --- number of items --- │ │ │ │ -_3_4_5 size_t _n___v_e_r_t_i_c_e_s() const override { return vertices_.size(); } │ │ │ │ -_3_4_6 size_t _n___h_a_l_f_e_d_g_e_s() const override { return 2*edges_.size(); } │ │ │ │ -_3_4_7 size_t _n___e_d_g_e_s() const override { return edges_.size(); } │ │ │ │ -_3_4_8 size_t _n___f_a_c_e_s() const override { return faces_.size(); } │ │ │ │ -349 │ │ │ │ -350 bool vertices_empty() const { return vertices_.empty(); } │ │ │ │ -351 bool halfedges_empty() const { return edges_.empty(); } │ │ │ │ -352 bool edges_empty() const { return edges_.empty(); } │ │ │ │ -353 bool faces_empty() const { return faces_.empty(); } │ │ │ │ -354 │ │ │ │ -355 // --- vertex connectivity --- │ │ │ │ -356 │ │ │ │ -_3_5_7 _H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -358 { return vertex(_vh).halfedge_handle_; } │ │ │ │ -359 │ │ │ │ -360 void set_halfedge_handle(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -361 { │ │ │ │ -362// assert(is_valid_handle(_heh)); │ │ │ │ -363 vertex(_vh).halfedge_handle_ = _heh; │ │ │ │ -364 } │ │ │ │ -365 │ │ │ │ -366 bool is_isolated(VertexHandle _vh) const │ │ │ │ -367 { return !halfedge_handle(_vh)._i_s___v_a_l_i_d(); } │ │ │ │ -368 │ │ │ │ -369 void set_isolated(VertexHandle _vh) │ │ │ │ -370 { vertex(_vh).halfedge_handle_.invalidate(); } │ │ │ │ -371 │ │ │ │ -372 unsigned int delete_isolated_vertices(); │ │ │ │ -373 │ │ │ │ -374 // --- halfedge connectivity --- │ │ │ │ -375 VertexHandle to_vertex_handle(HalfedgeHandle _heh) const │ │ │ │ -376 { return halfedge(_heh).vertex_handle_; } │ │ │ │ -377 │ │ │ │ -378 VertexHandle from_vertex_handle(HalfedgeHandle _heh) const │ │ │ │ -379 { return to_vertex_handle(opposite_halfedge_handle(_heh)); } │ │ │ │ -380 │ │ │ │ -381 void set_vertex_handle(HalfedgeHandle _heh, VertexHandle _vh) │ │ │ │ -382 { │ │ │ │ -383// assert(is_valid_handle(_vh)); │ │ │ │ -384 halfedge(_heh).vertex_handle_ = _vh; │ │ │ │ -385 } │ │ │ │ -386 │ │ │ │ -_3_8_7 _F_a_c_e_H_a_n_d_l_e face_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -388 { return halfedge(_heh).face_handle_; } │ │ │ │ -389 │ │ │ │ -390 void set_face_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _F_a_c_e_H_a_n_d_l_e _fh) │ │ │ │ -391 { │ │ │ │ -392// assert(is_valid_handle(_fh)); │ │ │ │ -393 halfedge(_heh).face_handle_ = _fh; │ │ │ │ -394 } │ │ │ │ -395 │ │ │ │ -396 void set_boundary(HalfedgeHandle _heh) │ │ │ │ -397 { halfedge(_heh).face_handle_._i_n_v_a_l_i_d_a_t_e(); } │ │ │ │ -398 │ │ │ │ -_4_0_0 bool _i_s___b_o_u_n_d_a_r_y(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -401 { return !face_handle(_heh).is_valid(); } │ │ │ │ -402 │ │ │ │ -_4_0_3 _H_a_l_f_e_d_g_e_H_a_n_d_l_e next_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -404 { return halfedge(_heh).next_halfedge_handle_; } │ │ │ │ -405 │ │ │ │ -406 void set_next_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _nheh) │ │ │ │ -407 { │ │ │ │ -408 assert(is_valid_handle(_nheh)); │ │ │ │ -409// assert(to_vertex_handle(_heh) == from_vertex_handle(_nheh)); │ │ │ │ -410 halfedge(_heh).next_halfedge_handle_ = _nheh; │ │ │ │ -411 set_prev_halfedge_handle(_nheh, _heh); │ │ │ │ -412 } │ │ │ │ -413 │ │ │ │ -414 │ │ │ │ -415 void set_prev_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _pheh) │ │ │ │ -416 { │ │ │ │ -417 assert(is_valid_handle(_pheh)); │ │ │ │ -418 set_prev_halfedge_handle(_heh, _pheh, HasPrevHalfedge()); │ │ │ │ -419 } │ │ │ │ -420 │ │ │ │ -421 void set_prev_halfedge_handle(HalfedgeHandle _heh, HalfedgeHandle _pheh, │ │ │ │ -422 GenProg::TrueType) │ │ │ │ -423 { halfedge(_heh).prev_halfedge_handle_ = _pheh; } │ │ │ │ -424 │ │ │ │ -425 void set_prev_halfedge_handle(HalfedgeHandle /* _heh */, HalfedgeHandle / │ │ │ │ -* _pheh */, │ │ │ │ -426 GenProg::FalseType) │ │ │ │ -427 {} │ │ │ │ -428 │ │ │ │ -_4_2_9 _H_a_l_f_e_d_g_e_H_a_n_d_l_e prev_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -430 { return prev_halfedge_handle(_heh, HasPrevHalfedge() ); } │ │ │ │ -431 │ │ │ │ -_4_3_2 _H_a_l_f_e_d_g_e_H_a_n_d_l_e prev_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, GenProg::TrueType) │ │ │ │ -const │ │ │ │ -433 { return halfedge(_heh).prev_halfedge_handle_; } │ │ │ │ -434 │ │ │ │ -_4_3_5 _H_a_l_f_e_d_g_e_H_a_n_d_l_e prev_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, GenProg:: │ │ │ │ -FalseType) const │ │ │ │ -436 { │ │ │ │ -437 if (is_boundary(_heh)) │ │ │ │ -438 {//iterating around the vertex should be faster than iterating the boundary │ │ │ │ -439 _H_a_l_f_e_d_g_e_H_a_n_d_l_e curr_heh(opposite_halfedge_handle(_heh)); │ │ │ │ -440 _H_a_l_f_e_d_g_e_H_a_n_d_l_e next_heh(next_halfedge_handle(curr_heh)); │ │ │ │ -441 do │ │ │ │ -442 { │ │ │ │ -443 curr_heh = opposite_halfedge_handle(next_heh); │ │ │ │ -444 next_heh = next_halfedge_handle(curr_heh); │ │ │ │ -445 } │ │ │ │ -446 while (next_heh != _heh); │ │ │ │ -447 return curr_heh; │ │ │ │ -448 } │ │ │ │ -449 else │ │ │ │ -450 { │ │ │ │ -451 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh(_heh); │ │ │ │ -452 _H_a_l_f_e_d_g_e_H_a_n_d_l_e next_heh(next_halfedge_handle(heh)); │ │ │ │ -453 while (next_heh != _heh) { │ │ │ │ -454 heh = next_heh; │ │ │ │ -455 next_heh = next_halfedge_handle(next_heh); │ │ │ │ -456 } │ │ │ │ -457 return heh; │ │ │ │ -458 } │ │ │ │ -459 } │ │ │ │ -460 │ │ │ │ -461 │ │ │ │ -_4_6_2 _H_a_l_f_e_d_g_e_H_a_n_d_l_e opposite_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -463 { return _H_a_l_f_e_d_g_e_H_a_n_d_l_e(_heh._i_d_x() ^ 1); } │ │ │ │ -464 │ │ │ │ -465 │ │ │ │ -_4_6_6 _H_a_l_f_e_d_g_e_H_a_n_d_l_e ccw_rotated_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -467 { return opposite_halfedge_handle(prev_halfedge_handle(_heh)); } │ │ │ │ -468 │ │ │ │ -469 │ │ │ │ -_4_7_0 _H_a_l_f_e_d_g_e_H_a_n_d_l_e cw_rotated_halfedge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -471 { return next_halfedge_handle(opposite_halfedge_handle(_heh)); } │ │ │ │ -472 │ │ │ │ -473 // --- edge connectivity --- │ │ │ │ -_4_7_4 static _H_a_l_f_e_d_g_e_H_a_n_d_l_e s_halfedge_handle(_E_d_g_e_H_a_n_d_l_e _eh, unsigned int _i = │ │ │ │ -0) │ │ │ │ -475 { │ │ │ │ -476 assert(_i<=1); │ │ │ │ -477 return _H_a_l_f_e_d_g_e_H_a_n_d_l_e((_eh._i_d_x() << 1) + _i); │ │ │ │ -478 } │ │ │ │ -479 │ │ │ │ -_4_8_0 static _E_d_g_e_H_a_n_d_l_e s_edge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -481 { return _E_d_g_e_H_a_n_d_l_e(_heh._i_d_x() >> 1); } │ │ │ │ -482 │ │ │ │ -_4_8_3 _H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_E_d_g_e_H_a_n_d_l_e _eh, unsigned int _i = 0) const │ │ │ │ -484 { │ │ │ │ -485 return s_halfedge_handle(_eh, _i); │ │ │ │ -486 } │ │ │ │ -487 │ │ │ │ -_4_8_8 _E_d_g_e_H_a_n_d_l_e edge_handle(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -489 { return s_edge_handle(_heh); } │ │ │ │ -490 │ │ │ │ -491 // --- face connectivity --- │ │ │ │ -_4_9_2 _H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge_handle(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ -493 { return face(_fh).halfedge_handle_; } │ │ │ │ -494 │ │ │ │ -495 void set_halfedge_handle(_F_a_c_e_H_a_n_d_l_e _fh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -496 { │ │ │ │ -497// assert(is_valid_handle(_heh)); │ │ │ │ -498 face(_fh).halfedge_handle_ = _heh; │ │ │ │ -499 } │ │ │ │ -500 │ │ │ │ -502 //------------------------------------------------------------ vertex │ │ │ │ -status │ │ │ │ -_5_0_3 const _S_t_a_t_u_s_I_n_f_o& _s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -504 { return property(vertex_status_, _vh); } │ │ │ │ -505 │ │ │ │ -506 StatusInfo& status(_V_e_r_t_e_x_H_a_n_d_l_e _vh) │ │ │ │ -507 { return property(vertex_status_, _vh); } │ │ │ │ -508 │ │ │ │ -_5_1_3 void _r_e_s_e_t___s_t_a_t_u_s() { │ │ │ │ -514 _P_r_o_p_e_r_t_y_T_<_S_t_a_t_u_s_I_n_f_o_> &status_prop = property(vertex_status_); │ │ │ │ -515 PropertyT::vector_type &sprop_v = status_prop._d_a_t_a___v_e_c_t_o_r(); │ │ │ │ -516 std::fill(sprop_v.begin(), sprop_v.begin() + n_vertices(), _S_t_a_t_u_s_I_n_f_o()); │ │ │ │ -517 } │ │ │ │ -518 │ │ │ │ -519 //----------------------------------------------------------- halfedge │ │ │ │ -status │ │ │ │ -520 const StatusInfo& status(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh) const │ │ │ │ -521 { return property(halfedge_status_, _hh); } │ │ │ │ -522 │ │ │ │ -523 StatusInfo& status(HalfedgeHandle _hh) │ │ │ │ -524 { return property(halfedge_status_, _hh); } │ │ │ │ -525 │ │ │ │ -526 //--------------------------------------------------------------- edge │ │ │ │ -status │ │ │ │ -527 const StatusInfo& status(EdgeHandle _eh) const │ │ │ │ -528 { return property(edge_status_, _eh); } │ │ │ │ -529 │ │ │ │ -530 StatusInfo& status(EdgeHandle _eh) │ │ │ │ -531 { return property(edge_status_, _eh); } │ │ │ │ -532 │ │ │ │ -533 //--------------------------------------------------------------- face │ │ │ │ -status │ │ │ │ -534 const StatusInfo& status(FaceHandle _fh) const │ │ │ │ -535 { return property(face_status_, _fh); } │ │ │ │ -536 │ │ │ │ -537 StatusInfo& status(FaceHandle _fh) │ │ │ │ -538 { return property(face_status_, _fh); } │ │ │ │ -539 │ │ │ │ -540 inline bool has_vertex_status() const │ │ │ │ -541 { return vertex_status_.is_valid(); } │ │ │ │ -542 │ │ │ │ -543 inline bool has_halfedge_status() const │ │ │ │ -544 { return halfedge_status_.is_valid(); } │ │ │ │ -545 │ │ │ │ -546 inline bool has_edge_status() const │ │ │ │ -547 { return edge_status_.is_valid(); } │ │ │ │ -548 │ │ │ │ -549 inline bool has_face_status() const │ │ │ │ -550 { return face_status_.is_valid(); } │ │ │ │ -551 │ │ │ │ -552 inline VertexStatusPropertyHandle vertex_status_pph() const │ │ │ │ -553 { return vertex_status_; } │ │ │ │ -554 │ │ │ │ -555 inline HalfedgeStatusPropertyHandle halfedge_status_pph() const │ │ │ │ -556 { return halfedge_status_; } │ │ │ │ -557 │ │ │ │ -558 inline EdgeStatusPropertyHandle edge_status_pph() const │ │ │ │ -559 { return edge_status_; } │ │ │ │ -560 │ │ │ │ -561 inline FaceStatusPropertyHandle face_status_pph() const │ │ │ │ -562 { return face_status_; } │ │ │ │ -563 │ │ │ │ -_5_6_5 inline _V_e_r_t_e_x_S_t_a_t_u_s_P_r_o_p_e_r_t_y_H_a_n_d_l_e _s_t_a_t_u_s___p_p_h(_V_e_r_t_e_x_H_a_n_d_l_e /*_hnd*/) const │ │ │ │ -566 { return vertex_status_pph(); } │ │ │ │ -567 │ │ │ │ -568 inline HalfedgeStatusPropertyHandle status_pph(_H_a_l_f_e_d_g_e_H_a_n_d_l_e /*_hnd*/ │ │ │ │ -) const │ │ │ │ -569 { return halfedge_status_pph(); } │ │ │ │ -570 │ │ │ │ -571 inline EdgeStatusPropertyHandle status_pph(EdgeHandle /*_hnd*/) const │ │ │ │ -572 { return edge_status_pph(); } │ │ │ │ -573 │ │ │ │ -574 inline FaceStatusPropertyHandle status_pph(FaceHandle /*_hnd*/) const │ │ │ │ -575 { return face_status_pph(); } │ │ │ │ -576 │ │ │ │ -_5_7_8 void _r_e_q_u_e_s_t___v_e_r_t_e_x___s_t_a_t_u_s() │ │ │ │ -579 { │ │ │ │ -580 if (!refcount_vstatus_++) │ │ │ │ -581 add_property( vertex_status_, "v:status" ); │ │ │ │ -582 } │ │ │ │ -583 │ │ │ │ -584 void request_halfedge_status() │ │ │ │ -585 { │ │ │ │ -586 if (!refcount_hstatus_++) │ │ │ │ -587 add_property( halfedge_status_, "h:status" ); │ │ │ │ -588 } │ │ │ │ -589 │ │ │ │ -590 void request_edge_status() │ │ │ │ -591 { │ │ │ │ -592 if (!refcount_estatus_++) │ │ │ │ -593 add_property( edge_status_, "e:status" ); │ │ │ │ -594 } │ │ │ │ -595 │ │ │ │ -596 void request_face_status() │ │ │ │ -597 { │ │ │ │ -598 if (!refcount_fstatus_++) │ │ │ │ -599 add_property( face_status_, "f:status" ); │ │ │ │ -600 } │ │ │ │ -601 │ │ │ │ -_6_0_3 void _r_e_l_e_a_s_e___v_e_r_t_e_x___s_t_a_t_u_s() │ │ │ │ -604 { │ │ │ │ -605 if ((refcount_vstatus_ > 0) && (! --refcount_vstatus_)) │ │ │ │ -606 remove_property(vertex_status_); │ │ │ │ -607 } │ │ │ │ -608 │ │ │ │ -609 void release_halfedge_status() │ │ │ │ -610 { │ │ │ │ -611 if ((refcount_hstatus_ > 0) && (! --refcount_hstatus_)) │ │ │ │ -612 remove_property(halfedge_status_); │ │ │ │ -613 } │ │ │ │ -614 │ │ │ │ -615 void release_edge_status() │ │ │ │ -616 { │ │ │ │ -617 if ((refcount_estatus_ > 0) && (! --refcount_estatus_)) │ │ │ │ -618 remove_property(edge_status_); │ │ │ │ -619 } │ │ │ │ -620 │ │ │ │ -621 void release_face_status() │ │ │ │ -622 { │ │ │ │ -623 if ((refcount_fstatus_ > 0) && (! --refcount_fstatus_)) │ │ │ │ -624 remove_property(face_status_); │ │ │ │ -625 } │ │ │ │ -626 │ │ │ │ -628 │ │ │ │ -636 template │ │ │ │ -_6_3_7 class _S_t_a_t_u_s_S_e_t_T │ │ │ │ -638 { │ │ │ │ -639 public: │ │ │ │ -640 typedef HandleT Handle; │ │ │ │ -641 │ │ │ │ -642 protected: │ │ │ │ -643 _A_r_r_a_y_K_e_r_n_e_l& kernel_; │ │ │ │ -644 │ │ │ │ -645 public: │ │ │ │ -646 const unsigned int bit_mask_; │ │ │ │ -647 │ │ │ │ -648 public: │ │ │ │ -649 _S_t_a_t_u_s_S_e_t_T(_A_r_r_a_y_K_e_r_n_e_l& _kernel, const unsigned int _bit_mask) │ │ │ │ -650 : kernel_(_kernel), bit_mask_(_bit_mask) │ │ │ │ -651 {} │ │ │ │ -652 │ │ │ │ -653 _~_S_t_a_t_u_s_S_e_t_T() │ │ │ │ -654 {} │ │ │ │ -655 │ │ │ │ -656 inline bool is_in(Handle _hnd) const │ │ │ │ -657 { return kernel_._s_t_a_t_u_s(_hnd)._i_s___b_i_t___s_e_t(bit_mask_); } │ │ │ │ -658 │ │ │ │ -659 inline void insert(Handle _hnd) │ │ │ │ -660 { kernel_._s_t_a_t_u_s(_hnd)._s_e_t___b_i_t(bit_mask_); } │ │ │ │ -661 │ │ │ │ -662 inline void erase(Handle _hnd) │ │ │ │ -663 { kernel_._s_t_a_t_u_s(_hnd)._u_n_s_e_t___b_i_t(bit_mask_); } │ │ │ │ -664 │ │ │ │ -_6_6_6 size_t _s_i_z_e() const │ │ │ │ -667 { │ │ │ │ -668 const int n = kernel_._s_t_a_t_u_s___p_p_h(Handle())._i_s___v_a_l_i_d() ? │ │ │ │ -669 (int)kernel_._p_r_o_p_e_r_t_y(kernel_._s_t_a_t_u_s___p_p_h(Handle())).n_elements() : 0; │ │ │ │ -670 │ │ │ │ -671 size_t sz = 0; │ │ │ │ -672 for (int i = 0; i < n; ++i) │ │ │ │ -673 sz += (size_t)is_in(Handle(i)); │ │ │ │ -674 return sz; │ │ │ │ -675 } │ │ │ │ -676 │ │ │ │ -_6_7_8 void _c_l_e_a_r() │ │ │ │ -679 { │ │ │ │ -680 const int n = kernel_._s_t_a_t_u_s___p_p_h(Handle())._i_s___v_a_l_i_d() ? │ │ │ │ -681 (int)kernel_._p_r_o_p_e_r_t_y(kernel_._s_t_a_t_u_s___p_p_h(Handle())).n_elements() : 0; │ │ │ │ -682 │ │ │ │ -683 for (int i = 0; i < n; ++i) │ │ │ │ -684 erase(Handle(i)); │ │ │ │ -685 } │ │ │ │ -686 }; │ │ │ │ -687 │ │ │ │ -688 friend class StatusSetT<_V_e_r_t_e_x_H_a_n_d_l_e>; │ │ │ │ -689 friend class StatusSetT<_E_d_g_e_H_a_n_d_l_e>; │ │ │ │ -690 friend class StatusSetT<_F_a_c_e_H_a_n_d_l_e>; │ │ │ │ -691 friend class StatusSetT<_H_a_l_f_e_d_g_e_H_a_n_d_l_e>; │ │ │ │ -692 │ │ │ │ -694 template │ │ │ │ -_6_9_5 class _A_u_t_o_S_t_a_t_u_s_S_e_t_T : public _S_t_a_t_u_s_S_e_t_T │ │ │ │ -696 { │ │ │ │ -697 private: │ │ │ │ -698 typedef HandleT Handle; │ │ │ │ -699 typedef _S_t_a_t_u_s_S_e_t_T_<_H_a_n_d_l_e_> _B_a_s_e; │ │ │ │ -700 │ │ │ │ -701 public: │ │ │ │ -702 explicit _A_u_t_o_S_t_a_t_u_s_S_e_t_T(_A_r_r_a_y_K_e_r_n_e_l& _kernel) │ │ │ │ -703 : _S_t_a_t_u_s_S_e_t_T_<_H_a_n_d_l_e_>(_kernel, _kernel.pop_bit_mask(Handle())) │ │ │ │ -704 { /*assert(size() == 0);*/ } //the set should be empty on creation │ │ │ │ -705 │ │ │ │ -706 _~_A_u_t_o_S_t_a_t_u_s_S_e_t_T() │ │ │ │ -707 { │ │ │ │ -708 //assert(size() == 0);//the set should be empty on leave? │ │ │ │ -709 Base::kernel_.push_bit_mask(Handle(), Base::bit_mask_); │ │ │ │ -710 } │ │ │ │ -711 }; │ │ │ │ -712 │ │ │ │ -713 friend class _A_u_t_o_S_t_a_t_u_s_S_e_t_T<_V_e_r_t_e_x_H_a_n_d_l_e>; │ │ │ │ -714 friend class _A_u_t_o_S_t_a_t_u_s_S_e_t_T<_E_d_g_e_H_a_n_d_l_e>; │ │ │ │ -715 friend class _A_u_t_o_S_t_a_t_u_s_S_e_t_T<_F_a_c_e_H_a_n_d_l_e>; │ │ │ │ -716 friend class _A_u_t_o_S_t_a_t_u_s_S_e_t_T<_H_a_l_f_e_d_g_e_H_a_n_d_l_e>; │ │ │ │ -717 │ │ │ │ -718 typedef _A_u_t_o_S_t_a_t_u_s_S_e_t_T_<_V_e_r_t_e_x_H_a_n_d_l_e_> _V_e_r_t_e_x_S_t_a_t_u_s_S_e_t; │ │ │ │ -719 typedef _A_u_t_o_S_t_a_t_u_s_S_e_t_T_<_E_d_g_e_H_a_n_d_l_e_> _E_d_g_e_S_t_a_t_u_s_S_e_t; │ │ │ │ -720 typedef _A_u_t_o_S_t_a_t_u_s_S_e_t_T_<_F_a_c_e_H_a_n_d_l_e_> _F_a_c_e_S_t_a_t_u_s_S_e_t; │ │ │ │ -721 typedef _A_u_t_o_S_t_a_t_u_s_S_e_t_T_<_H_a_l_f_e_d_g_e_H_a_n_d_l_e_> _H_a_l_f_e_d_g_e_S_t_a_t_u_s_S_e_t; │ │ │ │ -722 │ │ │ │ -724 template │ │ │ │ -_7_2_5 class _E_x_t_S_t_a_t_u_s_S_e_t_T : public _A_u_t_o_S_t_a_t_u_s_S_e_t_T │ │ │ │ -726 { │ │ │ │ -727 public: │ │ │ │ -728 typedef HandleT Handle; │ │ │ │ -729 typedef _A_u_t_o_S_t_a_t_u_s_S_e_t_T_<_H_a_n_d_l_e_> _B_a_s_e; │ │ │ │ -730 │ │ │ │ -731 protected: │ │ │ │ -732 typedef std::vector HandleContainer; │ │ │ │ -733 HandleContainer handles_; │ │ │ │ -734 │ │ │ │ -735 public: │ │ │ │ -736 typedef typename HandleContainer::iterator │ │ │ │ -737 iterator; │ │ │ │ -738 typedef typename HandleContainer::const_iterator │ │ │ │ -739 const_iterator; │ │ │ │ -740 public: │ │ │ │ -741 explicit _E_x_t_S_t_a_t_u_s_S_e_t_T(_A_r_r_a_y_K_e_r_n_e_l& _kernel, size_t _capacity_hint = 0) │ │ │ │ -742 : _B_a_s_e(_kernel) │ │ │ │ -743 { handles_.reserve(_capacity_hint); } │ │ │ │ -744 │ │ │ │ -745 _~_E_x_t_S_t_a_t_u_s_S_e_t_T() │ │ │ │ -746 { Base::clear(); } │ │ │ │ -747 │ │ │ │ -748 // Complexity: O(1) │ │ │ │ -749 inline void insert(Handle _hnd) │ │ │ │ -750 { │ │ │ │ -751 if (!Base::is_in(_hnd)) │ │ │ │ -752 { │ │ │ │ -753 Base::insert(_hnd); │ │ │ │ -754 handles_.push_back(_hnd); │ │ │ │ -755 } │ │ │ │ -756 } │ │ │ │ -757 │ │ │ │ -_7_5_9 inline void _e_r_a_s_e(Handle _hnd) │ │ │ │ -760 { │ │ │ │ -761 if (is_in(_hnd)) │ │ │ │ -762 { │ │ │ │ -763 iterator it = std::find(begin(), end(), _hnd); │ │ │ │ -764 erase(it); │ │ │ │ -765 } │ │ │ │ -766 } │ │ │ │ -767 │ │ │ │ -_7_6_9 inline void _e_r_a_s_e(iterator _it) │ │ │ │ -770 { │ │ │ │ -771 assert(_it != const_cast(this)->end() && │ │ │ │ -772 Base::is_in(*_it)); │ │ │ │ -773 Base::erase(*_it); │ │ │ │ -774 *_it = handles_.back(); │ │ │ │ -775 _it.pop_back(); │ │ │ │ -776 } │ │ │ │ -777 │ │ │ │ -778 inline void clear() │ │ │ │ -779 { │ │ │ │ -780 for (iterator it = begin(); it != end(); ++it) │ │ │ │ -781 { │ │ │ │ -782 assert(Base::is_in(*it)); │ │ │ │ -783 Base::erase(*it); │ │ │ │ -784 } │ │ │ │ -785 handles_.clear(); │ │ │ │ -786 } │ │ │ │ -787 │ │ │ │ -_7_8_9 inline unsigned int _s_i_z_e() const │ │ │ │ -790 { return handles_.size(); } │ │ │ │ -791 inline bool empty() const │ │ │ │ -792 { return handles_.empty(); } │ │ │ │ -793 │ │ │ │ -794 //Vector API │ │ │ │ -795 inline iterator begin() │ │ │ │ -796 { return handles_.begin(); } │ │ │ │ -797 inline const_iterator begin() const │ │ │ │ -798 { return handles_.begin(); } │ │ │ │ -799 │ │ │ │ -800 inline iterator end() │ │ │ │ -801 { return handles_.end(); } │ │ │ │ -802 inline const_iterator end() const │ │ │ │ -803 { return handles_.end(); } │ │ │ │ -804 │ │ │ │ -805 inline Handle& front() │ │ │ │ -806 { return handles_.front(); } │ │ │ │ -807 inline const Handle& front() const │ │ │ │ -808 { return handles_.front(); } │ │ │ │ -809 │ │ │ │ -810 inline Handle& back() │ │ │ │ -811 { return handles_.back(); } │ │ │ │ -812 inline const Handle& back() const │ │ │ │ -813 { return handles_.back(); } │ │ │ │ -814 }; │ │ │ │ -815 │ │ │ │ -816 typedef ExtStatusSetT ExtFaceStatusSet; │ │ │ │ -817 typedef ExtStatusSetT ExtVertexStatusSet; │ │ │ │ -818 typedef ExtStatusSetT ExtEdgeStatusSet; │ │ │ │ -819 typedef ExtStatusSetT ExtHalfedgeStatusSet; │ │ │ │ -820 │ │ │ │ -821private: │ │ │ │ -822 // iterators │ │ │ │ -823 typedef std::vector VertexContainer; │ │ │ │ -824 typedef std::vector EdgeContainer; │ │ │ │ -825 typedef std::vector FaceContainer; │ │ │ │ -826 typedef VertexContainer::iterator KernelVertexIter; │ │ │ │ -827 typedef VertexContainer::const_iterator KernelConstVertexIter; │ │ │ │ -828 typedef EdgeContainer::iterator KernelEdgeIter; │ │ │ │ -829 typedef EdgeContainer::const_iterator KernelConstEdgeIter; │ │ │ │ -830 typedef FaceContainer::iterator KernelFaceIter; │ │ │ │ -831 typedef FaceContainer::const_iterator KernelConstFaceIter; │ │ │ │ -832 typedef std::vector BitMaskContainer; │ │ │ │ -833 │ │ │ │ -834 │ │ │ │ -835 KernelVertexIter vertices_begin() { return vertices_.begin(); } │ │ │ │ -836 KernelConstVertexIter vertices_begin() const { return vertices_.begin(); } │ │ │ │ -837 KernelVertexIter vertices_end() { return vertices_.end(); } │ │ │ │ -838 KernelConstVertexIter vertices_end() const { return vertices_.end(); } │ │ │ │ -839 │ │ │ │ -840 KernelEdgeIter edges_begin() { return edges_.begin(); } │ │ │ │ -841 KernelConstEdgeIter edges_begin() const { return edges_.begin(); } │ │ │ │ -842 KernelEdgeIter edges_end() { return edges_.end(); } │ │ │ │ -843 KernelConstEdgeIter edges_end() const { return edges_.end(); } │ │ │ │ -844 │ │ │ │ -845 KernelFaceIter faces_begin() { return faces_.begin(); } │ │ │ │ -846 KernelConstFaceIter faces_begin() const { return faces_.begin(); } │ │ │ │ -847 KernelFaceIter faces_end() { return faces_.end(); } │ │ │ │ -848 KernelConstFaceIter faces_end() const { return faces_.end(); } │ │ │ │ -849 │ │ │ │ -851 inline BitMaskContainer& bit_masks(VertexHandle /*_dummy_hnd*/) │ │ │ │ -852 { return vertex_bit_masks_; } │ │ │ │ -853 inline BitMaskContainer& bit_masks(EdgeHandle /*_dummy_hnd*/) │ │ │ │ -854 { return edge_bit_masks_; } │ │ │ │ -855 inline BitMaskContainer& bit_masks(FaceHandle /*_dummy_hnd*/) │ │ │ │ -856 { return face_bit_masks_; } │ │ │ │ -857 inline BitMaskContainer& bit_masks(HalfedgeHandle /*_dummy_hnd*/) │ │ │ │ -858 { return halfedge_bit_masks_; } │ │ │ │ -859 │ │ │ │ -860 template │ │ │ │ -861 unsigned int pop_bit_mask(Handle _hnd) │ │ │ │ -862 { │ │ │ │ -863 assert(!bit_masks(_hnd).empty());//check if the client request too many │ │ │ │ -status sets │ │ │ │ -864 unsigned int bit_mask = bit_masks(_hnd).back(); │ │ │ │ -865 bit_masks(_hnd).pop_back(); │ │ │ │ -866 return bit_mask; │ │ │ │ -867 } │ │ │ │ -868 │ │ │ │ -869 template │ │ │ │ -870 void push_bit_mask(Handle _hnd, unsigned int _bit_mask) │ │ │ │ -871 { │ │ │ │ -872 assert(std::find(bit_masks(_hnd).begin(), bit_masks(_hnd).end(), _bit_mask) │ │ │ │ -== │ │ │ │ -873 bit_masks(_hnd).end());//this mask should be not already used │ │ │ │ -874 bit_masks(_hnd).push_back(_bit_mask); │ │ │ │ -875 } │ │ │ │ -876 │ │ │ │ -877 void init_bit_masks(BitMaskContainer& _bmc); │ │ │ │ -878 void init_bit_masks(); │ │ │ │ -879 │ │ │ │ -880protected: │ │ │ │ -881 │ │ │ │ -882 VertexStatusPropertyHandle vertex_status_; │ │ │ │ -883 HalfedgeStatusPropertyHandle halfedge_status_; │ │ │ │ -884 EdgeStatusPropertyHandle edge_status_; │ │ │ │ -885 FaceStatusPropertyHandle face_status_; │ │ │ │ -886 │ │ │ │ -887 unsigned int refcount_vstatus_; │ │ │ │ -888 unsigned int refcount_hstatus_; │ │ │ │ -889 unsigned int refcount_estatus_; │ │ │ │ -890 unsigned int refcount_fstatus_; │ │ │ │ -891 │ │ │ │ -892private: │ │ │ │ -893 VertexContainer vertices_; │ │ │ │ -894 EdgeContainer edges_; │ │ │ │ -895 FaceContainer faces_; │ │ │ │ -896 │ │ │ │ -897 BitMaskContainer halfedge_bit_masks_; │ │ │ │ -898 BitMaskContainer edge_bit_masks_; │ │ │ │ -899 BitMaskContainer vertex_bit_masks_; │ │ │ │ -900 BitMaskContainer face_bit_masks_; │ │ │ │ -901}; │ │ │ │ -902 │ │ │ │ -903 │ │ │ │ -904// │ │ │ │ -============================================================================= │ │ │ │ -905} // namespace OpenMesh │ │ │ │ -906// │ │ │ │ -============================================================================= │ │ │ │ -907#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_ARRAY_KERNEL_C) │ │ │ │ -908# define OPENMESH_ARRAY_KERNEL_TEMPLATES │ │ │ │ -909# include "ArrayKernelT_impl.hh" │ │ │ │ -910#endif │ │ │ │ -911// │ │ │ │ -============================================================================= │ │ │ │ -912#endif // OPENMESH_ARRAY_KERNEL_HH defined │ │ │ │ -913// │ │ │ │ -============================================================================= │ │ │ │ +typename.hh │ │ │ │ +1#pragma once │ │ │ │ +2 │ │ │ │ +7 │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10#include │ │ │ │ +11#include │ │ │ │ +12#include │ │ │ │ +13 │ │ │ │ +14namespace _O_p_e_n_M_e_s_h { │ │ │ │ +15 │ │ │ │ +16template │ │ │ │ +17std::string get_type_name() │ │ │ │ +18{ │ │ │ │ +19#ifdef _MSC_VER │ │ │ │ +20 // MSVC'S type_name returns only a friendly name with name() method, │ │ │ │ +21 // to get a unique name use raw_name() method instead │ │ │ │ +22 return typeid(T).raw_name(); │ │ │ │ +23#else │ │ │ │ +24 // GCC and clang curently return mangled name as name(), there is no │ │ │ │ +raw_name() method │ │ │ │ +25 return typeid(T).name(); │ │ │ │ +26#endif │ │ │ │ +27} │ │ │ │ +28 │ │ │ │ +29}//namespace OpenMesh │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l │ │ │ │ -Mesh kernel using arrays for mesh item storage. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:88 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_s_t_a_t_u_s___p_p_h │ │ │ │ -VertexStatusPropertyHandle status_pph(VertexHandle) const │ │ │ │ -status property by handle │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:565 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_r_e_s_e_t___s_t_a_t_u_s │ │ │ │ -void reset_status() │ │ │ │ -Reinitializes the status of all vertices using the StatusInfo default │ │ │ │ -constructor,... │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:513 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_r_e_l_e_a_s_e___v_e_r_t_e_x___s_t_a_t_u_s │ │ │ │ -void release_vertex_status() │ │ │ │ -Status Release API. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:603 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___v_e_r_t_i_c_e_s │ │ │ │ -size_t n_vertices() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:345 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_r_e_q_u_e_s_t___v_e_r_t_e_x___s_t_a_t_u_s │ │ │ │ -void request_vertex_status() │ │ │ │ -Status Request API. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:578 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___e_d_g_e_s │ │ │ │ -size_t n_edges() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:347 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ -Is halfedge _heh a boundary halfedge (is its face handle invalid) ? │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:400 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ -VertexHandle new_vertex() │ │ │ │ -Add a new vertex. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:216 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_s_t_a_t_u_s │ │ │ │ -const StatusInfo & status(VertexHandle _vh) const │ │ │ │ -Status Query API. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:503 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___f_a_c_e_s │ │ │ │ -size_t n_faces() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:348 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n_e_w___v_e_r_t_e_x___d_i_r_t_y │ │ │ │ -VertexHandle new_vertex_dirty() │ │ │ │ -Same as new_vertex() but uses PropertyContainer::resize_if_smaller() to resize │ │ │ │ -the vertex property co... │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:234 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___h_a_l_f_e_d_g_e_s │ │ │ │ -size_t n_halfedges() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:346 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_S_t_a_t_u_s_S_e_t_T │ │ │ │ -— StatusSet API — │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:638 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_S_t_a_t_u_s_S_e_t_T_:_:_c_l_e_a_r │ │ │ │ -void clear() │ │ │ │ -Note: O(n) complexity. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:678 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_S_t_a_t_u_s_S_e_t_T_:_:_s_i_z_e │ │ │ │ -size_t size() const │ │ │ │ -Note: 0(n) complexity. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:666 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_A_u_t_o_S_t_a_t_u_s_S_e_t_T │ │ │ │ -AutoStatusSetT: A status set that automatically picks a status bit. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:696 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_E_x_t_S_t_a_t_u_s_S_e_t_T │ │ │ │ -ExtStatusSet: A status set augmented with an array. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:726 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_E_x_t_S_t_a_t_u_s_S_e_t_T_:_:_e_r_a_s_e │ │ │ │ -void erase(iterator _it) │ │ │ │ -Complexity: O(1) │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:769 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_E_x_t_S_t_a_t_u_s_S_e_t_T_:_:_e_r_a_s_e │ │ │ │ -void erase(Handle _hnd) │ │ │ │ -Complexity: O(k), (k - number of the elements in the set) │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:759 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_E_x_t_S_t_a_t_u_s_S_e_t_T_:_:_s_i_z_e │ │ │ │ -unsigned int size() const │ │ │ │ -Complexity: 0(1) │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:789 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l │ │ │ │ -This class provides low-level property management like adding/removing │ │ │ │ -properties and access to prope... │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:98 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_p_r_o_p_e_r_t_y │ │ │ │ -PropertyT< T > & property(VPropHandleT< T > _ph) │ │ │ │ -In most cases you should use the convenient PropertyManager wrapper and use of │ │ │ │ -this function should n... │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:310 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ -bool is_valid() const │ │ │ │ -The handle is valid iff the index is not negative. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_n_v_a_l_i_d_a_t_e │ │ │ │ -void invalidate() │ │ │ │ -reset handle to be invalid │ │ │ │ -DDeeffiinniittiioonn Handles.hh:77 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ -int idx() const │ │ │ │ -Get the underlying index of this handle. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ -Add status information to a base class. │ │ │ │ -DDeeffiinniittiioonn Status.hh:95 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_i_s___b_i_t___s_e_t │ │ │ │ -bool is_bit_set(unsigned int _s) const │ │ │ │ -is a certain bit set ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:157 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_s_e_t___b_i_t │ │ │ │ -void set_bit(unsigned int _s) │ │ │ │ -set a certain bit │ │ │ │ -DDeeffiinniittiioonn Status.hh:159 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_u_n_s_e_t___b_i_t │ │ │ │ -void unset_bit(unsigned int _s) │ │ │ │ -unset a certain bit │ │ │ │ -DDeeffiinniittiioonn Status.hh:161 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_T │ │ │ │ -Default property class for any type T. │ │ │ │ -DDeeffiinniittiioonn Property.hh:93 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_T_:_:_d_a_t_a___v_e_c_t_o_r │ │ │ │ -vector_type & data_vector() │ │ │ │ -Get reference to property vector (be careful, improper usage, e.g. resizing, │ │ │ │ -may crash OpenMesh!... │ │ │ │ -DDeeffiinniittiioonn Property.hh:185 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ -Handle representing a vertex property. │ │ │ │ -DDeeffiinniittiioonn Property.hh:417 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ -Handle representing a halfedge property. │ │ │ │ -DDeeffiinniittiioonn Property.hh:432 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ -Handle representing an edge property. │ │ │ │ -DDeeffiinniittiioonn Property.hh:447 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ -Handle representing a face property. │ │ │ │ -DDeeffiinniittiioonn Property.hh:462 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00692_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/ArrayItems.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/PropertyManager.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │
│ │ │ -
ArrayItems.hh
│ │ │ +
PropertyManager.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,98 +136,592 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ -
44#ifndef OPENMESH_ARRAY_ITEMS_HH
│ │ │ -
45#define OPENMESH_ARRAY_ITEMS_HH
│ │ │ -
46
│ │ │ -
47
│ │ │ -
48//== INCLUDES =================================================================
│ │ │ -
49
│ │ │ -
50
│ │ │ -
51#include <OpenMesh/Core/System/config.h>
│ │ │ -
52#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
53#include <OpenMesh/Core/Mesh/Handles.hh>
│ │ │ -
54
│ │ │ -
55
│ │ │ -
56//== NAMESPACES ===============================================================
│ │ │ -
57
│ │ │ -
58namespace OpenMesh {
│ │ │ -
59
│ │ │ -
60
│ │ │ -
61//== CLASS DEFINITION =========================================================
│ │ │ -
62
│ │ │ -
63
│ │ │ -
65struct ArrayItems
│ │ │ -
66{
│ │ │ -
67
│ │ │ -
68 //------------------------------------------------------ internal vertex type
│ │ │ -
69
│ │ │ -
71 class Vertex
│ │ │ -
72 {
│ │ │ -
73 friend class ArrayKernel;
│ │ │ -
74 HalfedgeHandle halfedge_handle_;
│ │ │ -
75 };
│ │ │ -
76
│ │ │ +
42#ifndef PROPERTYMANAGER_HH_
│ │ │ +
43#define PROPERTYMANAGER_HH_
│ │ │ +
44
│ │ │ +
45#include <OpenMesh/Core/System/config.h>
│ │ │ +
46#include <OpenMesh/Core/Utils/HandleToPropHandle.hh>
│ │ │ +
47#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
48#include <sstream>
│ │ │ +
49#include <stdexcept>
│ │ │ +
50#include <string>
│ │ │ +
51
│ │ │ +
52namespace OpenMesh {
│ │ │ +
53
│ │ │ +
75template<typename PROPTYPE, typename MeshT = int>
│ │ │ +
│ │ │ + │ │ │
77
│ │ │ -
78 //---------------------------------------------------- internal halfedge type
│ │ │ -
79
│ │ │ -
80#ifndef DOXY_IGNORE_THIS
│ │ │ -
81 class Halfedge_without_prev
│ │ │ -
82 {
│ │ │ -
83 friend class ArrayKernel;
│ │ │ -
84 FaceHandle face_handle_;
│ │ │ -
85 VertexHandle vertex_handle_;
│ │ │ -
86 HalfedgeHandle next_halfedge_handle_;
│ │ │ -
87 };
│ │ │ -
88#endif
│ │ │ -
89
│ │ │ -
90#ifndef DOXY_IGNORE_THIS
│ │ │ -
91 class Halfedge_with_prev : public Halfedge_without_prev
│ │ │ -
92 {
│ │ │ -
93 friend class ArrayKernel;
│ │ │ -
94 HalfedgeHandle prev_halfedge_handle_;
│ │ │ -
95 };
│ │ │ -
96#endif
│ │ │ -
97
│ │ │ -
98 //TODO: should be selected with config.h define
│ │ │ -
99 typedef Halfedge_with_prev Halfedge;
│ │ │ -
100 typedef Halfedge_without_prev HalfedgeNoPrev;
│ │ │ -
101 typedef GenProg::Bool2Type<true> HasPrevHalfedge;
│ │ │ -
102
│ │ │ -
103 //-------------------------------------------------------- internal edge type
│ │ │ -
104#ifndef DOXY_IGNORE_THIS
│ │ │ -
105 class Edge
│ │ │ -
106 {
│ │ │ -
107 friend class ArrayKernel;
│ │ │ -
108 Halfedge halfedges_[2];
│ │ │ -
109 };
│ │ │ -
110#endif
│ │ │ -
111
│ │ │ -
112 //-------------------------------------------------------- internal face type
│ │ │ -
113#ifndef DOXY_IGNORE_THIS
│ │ │ -
114 class Face
│ │ │ -
115 {
│ │ │ -
116 friend class ArrayKernel;
│ │ │ -
117 HalfedgeHandle halfedge_handle_;
│ │ │ -
118 };
│ │ │ -
119};
│ │ │ -
120#endif
│ │ │ -
121
│ │ │ -
122//=============================================================================
│ │ │ -
123} // namespace OpenMesh
│ │ │ -
124//=============================================================================
│ │ │ -
125#endif // OPENMESH_ITEMS_HH defined
│ │ │ -
126//=============================================================================
│ │ │ +
78 public:
│ │ │ +
79 using Value = typename PROPTYPE::Value;
│ │ │ +
80 using value_type = typename PROPTYPE::value_type;
│ │ │ +
81 using Handle = typename PROPTYPE::Handle;
│ │ │ + │ │ │ +
83 using Reference = typename PROPTYPE::reference;
│ │ │ +
84 using ConstReference = typename PROPTYPE::const_reference;
│ │ │ +
85
│ │ │ +
86 private:
│ │ │ +
87 // Mesh properties (MPropHandleT<...>) are stored differently than the other properties.
│ │ │ +
88 // This class implements different behavior when initializing a property or when
│ │ │ +
89 // copying or swapping data from one property manager to a another one.
│ │ │ +
90 template <typename PropertyManager2, typename PropHandleT>
│ │ │ +
91 struct StorageT;
│ │ │ +
92
│ │ │ +
93 // specialization for Mesh Properties
│ │ │ +
94 template <typename PropertyManager2>
│ │ │ +
95 struct StorageT<PropertyManager2, MPropHandleT<Value>> {
│ │ │ +
96 static void initialize(PropertyManager<PROPTYPE, MeshT>& pm, const Value& initial_value ) {
│ │ │ +
97 pm() = initial_value;
│ │ │ +
98 }
│ │ │ +
99 static void copy(const PropertyManager<PROPTYPE, MeshT>& from, PropertyManager2& to) {
│ │ │ +
100 *to = *from;
│ │ │ +
101 }
│ │ │ +
102 static void swap(PropertyManager<PROPTYPE, MeshT>& from, PropertyManager2& to) {
│ │ │ +
103 std::swap(*to, *from);
│ │ │ +
104 }
│ │ │ +
105 static ConstReference access_property_const(PolyConnectivity& mesh, const PROPTYPE& prop_handle, const Handle&) {
│ │ │ +
106 return mesh.property(prop_handle);
│ │ │ +
107 }
│ │ │ +
108 static Reference access_property(PolyConnectivity& mesh, const PROPTYPE& prop_handle, const Handle&) {
│ │ │ +
109 return mesh.property(prop_handle);
│ │ │ +
110 }
│ │ │ +
111 };
│ │ │ +
112
│ │ │ +
113 // definition for other Mesh Properties
│ │ │ +
114 template <typename PropertyManager2, typename PropHandleT>
│ │ │ +
115 struct StorageT {
│ │ │ +
116 static void initialize(PropertyManager<PROPTYPE, MeshT>& pm, const Value& initial_value ) {
│ │ │ +
117 pm.set_range(pm.mesh_.template all_elements<Handle>(), initial_value);
│ │ │ +
118 }
│ │ │ +
119 static void copy(const PropertyManager& from, PropertyManager2& to) {
│ │ │ +
120 from.copy_to(from.mesh_.template all_elements<Handle>(), to, to.mesh_.template all_elements<Handle>());
│ │ │ +
121 }
│ │ │ +
122 static void swap(PropertyManager& lhs, PropertyManager2& rhs) {
│ │ │ +
123 std::swap(lhs.mesh().property(lhs.prop_).data_vector(), rhs.mesh().property(rhs.prop_).data_vector());
│ │ │ +
124 // resize the property to the correct size
│ │ │ +
125 lhs.mesh().property(lhs.prop_).resize(lhs.mesh().template n_elements<Handle>());
│ │ │ +
126 rhs.mesh().property(rhs.prop_).resize(rhs.mesh().template n_elements<Handle>());
│ │ │ +
127 }
│ │ │ +
128 static ConstReference access_property_const(PolyConnectivity& mesh, const PROPTYPE& prop_handle, const Handle& handle) {
│ │ │ +
129 return mesh.property(prop_handle, handle);
│ │ │ +
130 }
│ │ │ +
131 static Reference access_property(PolyConnectivity& mesh, const PROPTYPE& prop_handle, const Handle& handle) {
│ │ │ +
132 return mesh.property(prop_handle, handle);
│ │ │ +
133 }
│ │ │ +
134 };
│ │ │ +
135
│ │ │ +
136 using Storage = StorageT<Self, PROPTYPE>;
│ │ │ +
137
│ │ │ +
138 public:
│ │ │ +
139
│ │ │ +
159 OM_DEPRECATED("Use the constructor without parameter 'existing' instead. Check for existance with hasProperty") // As long as this overload exists, initial value must be first parameter due to ambiguity for properties of type bool
│ │ │ +
│ │ │ +
160 PropertyManager(PolyConnectivity& mesh, const char *propname, bool existing) : mesh_(mesh), retain_(existing), name_(propname) {
│ │ │ +
161 if (existing) {
│ │ │ +
162 if (!PropertyManager::mesh().get_property_handle(prop_, propname)) {
│ │ │ +
163 std::ostringstream oss;
│ │ │ +
164 oss << "Requested property handle \"" << propname << "\" does not exist.";
│ │ │ +
165 throw std::runtime_error(oss.str());
│ │ │ +
166 }
│ │ │ +
167 } else {
│ │ │ +
168 PropertyManager::mesh().add_property(prop_, propname);
│ │ │ +
169 }
│ │ │ +
170 }
│ │ │ +
│ │ │ +
171
│ │ │ +
│ │ │ +
180 PropertyManager(PolyConnectivity& mesh, const char *propname) : mesh_(mesh), retain_(true), name_(propname) {
│ │ │ +
181 if (!PropertyManager::mesh().get_property_handle(prop_, propname)) {
│ │ │ +
182 PropertyManager::mesh().add_property(prop_, propname);
│ │ │ +
183 }
│ │ │ +
184 }
│ │ │ +
│ │ │ +
185
│ │ │ +
│ │ │ +
196 PropertyManager(const Value& initial_value, PolyConnectivity& mesh, const char *propname) : mesh_(mesh), retain_(true), name_(propname) {
│ │ │ +
197 if (!mesh_.get_property_handle(prop_, propname)) {
│ │ │ +
198 PropertyManager::mesh().add_property(prop_, propname);
│ │ │ +
199 Storage::initialize(*this, initial_value);
│ │ │ +
200 }
│ │ │ +
201 }
│ │ │ +
│ │ │ +
202
│ │ │ +
│ │ │ +
210 explicit PropertyManager(const PolyConnectivity& mesh) : mesh_(mesh), retain_(false), name_("") {
│ │ │ +
211 PropertyManager::mesh().add_property(prop_, name_);
│ │ │ +
212 }
│ │ │ +
│ │ │ +
213
│ │ │ +
│ │ │ +
222 PropertyManager(const Value& initial_value, const PolyConnectivity& mesh) : mesh_(mesh), retain_(false), name_("") {
│ │ │ +
223 PropertyManager::mesh().add_property(prop_, name_);
│ │ │ +
224 Storage::initialize(*this, initial_value);
│ │ │ +
225 }
│ │ │ +
│ │ │ +
226
│ │ │ +
│ │ │ +
235 PropertyManager(PolyConnectivity& mesh, PROPTYPE property_handle) : mesh_(mesh), prop_(property_handle), retain_(true), name_() {
│ │ │ +
236 }
│ │ │ +
│ │ │ +
237
│ │ │ +
238 PropertyManager() = delete;
│ │ │ +
239
│ │ │ + │ │ │ +
241 :
│ │ │ +
242 mesh_(rhs.mesh_),
│ │ │ +
243 prop_(),
│ │ │ +
244 retain_(rhs.retain_),
│ │ │ +
245 name_(rhs.name_)
│ │ │ +
246 {
│ │ │ +
247 if (rhs.retain_) // named property -> create a property manager referring to the same
│ │ │ +
248 {
│ │ │ +
249 prop_ = rhs.prop_;
│ │ │ +
250 }
│ │ │ +
251 else // unnamed property -> create a property manager refering to a new property and copy the contents
│ │ │ +
252 {
│ │ │ +
253 PropertyManager::mesh().add_property(prop_, name_);
│ │ │ +
254 Storage::copy(rhs, *this);
│ │ │ +
255 }
│ │ │ +
256 }
│ │ │ +
257
│ │ │ +
258
│ │ │ +
│ │ │ + │ │ │ +
265 {
│ │ │ +
266 PropertyManager result(this->mesh());
│ │ │ +
267 Storage::copy(*this, result);
│ │ │ +
268 return result;
│ │ │ +
269 }
│ │ │ +
│ │ │ +
270
│ │ │ +
271 PropertyManager& operator=(const PropertyManager& rhs)
│ │ │ +
272 {
│ │ │ +
273 if (&mesh_ == &rhs.mesh_ && prop_ == rhs.prop_)
│ │ │ +
274 ; // nothing to do
│ │ │ +
275 else
│ │ │ +
276 Storage::copy(rhs, *this);
│ │ │ +
277 return *this;
│ │ │ +
278 }
│ │ │ +
279
│ │ │ +
280 ~PropertyManager() {
│ │ │ +
281 deleteProperty();
│ │ │ +
282 }
│ │ │ +
283
│ │ │ +
284 void swap(PropertyManager &rhs) {
│ │ │ +
285 // swap the data stored in the properties
│ │ │ +
286 Storage::swap(rhs, *this);
│ │ │ +
287 }
│ │ │ +
288
│ │ │ +
289 static bool propertyExists(const PolyConnectivity &mesh, const char *propname) {
│ │ │ +
290 PROPTYPE dummy;
│ │ │ +
291 return mesh.get_property_handle(dummy, propname);
│ │ │ +
292 }
│ │ │ +
293
│ │ │ +
294 bool isValid() const { return prop_.is_valid(); }
│ │ │ +
295 operator bool() const { return isValid(); }
│ │ │ +
296
│ │ │ +
297 const PROPTYPE &getRawProperty() const { return prop_; }
│ │ │ +
298
│ │ │ +
299 const std::string &getName() const { return name_; }
│ │ │ +
300
│ │ │ +
314 template <typename MeshType >
│ │ │ +
315 const MeshType& getMesh() const { return dynamic_cast<const MeshType&>(mesh_); }
│ │ │ +
316
│ │ │ +
317 const MeshT& getMesh() const { return dynamic_cast<const MeshT&>(mesh_); }
│ │ │ +
318
│ │ │ +
319
│ │ │ +
325 OM_DEPRECATED("retain no longer has any effect. Instead, named properties are always retained, while unnamed ones are not.")
│ │ │ +
326 void retain(bool = true) {}
│ │ │ +
327
│ │ │ +
331 PropertyManager(PropertyManager &&rhs)
│ │ │ +
332 :
│ │ │ +
333 mesh_(rhs.mesh_),
│ │ │ +
334 prop_(rhs.prop_),
│ │ │ +
335 retain_(rhs.retain_),
│ │ │ +
336 name_(rhs.name_)
│ │ │ +
337 {
│ │ │ +
338 if (!rhs.retain_)
│ │ │ +
339 rhs.prop_.invalidate(); // only invalidate unnamed properties
│ │ │ +
340 }
│ │ │ +
341
│ │ │ +
345 PropertyManager& operator=(PropertyManager&& rhs)
│ │ │ +
346 {
│ │ │ +
347 if ((&mesh_ != &rhs.mesh_) || (prop_ != rhs.prop_))
│ │ │ +
348 {
│ │ │ +
349 if (rhs.retain_)
│ │ │ +
350 {
│ │ │ +
351 // retained properties cannot be invalidated. Copy instead
│ │ │ +
352 Storage::copy(rhs, *this);
│ │ │ +
353 }
│ │ │ +
354 else
│ │ │ +
355 {
│ │ │ +
356 // swap the data stored in the properties
│ │ │ +
357 Storage::swap(rhs, *this);
│ │ │ +
358 // remove the property from rhs
│ │ │ +
359 rhs.mesh().remove_property(rhs.prop_);
│ │ │ +
360 // invalidate prop_
│ │ │ +
361 rhs.prop_.invalidate();
│ │ │ +
362 }
│ │ │ +
363 }
│ │ │ +
364 return *this;
│ │ │ +
365 }
│ │ │ +
366
│ │ │ +
374 static PropertyManager createIfNotExists(PolyConnectivity &mesh, const char *propname) {
│ │ │ +
375 return PropertyManager(mesh, propname);
│ │ │ +
376 }
│ │ │ +
377
│ │ │ +
387 template<typename PROP_VALUE, typename ITERATOR_TYPE>
│ │ │ +
388 static PropertyManager createIfNotExists(PolyConnectivity &mesh, const char *propname,
│ │ │ +
389 const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end,
│ │ │ +
390 const PROP_VALUE &init_value) {
│ │ │ +
391 const bool exists = propertyExists(mesh, propname);
│ │ │ +
392 PropertyManager pm(mesh, propname, exists);
│ │ │ +
393 pm.retain();
│ │ │ +
394 if (!exists)
│ │ │ +
395 pm.set_range(begin, end, init_value);
│ │ │ +
396 return std::move(pm);
│ │ │ +
397 }
│ │ │ +
398
│ │ │ +
408 template<typename PROP_VALUE, typename ITERATOR_RANGE>
│ │ │ +
409 static PropertyManager createIfNotExists(PolyConnectivity &mesh, const char *propname,
│ │ │ +
410 const ITERATOR_RANGE &range, const PROP_VALUE &init_value) {
│ │ │ +
411 return createIfNotExists(
│ │ │ +
412 mesh, propname, range.begin(), range.end(), init_value);
│ │ │ +
413 }
│ │ │ +
414
│ │ │ +
415
│ │ │ +
│ │ │ +
428 typename PROPTYPE::reference& operator*() {
│ │ │ +
429 return mesh().mproperty(prop_)[0];
│ │ │ +
430 }
│ │ │ +
│ │ │ +
431
│ │ │ +
│ │ │ +
444 typename PROPTYPE::const_reference& operator*() const {
│ │ │ +
445 return mesh().mproperty(prop_)[0];
│ │ │ +
446 }
│ │ │ +
│ │ │ +
447
│ │ │ +
│ │ │ +
455 inline typename PROPTYPE::reference operator[] (Handle handle) {
│ │ │ +
456 return mesh().property(prop_, handle);
│ │ │ +
457 }
│ │ │ +
│ │ │ +
458
│ │ │ +
│ │ │ +
466 inline typename PROPTYPE::const_reference operator[] (const Handle& handle) const {
│ │ │ +
467 return mesh().property(prop_, handle);
│ │ │ +
468 }
│ │ │ +
│ │ │ +
469
│ │ │ +
│ │ │ +
477 inline typename PROPTYPE::reference operator() (const Handle& handle = Handle()) {
│ │ │ +
478// return mesh().property(prop_, handle);
│ │ │ +
479 return Storage::access_property(mesh(), prop_, handle);
│ │ │ +
480 }
│ │ │ +
│ │ │ +
481
│ │ │ +
│ │ │ +
489 inline typename PROPTYPE::const_reference operator() (const Handle& handle = Handle()) const {
│ │ │ +
490// return mesh().property(prop_, handle);
│ │ │ +
491 return Storage::access_property_const(mesh(), prop_, handle);
│ │ │ +
492 }
│ │ │ +
│ │ │ +
493
│ │ │ +
518 template<typename HandleTypeIterator, typename PROP_VALUE>
│ │ │ +
│ │ │ +
519 void set_range(HandleTypeIterator begin, HandleTypeIterator end,
│ │ │ +
520 const PROP_VALUE &value) {
│ │ │ +
521 for (; begin != end; ++begin)
│ │ │ +
522 (*this)[*begin] = value;
│ │ │ +
523 }
│ │ │ +
│ │ │ +
524
│ │ │ +
525#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
│ │ │ +
526 template<typename HandleTypeIteratorRange, typename PROP_VALUE>
│ │ │ +
527 void set_range(const HandleTypeIteratorRange &range,
│ │ │ +
528 const PROP_VALUE &value) {
│ │ │ +
529 set_range(range.begin(), range.end(), value);
│ │ │ +
530 }
│ │ │ +
531#endif
│ │ │ +
532
│ │ │ +
547 template<typename HandleTypeIterator, typename PropertyManager2,
│ │ │ +
548 typename HandleTypeIterator2>
│ │ │ +
│ │ │ +
549 void copy_to(HandleTypeIterator begin, HandleTypeIterator end,
│ │ │ +
550 PropertyManager2 &dst_propmanager,
│ │ │ +
551 HandleTypeIterator2 dst_begin, HandleTypeIterator2 dst_end) const {
│ │ │ +
552
│ │ │ +
553 for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) {
│ │ │ +
554 dst_propmanager[*dst_begin] = (*this)[*begin];
│ │ │ +
555 }
│ │ │ +
556 }
│ │ │ +
│ │ │ +
557
│ │ │ +
558 template<typename RangeType, typename PropertyManager2,
│ │ │ +
559 typename RangeType2>
│ │ │ +
560 void copy_to(const RangeType &range,
│ │ │ +
561 PropertyManager2 &dst_propmanager,
│ │ │ +
562 const RangeType2 &dst_range) const {
│ │ │ +
563 copy_to(range.begin(), range.end(), dst_propmanager,
│ │ │ +
564 dst_range.begin(), dst_range.end());
│ │ │ +
565 }
│ │ │ +
566
│ │ │ +
567
│ │ │ +
582 template<typename RangeType, typename RangeType2>
│ │ │ +
│ │ │ +
583 static void copy(const char *prop_name,
│ │ │ +
584 PolyConnectivity &src_mesh, const RangeType &src_range,
│ │ │ +
585 PolyConnectivity &dst_mesh, const RangeType2 &dst_range) {
│ │ │ +
586
│ │ │ + │ │ │ +
588 DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name));
│ │ │ +
589
│ │ │ + │ │ │ +
591 SrcPM src(src_mesh, prop_name, true);
│ │ │ +
592
│ │ │ +
593 src.copy_to(src_range, dst, dst_range);
│ │ │ +
594 }
│ │ │ +
│ │ │ +
595
│ │ │ +
│ │ │ +
602 void set_persistent(bool _persistence = true)
│ │ │ +
603 {
│ │ │ +
604 mesh().property(getRawProperty()).set_persistent(_persistence);
│ │ │ +
605 }
│ │ │ +
│ │ │ +
606
│ │ │ +
607 private:
│ │ │ +
608 void deleteProperty() {
│ │ │ +
609 if (!retain_ && prop_.is_valid())
│ │ │ +
610 mesh().remove_property(prop_);
│ │ │ +
611 }
│ │ │ +
612
│ │ │ +
613 PolyConnectivity& mesh() const
│ │ │ +
614 {
│ │ │ +
615 return const_cast<PolyConnectivity&>(mesh_);
│ │ │ +
616 }
│ │ │ +
617
│ │ │ +
618 private:
│ │ │ +
619 const PolyConnectivity& mesh_;
│ │ │ +
620 PROPTYPE prop_;
│ │ │ +
621 bool retain_;
│ │ │ +
622 std::string name_;
│ │ │ +
623};
│ │ │ +
│ │ │ +
624
│ │ │ +
625template <typename PropertyT>
│ │ │ +
│ │ │ + │ │ │ +
627{
│ │ │ +
628public:
│ │ │ +
629 using Value = typename PropertyT::Value;
│ │ │ +
630 using value_type = typename PropertyT::value_type;
│ │ │ +
631 using Handle = typename PropertyT::Handle;
│ │ │ +
632
│ │ │ +
633 ConstPropertyViewer(const PolyConnectivity& mesh, const PropertyT& property_handle)
│ │ │ +
634 :
│ │ │ +
635 mesh_(mesh),
│ │ │ +
636 prop_(property_handle)
│ │ │ +
637 {}
│ │ │ +
638
│ │ │ +
639 inline const typename PropertyT::const_reference operator() (const Handle& handle)
│ │ │ +
640 {
│ │ │ +
641 return mesh_.property(prop_, handle);
│ │ │ +
642 }
│ │ │ +
643
│ │ │ +
644 inline const typename PropertyT::const_reference operator[] (const Handle& handle)
│ │ │ +
645 {
│ │ │ +
646 return mesh_.property(prop_, handle);
│ │ │ +
647 }
│ │ │ +
648
│ │ │ +
649private:
│ │ │ +
650 const PolyConnectivity& mesh_;
│ │ │ +
651 PropertyT prop_;
│ │ │ +
652};
│ │ │ +
│ │ │ +
653
│ │ │ +
681template<typename ElementT, typename T>
│ │ │ + │ │ │ +
683OM_DEPRECATED("Named temporary properties are deprecated. Either create a temporary without name or a non-temporary with name")
│ │ │ +
│ │ │ +
684makeTemporaryProperty(PolyConnectivity &mesh, const char *propname) {
│ │ │ + │ │ │ +
686}
│ │ │ +
│ │ │ +
687
│ │ │ +
712template<typename ElementT, typename T>
│ │ │ + │ │ │ +
│ │ │ + │ │ │ + │ │ │ +
716}
│ │ │ +
│ │ │ +
717
│ │ │ +
718
│ │ │ +
740template<typename ElementT, typename T>
│ │ │ +
741bool
│ │ │ +
│ │ │ +
742hasProperty(const PolyConnectivity &mesh, const char *propname) {
│ │ │ + │ │ │ +
744 return mesh.get_property_handle(ph, propname);
│ │ │ +
745}
│ │ │ +
│ │ │ +
746
│ │ │ +
774template<typename ElementT, typename T>
│ │ │ + │ │ │ +
│ │ │ +
776getProperty(PolyConnectivity &mesh, const char *propname) {
│ │ │ +
777 if (!hasProperty<ElementT, T>(mesh, propname))
│ │ │ +
778 {
│ │ │ +
779 std::ostringstream oss;
│ │ │ +
780 oss << "Requested property handle \"" << propname << "\" does not exist.";
│ │ │ +
781 throw std::runtime_error(oss.str());
│ │ │ +
782 }
│ │ │ + │ │ │ +
784}
│ │ │ +
│ │ │ +
785
│ │ │ +
815template<typename ElementT, typename T>
│ │ │ + │ │ │ +
│ │ │ +
817getOrMakeProperty(PolyConnectivity &mesh, const char *propname) {
│ │ │ +
818 return PropertyManager<typename HandleToPropHandle<ElementT, T>::type>::createIfNotExists(mesh, propname);
│ │ │ +
819}
│ │ │ +
│ │ │ +
820
│ │ │ +
830template<typename PROPTYPE>
│ │ │ +
831OM_DEPRECATED("Use makeTemporaryProperty instead.")
│ │ │ +
│ │ │ +
832PropertyManager<PROPTYPE> makePropertyManagerFromNew(PolyConnectivity &mesh, const char *propname)
│ │ │ +
833{
│ │ │ +
834 return PropertyManager<PROPTYPE>(mesh, propname, false);
│ │ │ +
835}
│ │ │ +
│ │ │ +
836
│ │ │ +
849template<typename PROPTYPE, typename MeshT = int>
│ │ │ +
850OM_DEPRECATED("Use getProperty instead.")
│ │ │ +
│ │ │ +
851PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExisting(PolyConnectivity &mesh, const char *propname)
│ │ │ +
852{
│ │ │ +
853 return PropertyManager<PROPTYPE, MeshT>(mesh, propname, true);
│ │ │ +
854}
│ │ │ +
│ │ │ +
855
│ │ │ +
864template<typename PROPTYPE, typename MeshT = int>
│ │ │ +
865OM_DEPRECATED("Use getOrMakeProperty instead.")
│ │ │ +
│ │ │ +
866PropertyManager<PROPTYPE, MeshT> makePropertyManagerFromExistingOrNew(PolyConnectivity &mesh, const char *propname)
│ │ │ +
867{
│ │ │ + │ │ │ +
869}
│ │ │ +
│ │ │ +
870
│ │ │ +
882template<typename PROPTYPE,
│ │ │ +
883 typename ITERATOR_TYPE, typename PROP_VALUE>
│ │ │ +
884OM_DEPRECATED("Use getOrMakeProperty instead.")
│ │ │ +
│ │ │ +
885PropertyManager<PROPTYPE> makePropertyManagerFromExistingOrNew(
│ │ │ +
886 PolyConnectivity &mesh, const char *propname,
│ │ │ +
887 const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end,
│ │ │ +
888 const PROP_VALUE &init_value) {
│ │ │ + │ │ │ +
890 mesh, propname, begin, end, init_value);
│ │ │ +
891}
│ │ │ +
│ │ │ +
892
│ │ │ +
904template<typename PROPTYPE,
│ │ │ +
905 typename ITERATOR_RANGE, typename PROP_VALUE>
│ │ │ +
906OM_DEPRECATED("Use getOrMakeProperty instead.")
│ │ │ +
│ │ │ +
907PropertyManager<PROPTYPE> makePropertyManagerFromExistingOrNew(
│ │ │ +
908 PolyConnectivity &mesh, const char *propname,
│ │ │ +
909 const ITERATOR_RANGE &range,
│ │ │ +
910 const PROP_VALUE &init_value) {
│ │ │ +
911 return makePropertyManagerFromExistingOrNew<PROPTYPE>(
│ │ │ +
912 mesh, propname, range.begin(), range.end(), init_value);
│ │ │ +
913}
│ │ │ +
│ │ │ +
914
│ │ │ +
915
│ │ │ +
919template<typename MeshT>
│ │ │ + │ │ │ +
│ │ │ +
921getPointsProperty(MeshT &mesh) {
│ │ │ +
922 return PropertyManager<OpenMesh::VPropHandleT<typename MeshT::Point>>(mesh, mesh.points_property_handle());
│ │ │ +
923}
│ │ │ +
│ │ │ +
924
│ │ │ +
928template<typename MeshT>
│ │ │ + │ │ │ +
│ │ │ +
930getPointsProperty(const MeshT &mesh) {
│ │ │ + │ │ │ +
932 return ConstPropertyViewer<PropType>(mesh, mesh.points_property_handle());
│ │ │ +
933}
│ │ │ +
│ │ │ +
934
│ │ │ +
935template <typename HandleT, typename T>
│ │ │ + │ │ │ +
937
│ │ │ +
938template <typename T>
│ │ │ + │ │ │ +
940
│ │ │ +
941template <typename T>
│ │ │ + │ │ │ +
943
│ │ │ +
944template <typename T>
│ │ │ + │ │ │ +
946
│ │ │ +
947template <typename T>
│ │ │ + │ │ │ +
949
│ │ │ +
950template <typename T>
│ │ │ + │ │ │ +
952
│ │ │ +
953
│ │ │ +
954} /* namespace OpenMesh */
│ │ │ +
955#endif /* PROPERTYMANAGER_HH_ */
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
void remove_property(VPropHandleT< T > &_ph)
You should not use this function directly.
Definition BaseKernel.hh:194
│ │ │ +
PropertyT< T > & property(VPropHandleT< T > _ph)
In most cases you should use the convenient PropertyManager wrapper and use of this function should n...
Definition BaseKernel.hh:310
│ │ │ +
bool get_property_handle(VPropHandleT< T > &_ph, const std::string &_name) const
You should not use this function directly.
Definition BaseKernel.hh:254
│ │ │ +
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ +
Definition HandleToPropHandle.hh:10
│ │ │ +
Default property class for any type T.
Definition Property.hh:93
│ │ │ +
Handle representing a vertex property.
Definition Property.hh:417
│ │ │ +
Handle representing a mesh property.
Definition Property.hh:477
│ │ │ +
This class is intended to manage the lifecycle of properties.
Definition PropertyManager.hh:76
│ │ │ +
static void copy(const char *prop_name, PolyConnectivity &src_mesh, const RangeType &src_range, PolyConnectivity &dst_mesh, const RangeType2 &dst_range)
Copy the values of a property from a source range to a target range.
Definition PropertyManager.hh:583
│ │ │ +
void set_range(HandleTypeIterator begin, HandleTypeIterator end, const PROP_VALUE &value)
Conveniently set the property for an entire range of values.
Definition PropertyManager.hh:519
│ │ │ +
PropertyManager(const Value &initial_value, PolyConnectivity &mesh, const char *propname)
Constructor.
Definition PropertyManager.hh:196
│ │ │ +
ConstPropertyViewer< OpenMesh::VPropHandleT< typename MeshT::Point > > getPointsProperty(const MeshT &mesh)
Returns a convenience wrapper around the points property of a mesh that only allows const access.
Definition PropertyManager.hh:930
│ │ │ +
PropertyManager(PolyConnectivity &mesh, const char *propname, bool existing)
Definition PropertyManager.hh:160
│ │ │ +
PropertyManager< typename HandleToPropHandle< ElementT, T >::type > makeTemporaryProperty(PolyConnectivity &mesh)
Creates a new property whose lifetime is limited to the current scope.
Definition PropertyManager.hh:714
│ │ │ +
PROPTYPE::reference operator[](Handle handle)
Enables convenient access to the encapsulated property.
Definition PropertyManager.hh:455
│ │ │ +
bool hasProperty(const PolyConnectivity &mesh, const char *propname)
Tests whether a property with the given element type, value type, and name is present on the given me...
Definition PropertyManager.hh:742
│ │ │ +
void copy_to(HandleTypeIterator begin, HandleTypeIterator end, PropertyManager2 &dst_propmanager, HandleTypeIterator2 dst_begin, HandleTypeIterator2 dst_end) const
Conveniently transfer the values managed by one property manager onto the values managed by a differe...
Definition PropertyManager.hh:549
│ │ │ +
PROPTYPE::reference & operator*()
Get the mesh corresponding to the property.
Definition PropertyManager.hh:428
│ │ │ +
PropertyManager< OpenMesh::VPropHandleT< typename MeshT::Point > > getPointsProperty(MeshT &mesh)
Returns a convenience wrapper around the points property of a mesh.
Definition PropertyManager.hh:921
│ │ │ +
void set_persistent(bool _persistence=true)
Mark whether this property should be stored when mesh is written to a file.
Definition PropertyManager.hh:602
│ │ │ +
PropertyManager(const PolyConnectivity &mesh)
Constructor.
Definition PropertyManager.hh:210
│ │ │ +
PropertyManager(const Value &initial_value, const PolyConnectivity &mesh)
Constructor.
Definition PropertyManager.hh:222
│ │ │ +
PropertyManager< typename HandleToPropHandle< ElementT, T >::type > getProperty(PolyConnectivity &mesh, const char *propname)
Obtains a handle to a named property.
Definition PropertyManager.hh:776
│ │ │ +
PropertyManager clone()
Create property manager referring to a copy of the current property.
Definition PropertyManager.hh:264
│ │ │ +
PropertyManager(PolyConnectivity &mesh, PROPTYPE property_handle)
Constructor.
Definition PropertyManager.hh:235
│ │ │ +
PROPTYPE::reference operator()(const Handle &handle=Handle())
Enables convenient access to the encapsulated property.
Definition PropertyManager.hh:477
│ │ │ +
PropertyManager< typename HandleToPropHandle< ElementT, T >::type > getOrMakeProperty(PolyConnectivity &mesh, const char *propname)
Obtains a handle to a named property if it exists or creates a new one otherwise.
Definition PropertyManager.hh:817
│ │ │ +
PROPTYPE::const_reference & operator*() const
Access the value of the encapsulated mesh property.
Definition PropertyManager.hh:444
│ │ │ +
PropertyManager(PolyConnectivity &mesh, const char *propname)
Constructor.
Definition PropertyManager.hh:180
│ │ │ +
Definition PropertyManager.hh:627
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -ArrayItems.hh │ │ │ │ +PropertyManager.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,107 +45,676 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ -44#ifndef OPENMESH_ARRAY_ITEMS_HH │ │ │ │ -45#define OPENMESH_ARRAY_ITEMS_HH │ │ │ │ -46 │ │ │ │ -47 │ │ │ │ -48//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -49 │ │ │ │ -50 │ │ │ │ -51#include │ │ │ │ -52#include │ │ │ │ -53#include │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -57 │ │ │ │ -58namespace _O_p_e_n_M_e_s_h { │ │ │ │ -59 │ │ │ │ -60 │ │ │ │ -61//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -62 │ │ │ │ -63 │ │ │ │ -65struct ArrayItems │ │ │ │ -66{ │ │ │ │ -67 │ │ │ │ -68 //------------------------------------------------------ internal vertex │ │ │ │ -type │ │ │ │ -69 │ │ │ │ -71 class Vertex │ │ │ │ -72 { │ │ │ │ -73 friend class ArrayKernel; │ │ │ │ -74 HalfedgeHandle halfedge_handle_; │ │ │ │ -75 }; │ │ │ │ -76 │ │ │ │ +42#ifndef PROPERTYMANAGER_HH_ │ │ │ │ +43#define PROPERTYMANAGER_HH_ │ │ │ │ +44 │ │ │ │ +45#include │ │ │ │ +46#include │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50#include │ │ │ │ +51 │ │ │ │ +52namespace _O_p_e_n_M_e_s_h { │ │ │ │ +53 │ │ │ │ +75template │ │ │ │ +_7_6class _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r { │ │ │ │ 77 │ │ │ │ -78 //---------------------------------------------------- internal halfedge │ │ │ │ -type │ │ │ │ -79 │ │ │ │ -80#ifndef DOXY_IGNORE_THIS │ │ │ │ -81 class Halfedge_without_prev │ │ │ │ -82 { │ │ │ │ -83 friend class ArrayKernel; │ │ │ │ -84 FaceHandle face_handle_; │ │ │ │ -85 VertexHandle vertex_handle_; │ │ │ │ -86 HalfedgeHandle next_halfedge_handle_; │ │ │ │ -87 }; │ │ │ │ -88#endif │ │ │ │ -89 │ │ │ │ -90#ifndef DOXY_IGNORE_THIS │ │ │ │ -91 class Halfedge_with_prev : public Halfedge_without_prev │ │ │ │ -92 { │ │ │ │ -93 friend class ArrayKernel; │ │ │ │ -94 HalfedgeHandle prev_halfedge_handle_; │ │ │ │ -95 }; │ │ │ │ -96#endif │ │ │ │ -97 │ │ │ │ -98 //TODO: should be selected with config.h define │ │ │ │ -99 typedef Halfedge_with_prev Halfedge; │ │ │ │ -100 typedef Halfedge_without_prev HalfedgeNoPrev; │ │ │ │ -101 typedef GenProg::Bool2Type HasPrevHalfedge; │ │ │ │ -102 │ │ │ │ -103 //-------------------------------------------------------- internal edge │ │ │ │ -type │ │ │ │ -104#ifndef DOXY_IGNORE_THIS │ │ │ │ -105 class Edge │ │ │ │ -106 { │ │ │ │ -107 friend class ArrayKernel; │ │ │ │ -108 Halfedge halfedges_[2]; │ │ │ │ -109 }; │ │ │ │ -110#endif │ │ │ │ -111 │ │ │ │ -112 //-------------------------------------------------------- internal face │ │ │ │ -type │ │ │ │ -113#ifndef DOXY_IGNORE_THIS │ │ │ │ -114 class Face │ │ │ │ -115 { │ │ │ │ -116 friend class ArrayKernel; │ │ │ │ -117 HalfedgeHandle halfedge_handle_; │ │ │ │ -118 }; │ │ │ │ -119}; │ │ │ │ -120#endif │ │ │ │ -121 │ │ │ │ -122// │ │ │ │ -============================================================================= │ │ │ │ -123} // namespace OpenMesh │ │ │ │ -124// │ │ │ │ -============================================================================= │ │ │ │ -125#endif // OPENMESH_ITEMS_HH defined │ │ │ │ -126// │ │ │ │ -============================================================================= │ │ │ │ +78 public: │ │ │ │ +79 using Value = typename PROPTYPE::Value; │ │ │ │ +80 using value_type = typename PROPTYPE::value_type; │ │ │ │ +81 using Handle = typename PROPTYPE::Handle; │ │ │ │ +82 using _S_e_l_f = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>; │ │ │ │ +83 using Reference = typename PROPTYPE::reference; │ │ │ │ +84 using ConstReference = typename PROPTYPE::const_reference; │ │ │ │ +85 │ │ │ │ +86 private: │ │ │ │ +87 // Mesh properties (MPropHandleT<...>) are stored differently than the other │ │ │ │ +properties. │ │ │ │ +88 // This class implements different behavior when initializing a property or │ │ │ │ +when │ │ │ │ +89 // copying or swapping data from one property manager to a another one. │ │ │ │ +90 template │ │ │ │ +91 struct StorageT; │ │ │ │ +92 │ │ │ │ +93 // specialization for Mesh Properties │ │ │ │ +94 template │ │ │ │ +95 struct StorageT> { │ │ │ │ +96 static void initialize(_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>& pm, const Value& │ │ │ │ +initial_value ) { │ │ │ │ +97 pm() = initial_value; │ │ │ │ +98 } │ │ │ │ +99 static void copy(const _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>& from, │ │ │ │ +PropertyManager2& to) { │ │ │ │ +100 *to = *from; │ │ │ │ +101 } │ │ │ │ +102 static void swap(_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>& from, PropertyManager2& │ │ │ │ +to) { │ │ │ │ +103 std::swap(*to, *from); │ │ │ │ +104 } │ │ │ │ +105 static ConstReference access_property_const(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const │ │ │ │ +PROPTYPE& prop_handle, const Handle&) { │ │ │ │ +106 return mesh._p_r_o_p_e_r_t_y(prop_handle); │ │ │ │ +107 } │ │ │ │ +108 static Reference access_property(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const PROPTYPE& │ │ │ │ +prop_handle, const Handle&) { │ │ │ │ +109 return mesh._p_r_o_p_e_r_t_y(prop_handle); │ │ │ │ +110 } │ │ │ │ +111 }; │ │ │ │ +112 │ │ │ │ +113 // definition for other Mesh Properties │ │ │ │ +114 template │ │ │ │ +115 struct StorageT { │ │ │ │ +116 static void initialize(_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>& pm, const Value& │ │ │ │ +initial_value ) { │ │ │ │ +117 pm._s_e_t___r_a_n_g_e(pm.mesh_.template all_elements(), initial_value); │ │ │ │ +118 } │ │ │ │ +119 static void copy(const _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r& from, PropertyManager2& to) { │ │ │ │ +120 from._c_o_p_y___t_o(from.mesh_.template all_elements(), to, │ │ │ │ +to.mesh_.template all_elements()); │ │ │ │ +121 } │ │ │ │ +122 static void swap(_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r& lhs, PropertyManager2& rhs) { │ │ │ │ +123 std::swap(lhs.mesh()._p_r_o_p_e_r_t_y(lhs.prop_).data_vector(), rhs.mesh().property │ │ │ │ +(rhs.prop_).data_vector()); │ │ │ │ +124 // resize the property to the correct size │ │ │ │ +125 lhs.mesh()._p_r_o_p_e_r_t_y(lhs.prop_).resize(lhs.mesh().template │ │ │ │ +n_elements()); │ │ │ │ +126 rhs.mesh().property(rhs.prop_).resize(rhs.mesh().template │ │ │ │ +n_elements()); │ │ │ │ +127 } │ │ │ │ +128 static ConstReference access_property_const(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const │ │ │ │ +PROPTYPE& prop_handle, const Handle& handle) { │ │ │ │ +129 return mesh._p_r_o_p_e_r_t_y(prop_handle, handle); │ │ │ │ +130 } │ │ │ │ +131 static Reference access_property(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const PROPTYPE& │ │ │ │ +prop_handle, const Handle& handle) { │ │ │ │ +132 return mesh._p_r_o_p_e_r_t_y(prop_handle, handle); │ │ │ │ +133 } │ │ │ │ +134 }; │ │ │ │ +135 │ │ │ │ +136 using Storage = StorageT; │ │ │ │ +137 │ │ │ │ +138 public: │ │ │ │ +139 │ │ │ │ +159 OM_DEPRECATED("Use the constructor without parameter 'existing' instead. │ │ │ │ +Check for existance with hasProperty") // As long as this overload exists, │ │ │ │ +initial value must be first parameter due to ambiguity for properties of type │ │ │ │ +bool │ │ │ │ +_1_6_0 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const char *propname, bool │ │ │ │ +existing) : mesh_(mesh), retain_(existing), name_(propname) { │ │ │ │ +161 if (existing) { │ │ │ │ +162 if (!PropertyManager::mesh().get_property_handle(prop_, propname)) { │ │ │ │ +163 std::ostringstream oss; │ │ │ │ +164 oss << "Requested property handle \"" << propname << "\" does not exist."; │ │ │ │ +165 throw std::runtime_error(oss.str()); │ │ │ │ +166 } │ │ │ │ +167 } else { │ │ │ │ +168 PropertyManager::mesh().add_property(prop_, propname); │ │ │ │ +169 } │ │ │ │ +170 } │ │ │ │ +171 │ │ │ │ +_1_8_0 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const char *propname) : mesh_ │ │ │ │ +(mesh), retain_(true), name_(propname) { │ │ │ │ +181 if (!PropertyManager::mesh().get_property_handle(prop_, propname)) { │ │ │ │ +182 PropertyManager::mesh().add_property(prop_, propname); │ │ │ │ +183 } │ │ │ │ +184 } │ │ │ │ +185 │ │ │ │ +_1_9_6 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(const Value& initial_value, _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const │ │ │ │ +char *propname) : mesh_(mesh), retain_(true), name_(propname) { │ │ │ │ +197 if (!mesh_._g_e_t___p_r_o_p_e_r_t_y___h_a_n_d_l_e(prop_, propname)) { │ │ │ │ +198 PropertyManager::mesh().add_property(prop_, propname); │ │ │ │ +199 Storage::initialize(*this, initial_value); │ │ │ │ +200 } │ │ │ │ +201 } │ │ │ │ +202 │ │ │ │ +_2_1_0 explicit _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh) : mesh_(mesh), │ │ │ │ +retain_(false), name_("") { │ │ │ │ +211 PropertyManager::mesh().add_property(prop_, name_); │ │ │ │ +212 } │ │ │ │ +213 │ │ │ │ +_2_2_2 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(const Value& initial_value, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh) : │ │ │ │ +mesh_(mesh), retain_(false), name_("") { │ │ │ │ +223 PropertyManager::mesh().add_property(prop_, name_); │ │ │ │ +224 Storage::initialize(*this, initial_value); │ │ │ │ +225 } │ │ │ │ +226 │ │ │ │ +_2_3_5 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, PROPTYPE property_handle) : mesh_ │ │ │ │ +(mesh), prop_(property_handle), retain_(true), name_() { │ │ │ │ +236 } │ │ │ │ +237 │ │ │ │ +238 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r() = delete; │ │ │ │ +239 │ │ │ │ +240 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(const _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r& rhs) │ │ │ │ +241 : │ │ │ │ +242 mesh_(rhs.mesh_), │ │ │ │ +243 prop_(), │ │ │ │ +244 retain_(rhs.retain_), │ │ │ │ +245 name_(rhs.name_) │ │ │ │ +246 { │ │ │ │ +247 if (rhs.retain_) // named property -> create a property manager referring │ │ │ │ +to the same │ │ │ │ +248 { │ │ │ │ +249 prop_ = rhs.prop_; │ │ │ │ +250 } │ │ │ │ +251 else // unnamed property -> create a property manager refering to a new │ │ │ │ +property and copy the contents │ │ │ │ +252 { │ │ │ │ +253 PropertyManager::mesh().add_property(prop_, name_); │ │ │ │ +254 Storage::copy(rhs, *this); │ │ │ │ +255 } │ │ │ │ +256 } │ │ │ │ +257 │ │ │ │ +258 │ │ │ │ +_2_6_4 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r _c_l_o_n_e() │ │ │ │ +265 { │ │ │ │ +266 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r result(this->mesh()); │ │ │ │ +267 Storage::copy(*this, result); │ │ │ │ +268 return result; │ │ │ │ +269 } │ │ │ │ +270 │ │ │ │ +271 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r& operator=(const _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r& rhs) │ │ │ │ +272 { │ │ │ │ +273 if (&mesh_ == &rhs.mesh_ && prop_ == rhs.prop_) │ │ │ │ +274 ; // nothing to do │ │ │ │ +275 else │ │ │ │ +276 Storage::copy(rhs, *this); │ │ │ │ +277 return *this; │ │ │ │ +278 } │ │ │ │ +279 │ │ │ │ +280 ~PropertyManager() { │ │ │ │ +281 deleteProperty(); │ │ │ │ +282 } │ │ │ │ +283 │ │ │ │ +284 void swap(PropertyManager &rhs) { │ │ │ │ +285 // swap the data stored in the properties │ │ │ │ +286 Storage::swap(rhs, *this); │ │ │ │ +287 } │ │ │ │ +288 │ │ │ │ +289 static bool propertyExists(const PolyConnectivity &mesh, const char │ │ │ │ +*propname) { │ │ │ │ +290 PROPTYPE dummy; │ │ │ │ +291 return mesh.get_property_handle(dummy, propname); │ │ │ │ +292 } │ │ │ │ +293 │ │ │ │ +294 bool isValid() const { return prop_.is_valid(); } │ │ │ │ +295 operator bool() const { return isValid(); } │ │ │ │ +296 │ │ │ │ +297 const PROPTYPE &getRawProperty() const { return prop_; } │ │ │ │ +298 │ │ │ │ +299 const std::string &getName() const { return name_; } │ │ │ │ +300 │ │ │ │ +314 template │ │ │ │ +315 const MeshType& getMesh() const { return dynamic_cast │ │ │ │ +(mesh_); } │ │ │ │ +316 │ │ │ │ +317 const MeshT& getMesh() const { return dynamic_cast(mesh_); } │ │ │ │ +318 │ │ │ │ +319 │ │ │ │ +325 OM_DEPRECATED("retain no longer has any effect. Instead, named properties │ │ │ │ +are always retained, while unnamed ones are not.") │ │ │ │ +326 void retain(bool = true) {} │ │ │ │ +327 │ │ │ │ +331 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(PropertyManager &&rhs) │ │ │ │ +332 : │ │ │ │ +333 mesh_(rhs.mesh_), │ │ │ │ +334 prop_(rhs.prop_), │ │ │ │ +335 retain_(rhs.retain_), │ │ │ │ +336 name_(rhs.name_) │ │ │ │ +337 { │ │ │ │ +338 if (!rhs.retain_) │ │ │ │ +339 rhs.prop_.invalidate(); // only invalidate unnamed properties │ │ │ │ +340 } │ │ │ │ +341 │ │ │ │ +345 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r& operator=(PropertyManager&& rhs) │ │ │ │ +346 { │ │ │ │ +347 if ((&mesh_ != &rhs.mesh_) || (prop_ != rhs.prop_)) │ │ │ │ +348 { │ │ │ │ +349 if (rhs.retain_) │ │ │ │ +350 { │ │ │ │ +351 // retained properties cannot be invalidated. Copy instead │ │ │ │ +352 Storage::copy(rhs, *this); │ │ │ │ +353 } │ │ │ │ +354 else │ │ │ │ +355 { │ │ │ │ +356 // swap the data stored in the properties │ │ │ │ +357 Storage::swap(rhs, *this); │ │ │ │ +358 // remove the property from rhs │ │ │ │ +359 rhs.mesh()._r_e_m_o_v_e___p_r_o_p_e_r_t_y(rhs.prop_); │ │ │ │ +360 // invalidate prop_ │ │ │ │ +361 rhs.prop_.invalidate(); │ │ │ │ +362 } │ │ │ │ +363 } │ │ │ │ +364 return *this; │ │ │ │ +365 } │ │ │ │ +366 │ │ │ │ +374 static _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r createIfNotExists(PolyConnectivity &mesh, const char │ │ │ │ +*propname) { │ │ │ │ +375 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r(mesh, propname); │ │ │ │ +376 } │ │ │ │ +377 │ │ │ │ +387 template │ │ │ │ +388 static _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r createIfNotExists(PolyConnectivity &mesh, const char │ │ │ │ +*propname, │ │ │ │ +389 const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, │ │ │ │ +390 const PROP_VALUE &init_value) { │ │ │ │ +391 const bool exists = propertyExists(mesh, propname); │ │ │ │ +392 _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r pm(mesh, propname, exists); │ │ │ │ +393 pm.retain(); │ │ │ │ +394 if (!exists) │ │ │ │ +395 pm.set_range(begin, end, init_value); │ │ │ │ +396 return std::move(pm); │ │ │ │ +397 } │ │ │ │ +398 │ │ │ │ +408 template │ │ │ │ +409 static _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r createIfNotExists(PolyConnectivity &mesh, const char │ │ │ │ +*propname, │ │ │ │ +410 const ITERATOR_RANGE &range, const PROP_VALUE &init_value) { │ │ │ │ +411 return createIfNotExists( │ │ │ │ +412 mesh, propname, range.begin(), range.end(), init_value); │ │ │ │ +413 } │ │ │ │ +414 │ │ │ │ +415 │ │ │ │ +_4_2_8 typename PROPTYPE::reference& _o_p_e_r_a_t_o_r_*() { │ │ │ │ +429 return mesh().mproperty(prop_)[0]; │ │ │ │ +430 } │ │ │ │ +431 │ │ │ │ +_4_4_4 typename PROPTYPE::const_reference& _o_p_e_r_a_t_o_r_*() const { │ │ │ │ +445 return mesh().mproperty(prop_)[0]; │ │ │ │ +446 } │ │ │ │ +447 │ │ │ │ +_4_5_5 inline typename PROPTYPE::reference _o_p_e_r_a_t_o_r_[_]_ (Handle handle) { │ │ │ │ +456 return mesh().property(prop_, handle); │ │ │ │ +457 } │ │ │ │ +458 │ │ │ │ +_4_6_6 inline typename PROPTYPE::const_reference _o_p_e_r_a_t_o_r_[_]_ (const Handle& handle) │ │ │ │ +const { │ │ │ │ +467 return mesh().property(prop_, handle); │ │ │ │ +468 } │ │ │ │ +469 │ │ │ │ +_4_7_7 inline typename PROPTYPE::reference _o_p_e_r_a_t_o_r_(_)_ (const Handle& handle = │ │ │ │ +Handle()) { │ │ │ │ +478// return mesh().property(prop_, handle); │ │ │ │ +479 return Storage::access_property(mesh(), prop_, handle); │ │ │ │ +480 } │ │ │ │ +481 │ │ │ │ +_4_8_9 inline typename PROPTYPE::const_reference _o_p_e_r_a_t_o_r_(_)_ (const Handle& handle │ │ │ │ += Handle()) const { │ │ │ │ +490// return mesh().property(prop_, handle); │ │ │ │ +491 return Storage::access_property_const(mesh(), prop_, handle); │ │ │ │ +492 } │ │ │ │ +493 │ │ │ │ +518 template │ │ │ │ +_5_1_9 void _s_e_t___r_a_n_g_e(HandleTypeIterator begin, HandleTypeIterator end, │ │ │ │ +520 const PROP_VALUE &value) { │ │ │ │ +521 for (; begin != end; ++begin) │ │ │ │ +522 (*this)[*begin] = value; │ │ │ │ +523 } │ │ │ │ +524 │ │ │ │ +525#if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || │ │ │ │ +defined(__GXX_EXPERIMENTAL_CXX0X__) │ │ │ │ +526 template │ │ │ │ +527 void _s_e_t___r_a_n_g_e(const HandleTypeIteratorRange &range, │ │ │ │ +528 const PROP_VALUE &value) { │ │ │ │ +529 _s_e_t___r_a_n_g_e(range.begin(), range.end(), value); │ │ │ │ +530 } │ │ │ │ +531#endif │ │ │ │ +532 │ │ │ │ +547 template │ │ │ │ +_5_4_9 void _c_o_p_y___t_o(HandleTypeIterator begin, HandleTypeIterator end, │ │ │ │ +550 PropertyManager2 &dst_propmanager, │ │ │ │ +551 HandleTypeIterator2 dst_begin, HandleTypeIterator2 dst_end) const { │ │ │ │ +552 │ │ │ │ +553 for (; begin != end && dst_begin != dst_end; ++begin, ++dst_begin) { │ │ │ │ +554 dst_propmanager[*dst_begin] = (*this)[*begin]; │ │ │ │ +555 } │ │ │ │ +556 } │ │ │ │ +557 │ │ │ │ +558 template │ │ │ │ +560 void _c_o_p_y___t_o(const RangeType &range, │ │ │ │ +561 PropertyManager2 &dst_propmanager, │ │ │ │ +562 const RangeType2 &dst_range) const { │ │ │ │ +563 _c_o_p_y___t_o(range.begin(), range.end(), dst_propmanager, │ │ │ │ +564 dst_range.begin(), dst_range.end()); │ │ │ │ +565 } │ │ │ │ +566 │ │ │ │ +567 │ │ │ │ +582 template │ │ │ │ +_5_8_3 static void _c_o_p_y(const char *prop_name, │ │ │ │ +584 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &src_mesh, const RangeType &src_range, │ │ │ │ +585 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &dst_mesh, const RangeType2 &dst_range) { │ │ │ │ +586 │ │ │ │ +587 typedef _O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_> DstPM; │ │ │ │ +588 DstPM dst(DstPM::createIfNotExists(dst_mesh, prop_name)); │ │ │ │ +589 │ │ │ │ +590 typedef _O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_> SrcPM; │ │ │ │ +591 SrcPM src(src_mesh, prop_name, true); │ │ │ │ +592 │ │ │ │ +593 src.copy_to(src_range, dst, dst_range); │ │ │ │ +594 } │ │ │ │ +595 │ │ │ │ +_6_0_2 void _s_e_t___p_e_r_s_i_s_t_e_n_t(bool _persistence = true) │ │ │ │ +603 { │ │ │ │ +604 mesh().property(getRawProperty()).set_persistent(_persistence); │ │ │ │ +605 } │ │ │ │ +606 │ │ │ │ +607 private: │ │ │ │ +608 void deleteProperty() { │ │ │ │ +609 if (!retain_ && prop_.is_valid()) │ │ │ │ +610 mesh().remove_property(prop_); │ │ │ │ +611 } │ │ │ │ +612 │ │ │ │ +613 PolyConnectivity& mesh() const │ │ │ │ +614 { │ │ │ │ +615 return const_cast(mesh_); │ │ │ │ +616 } │ │ │ │ +617 │ │ │ │ +618 private: │ │ │ │ +619 const PolyConnectivity& mesh_; │ │ │ │ +620 PROPTYPE prop_; │ │ │ │ +621 bool retain_; │ │ │ │ +622 std::string name_; │ │ │ │ +623}; │ │ │ │ +624 │ │ │ │ +625template │ │ │ │ +_6_2_6class _C_o_n_s_t_P_r_o_p_e_r_t_y_V_i_e_w_e_r │ │ │ │ +627{ │ │ │ │ +628public: │ │ │ │ +629 using Value = typename PropertyT::Value; │ │ │ │ +630 using value_type = typename PropertyT::value_type; │ │ │ │ +631 using Handle = typename PropertyT::Handle; │ │ │ │ +632 │ │ │ │ +633 _C_o_n_s_t_P_r_o_p_e_r_t_y_V_i_e_w_e_r(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh, const _P_r_o_p_e_r_t_y_T& │ │ │ │ +property_handle) │ │ │ │ +634 : │ │ │ │ +635 mesh_(mesh), │ │ │ │ +636 prop_(property_handle) │ │ │ │ +637 {} │ │ │ │ +638 │ │ │ │ +639 inline const typename PropertyT::const_reference operator() (const Handle& │ │ │ │ +handle) │ │ │ │ +640 { │ │ │ │ +641 return mesh_._p_r_o_p_e_r_t_y(prop_, handle); │ │ │ │ +642 } │ │ │ │ +643 │ │ │ │ +644 inline const typename PropertyT::const_reference operator[] (const Handle& │ │ │ │ +handle) │ │ │ │ +645 { │ │ │ │ +646 return mesh_._p_r_o_p_e_r_t_y(prop_, handle); │ │ │ │ +647 } │ │ │ │ +648 │ │ │ │ +649private: │ │ │ │ +650 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& mesh_; │ │ │ │ +651 _P_r_o_p_e_r_t_y_T prop_; │ │ │ │ +652}; │ │ │ │ +653 │ │ │ │ +681template │ │ │ │ +682_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +683OM_DEPRECATED("Named temporary properties are deprecated. Either create a │ │ │ │ +temporary without name or a non-temporary with name") │ │ │ │ +_6_8_4makeTemporaryProperty(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname) { │ │ │ │ +685 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +(mesh, propname, false); │ │ │ │ +686} │ │ │ │ +687 │ │ │ │ +712template │ │ │ │ +713_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +_7_1_4_m_a_k_e_T_e_m_p_o_r_a_r_y_P_r_o_p_e_r_t_y(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh) { │ │ │ │ +715 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +(mesh); │ │ │ │ +716} │ │ │ │ +717 │ │ │ │ +718 │ │ │ │ +740template │ │ │ │ +741bool │ │ │ │ +_7_4_2_h_a_s_P_r_o_p_e_r_t_y(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname) { │ │ │ │ +743 typename _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e ph; │ │ │ │ +744 return mesh._g_e_t___p_r_o_p_e_r_t_y___h_a_n_d_l_e(ph, propname); │ │ │ │ +745} │ │ │ │ +746 │ │ │ │ +774template │ │ │ │ +775_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +_7_7_6_g_e_t_P_r_o_p_e_r_t_y(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname) { │ │ │ │ +777 if (!hasProperty(mesh, propname)) │ │ │ │ +778 { │ │ │ │ +779 std::ostringstream oss; │ │ │ │ +780 oss << "Requested property handle \"" << propname << "\" does not exist."; │ │ │ │ +781 throw std::runtime_error(oss.str()); │ │ │ │ +782 } │ │ │ │ +783 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +(mesh, propname); │ │ │ │ +784} │ │ │ │ +785 │ │ │ │ +815template │ │ │ │ +816_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e> │ │ │ │ +_8_1_7_g_e_t_O_r_M_a_k_e_P_r_o_p_e_r_t_y(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname) { │ │ │ │ +818 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e_<_E_l_e_m_e_n_t_T_,_ _T_>_:_:_t_y_p_e>:: │ │ │ │ +createIfNotExists(mesh, propname); │ │ │ │ +819} │ │ │ │ +820 │ │ │ │ +830template │ │ │ │ +831OM_DEPRECATED("Use makeTemporaryProperty instead.") │ │ │ │ +_8_3_2_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r makePropertyManagerFromNew(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, │ │ │ │ +const char *propname) │ │ │ │ +833{ │ │ │ │ +834 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_>(mesh, propname, false); │ │ │ │ +835} │ │ │ │ +836 │ │ │ │ +849template │ │ │ │ +850OM_DEPRECATED("Use getProperty instead.") │ │ │ │ +_8_5_1_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r makePropertyManagerFromExisting │ │ │ │ +(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname) │ │ │ │ +852{ │ │ │ │ +853 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>(mesh, propname, true); │ │ │ │ +854} │ │ │ │ +855 │ │ │ │ +864template │ │ │ │ +865OM_DEPRECATED("Use getOrMakeProperty instead.") │ │ │ │ +_8_6_6_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r makePropertyManagerFromExistingOrNew │ │ │ │ +(_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname) │ │ │ │ +867{ │ │ │ │ +868 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_,_ _M_e_s_h_T_>_:_:_c_r_e_a_t_e_I_f_N_o_t_E_x_i_s_t_s(mesh, propname); │ │ │ │ +869} │ │ │ │ +870 │ │ │ │ +882template │ │ │ │ +884OM_DEPRECATED("Use getOrMakeProperty instead.") │ │ │ │ +_8_8_5_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r makePropertyManagerFromExistingOrNew( │ │ │ │ +886 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname, │ │ │ │ +887 const ITERATOR_TYPE &begin, const ITERATOR_TYPE &end, │ │ │ │ +888 const PROP_VALUE &init_value) { │ │ │ │ +889 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_P_R_O_P_T_Y_P_E_>_:_:_c_r_e_a_t_e_I_f_N_o_t_E_x_i_s_t_s( │ │ │ │ +890 mesh, propname, begin, end, init_value); │ │ │ │ +891} │ │ │ │ +892 │ │ │ │ +904template │ │ │ │ +906OM_DEPRECATED("Use getOrMakeProperty instead.") │ │ │ │ +_9_0_7_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r makePropertyManagerFromExistingOrNew( │ │ │ │ +908 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y &mesh, const char *propname, │ │ │ │ +909 const ITERATOR_RANGE &range, │ │ │ │ +910 const PROP_VALUE &init_value) { │ │ │ │ +911 return makePropertyManagerFromExistingOrNew( │ │ │ │ +912 mesh, propname, range.begin(), range.end(), init_value); │ │ │ │ +913} │ │ │ │ +914 │ │ │ │ +915 │ │ │ │ +919template │ │ │ │ +920_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_t_y_p_e_n_a_m_e_ _M_e_s_h_T_:_:_P_o_i_n_t_>> │ │ │ │ +_9_2_1_g_e_t_P_o_i_n_t_s_P_r_o_p_e_r_t_y(MeshT &mesh) { │ │ │ │ +922 return _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_t_y_p_e_n_a_m_e_ _M_e_s_h_T_:_:_P_o_i_n_t_>>(mesh, │ │ │ │ +mesh.points_property_handle()); │ │ │ │ +923} │ │ │ │ +924 │ │ │ │ +928template │ │ │ │ +929_C_o_n_s_t_P_r_o_p_e_r_t_y_V_i_e_w_e_r_<_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_t_y_p_e_n_a_m_e_ _M_e_s_h_T_:_:_P_o_i_n_t_>> │ │ │ │ +_9_3_0_g_e_t_P_o_i_n_t_s_P_r_o_p_e_r_t_y(const MeshT &mesh) { │ │ │ │ +931 using PropType = _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_t_y_p_e_n_a_m_e_ _M_e_s_h_T_:_:_P_o_i_n_t_>; │ │ │ │ +932 return _C_o_n_s_t_P_r_o_p_e_r_t_y_V_i_e_w_e_r_<_P_r_o_p_T_y_p_e_>(mesh, mesh.points_property_handle()); │ │ │ │ +933} │ │ │ │ +934 │ │ │ │ +935template │ │ │ │ +936using _P_r_o_p = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_t_y_p_e_n_a_m_e_ _P_r_o_p_H_a_n_d_l_e_<_H_a_n_d_l_e_T_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ +type>; │ │ │ │ +937 │ │ │ │ +938template │ │ │ │ +939using _V_P_r_o_p = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_T_>>; │ │ │ │ +940 │ │ │ │ +941template │ │ │ │ +942using _H_P_r_o_p = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_H_P_r_o_p_H_a_n_d_l_e_T_<_T_>>; │ │ │ │ +943 │ │ │ │ +944template │ │ │ │ +945using _E_P_r_o_p = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_T_>>; │ │ │ │ +946 │ │ │ │ +947template │ │ │ │ +948using _F_P_r_o_p = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_T_>>; │ │ │ │ +949 │ │ │ │ +950template │ │ │ │ +951using _M_P_r_o_p = _P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_<_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_T_>>; │ │ │ │ +952 │ │ │ │ +953 │ │ │ │ +954} /* namespace OpenMesh */ │ │ │ │ +955#endif /* PROPERTYMANAGER_HH_ */ │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_r_e_m_o_v_e___p_r_o_p_e_r_t_y │ │ │ │ +void remove_property(VPropHandleT< T > &_ph) │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:194 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_p_r_o_p_e_r_t_y │ │ │ │ +PropertyT< T > & property(VPropHandleT< T > _ph) │ │ │ │ +In most cases you should use the convenient PropertyManager wrapper and use of │ │ │ │ +this function should n... │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:310 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_g_e_t___p_r_o_p_e_r_t_y___h_a_n_d_l_e │ │ │ │ +bool get_property_handle(VPropHandleT< T > &_ph, const std::string &_name) │ │ │ │ +const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:254 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ +Connectivity Class for polygonal meshes. │ │ │ │ +DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn HandleToPropHandle.hh:10 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_T │ │ │ │ +Default property class for any type T. │ │ │ │ +DDeeffiinniittiioonn Property.hh:93 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a vertex property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:417 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a mesh property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:477 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +This class is intended to manage the lifecycle of properties. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:76 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_c_o_p_y │ │ │ │ +static void copy(const char *prop_name, PolyConnectivity &src_mesh, const │ │ │ │ +RangeType &src_range, PolyConnectivity &dst_mesh, const RangeType2 &dst_range) │ │ │ │ +Copy the values of a property from a source range to a target range. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:583 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_s_e_t___r_a_n_g_e │ │ │ │ +void set_range(HandleTypeIterator begin, HandleTypeIterator end, const │ │ │ │ +PROP_VALUE &value) │ │ │ │ +Conveniently set the property for an entire range of values. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:519 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +PropertyManager(const Value &initial_value, PolyConnectivity &mesh, const char │ │ │ │ +*propname) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:196 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_g_e_t_P_o_i_n_t_s_P_r_o_p_e_r_t_y │ │ │ │ +ConstPropertyViewer< OpenMesh::VPropHandleT< typename MeshT::Point > > │ │ │ │ +getPointsProperty(const MeshT &mesh) │ │ │ │ +Returns a convenience wrapper around the points property of a mesh that only │ │ │ │ +allows const access. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:930 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +PropertyManager(PolyConnectivity &mesh, const char *propname, bool existing) │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:160 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_m_a_k_e_T_e_m_p_o_r_a_r_y_P_r_o_p_e_r_t_y │ │ │ │ +PropertyManager< typename HandleToPropHandle< ElementT, T >::type > │ │ │ │ +makeTemporaryProperty(PolyConnectivity &mesh) │ │ │ │ +Creates a new property whose lifetime is limited to the current scope. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:714 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ +PROPTYPE::reference operator[](Handle handle) │ │ │ │ +Enables convenient access to the encapsulated property. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:455 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_h_a_s_P_r_o_p_e_r_t_y │ │ │ │ +bool hasProperty(const PolyConnectivity &mesh, const char *propname) │ │ │ │ +Tests whether a property with the given element type, value type, and name is │ │ │ │ +present on the given me... │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:742 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_c_o_p_y___t_o │ │ │ │ +void copy_to(HandleTypeIterator begin, HandleTypeIterator end, PropertyManager2 │ │ │ │ +&dst_propmanager, HandleTypeIterator2 dst_begin, HandleTypeIterator2 dst_end) │ │ │ │ +const │ │ │ │ +Conveniently transfer the values managed by one property manager onto the │ │ │ │ +values managed by a differe... │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:549 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +PROPTYPE::reference & operator*() │ │ │ │ +Get the mesh corresponding to the property. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:428 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_g_e_t_P_o_i_n_t_s_P_r_o_p_e_r_t_y │ │ │ │ +PropertyManager< OpenMesh::VPropHandleT< typename MeshT::Point > > │ │ │ │ +getPointsProperty(MeshT &mesh) │ │ │ │ +Returns a convenience wrapper around the points property of a mesh. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:921 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_s_e_t___p_e_r_s_i_s_t_e_n_t │ │ │ │ +void set_persistent(bool _persistence=true) │ │ │ │ +Mark whether this property should be stored when mesh is written to a file. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:602 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +PropertyManager(const PolyConnectivity &mesh) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:210 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +PropertyManager(const Value &initial_value, const PolyConnectivity &mesh) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:222 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_g_e_t_P_r_o_p_e_r_t_y │ │ │ │ +PropertyManager< typename HandleToPropHandle< ElementT, T >::type > getProperty │ │ │ │ +(PolyConnectivity &mesh, const char *propname) │ │ │ │ +Obtains a handle to a named property. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:776 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_c_l_o_n_e │ │ │ │ +PropertyManager clone() │ │ │ │ +Create property manager referring to a copy of the current property. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:264 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +PropertyManager(PolyConnectivity &mesh, PROPTYPE property_handle) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:235 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ +PROPTYPE::reference operator()(const Handle &handle=Handle()) │ │ │ │ +Enables convenient access to the encapsulated property. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:477 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_g_e_t_O_r_M_a_k_e_P_r_o_p_e_r_t_y │ │ │ │ +PropertyManager< typename HandleToPropHandle< ElementT, T >::type > │ │ │ │ +getOrMakeProperty(PolyConnectivity &mesh, const char *propname) │ │ │ │ +Obtains a handle to a named property if it exists or creates a new one │ │ │ │ +otherwise. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:817 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +PROPTYPE::const_reference & operator*() const │ │ │ │ +Access the value of the encapsulated mesh property. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:444 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r_:_:_P_r_o_p_e_r_t_y_M_a_n_a_g_e_r │ │ │ │ +PropertyManager(PolyConnectivity &mesh, const char *propname) │ │ │ │ +Constructor. │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:180 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_C_o_n_s_t_P_r_o_p_e_r_t_y_V_i_e_w_e_r │ │ │ │ +DDeeffiinniittiioonn PropertyManager.hh:627 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00698_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/HandleToPropHandle.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,135 +92,88 @@ │ │ │
No Matches
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
TriMesh_ArrayKernelT.hh
│ │ │ +
HandleToPropHandle.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ -
2 * *
│ │ │ -
3 * OpenMesh *
│ │ │ -
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ -
5 * Department of Computer Graphics and Multimedia *
│ │ │ -
6 * All rights reserved. *
│ │ │ -
7 * www.openmesh.org *
│ │ │ -
8 * *
│ │ │ -
9 *---------------------------------------------------------------------------*
│ │ │ -
10 * This file is part of OpenMesh. *
│ │ │ -
11 *---------------------------------------------------------------------------*
│ │ │ -
12 * *
│ │ │ -
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ -
14 * modification, are permitted provided that the following conditions *
│ │ │ -
15 * are met: *
│ │ │ -
16 * *
│ │ │ -
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ -
18 * this list of conditions and the following disclaimer. *
│ │ │ -
19 * *
│ │ │ -
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ -
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ -
22 * documentation and/or other materials provided with the distribution. *
│ │ │ -
23 * *
│ │ │ -
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ -
25 * contributors may be used to endorse or promote products derived from *
│ │ │ -
26 * this software without specific prior written permission. *
│ │ │ -
27 * *
│ │ │ -
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ -
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ -
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ -
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ -
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ -
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ -
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ -
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ -
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ -
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ -
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ -
39 * *
│ │ │ -
40 * ========================================================================= */
│ │ │ -
41
│ │ │ +
1#ifndef HANDLETOPROPHANDLE_HH_
│ │ │ +
2#define HANDLETOPROPHANDLE_HH_
│ │ │ +
3
│ │ │ +
4#include <OpenMesh/Core/Mesh/Handles.hh>
│ │ │ +
5#include <OpenMesh/Core/Utils/Property.hh>
│ │ │ +
6
│ │ │ +
7namespace OpenMesh {
│ │ │ +
8
│ │ │ +
9 template<typename ElementT, typename T>
│ │ │ +
│ │ │ + │ │ │ +
11 };
│ │ │ +
│ │ │ +
12
│ │ │ +
13 template<typename T>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
16 };
│ │ │ +
│ │ │ +
17
│ │ │ +
18 template<typename T>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
21 };
│ │ │ +
│ │ │ +
22
│ │ │ +
23 template<typename T>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
26 };
│ │ │ +
│ │ │ +
27
│ │ │ +
28 template<typename T>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
31 };
│ │ │ +
│ │ │ +
32
│ │ │ +
33 template<typename T>
│ │ │ +
│ │ │ +
34 struct HandleToPropHandle<void, T> {
│ │ │ + │ │ │ +
36 };
│ │ │ +
│ │ │ +
37
│ │ │ +
38 template<typename T>
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
41 };
│ │ │ +
│ │ │
42
│ │ │ -
43
│ │ │ +
43} // namespace OpenMesh
│ │ │
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS TriMesh_ArrayKernelT
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#ifndef OPENMESH_TRIMESH_ARRAY_KERNEL_HH
│ │ │ -
53#define OPENMESH_TRIMESH_ARRAY_KERNEL_HH
│ │ │ -
54
│ │ │ -
55
│ │ │ -
56//== INCLUDES =================================================================
│ │ │ -
57
│ │ │ -
58
│ │ │ -
59#include <OpenMesh/Core/System/config.h>
│ │ │ -
60#include <OpenMesh/Core/Mesh/TriConnectivity.hh>
│ │ │ - │ │ │ -
62#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>
│ │ │ -
63#include <OpenMesh/Core/Mesh/AttribKernelT.hh>
│ │ │ -
64#include <OpenMesh/Core/Mesh/TriMeshT.hh>
│ │ │ -
65
│ │ │ -
66
│ │ │ -
67//== NAMESPACES ===============================================================
│ │ │ -
68
│ │ │ -
69
│ │ │ -
70namespace OpenMesh {
│ │ │ -
71
│ │ │ -
72template<class Traits>
│ │ │ -
73class PolyMesh_ArrayKernelT;
│ │ │ -
74//== CLASS DEFINITION =========================================================
│ │ │ -
75
│ │ │ -
76
│ │ │ -
78template <class Traits>
│ │ │ -
│ │ │ - │ │ │ -
80{
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
84};
│ │ │ -
│ │ │ -
85
│ │ │ -
86
│ │ │ -
87
│ │ │ -
93template <class Traits = DefaultTraits>
│ │ │ -
│ │ │ - │ │ │ -
95 : public TriMesh_ArrayKernel_GeneratorT<Traits>::Mesh
│ │ │ -
96{
│ │ │ -
97public:
│ │ │ - │ │ │ -
99 template<class OtherTraits>
│ │ │ - │ │ │ -
101 {
│ │ │ -
102 //assign the connectivity and standard properties
│ │ │ -
103 this->assign(t,true);
│ │ │ -
104 }
│ │ │ -
105};
│ │ │ -
│ │ │ -
106
│ │ │ -
107
│ │ │ -
108//=============================================================================
│ │ │ -
109} // namespace OpenMesh
│ │ │ -
110//=============================================================================
│ │ │ -
111#endif // OPENMESH_TRIMESH_ARRAY_KERNEL_HH
│ │ │ -
112//=============================================================================
│ │ │ +
45#endif // HANDLETOPROPHANDLE_HH_
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
The attribute kernel adds all standard properties to the kernel.
Definition AttribKernelT.hh:73
│ │ │ -
Definition of the mesh entities (items).
Definition FinalMeshItemsT.hh:68
│ │ │ -
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Helper class to create a TriMesh-type based on ArrayKernelT.
Definition TriMesh_ArrayKernelT.hh:80
│ │ │ -
Base type for a triangle mesh.
Definition TriMeshT.hh:92
│ │ │ -
This file defines the default traits and some convenience macros.
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │ +
Definition HandleToPropHandle.hh:10
│ │ │ +
Handle representing a vertex property.
Definition Property.hh:417
│ │ │ +
Handle representing a halfedge property.
Definition Property.hh:432
│ │ │ +
Handle representing an edge property.
Definition Property.hh:447
│ │ │ +
Handle representing a face property.
Definition Property.hh:462
│ │ │ +
Handle representing a mesh property.
Definition Property.hh:477
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,152 +1,89 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -TriMesh_ArrayKernelT.hh │ │ │ │ -1/* ========================================================================= * │ │ │ │ -2 * * │ │ │ │ -3 * OpenMesh * │ │ │ │ -4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ -5 * Department of Computer Graphics and Multimedia * │ │ │ │ -6 * All rights reserved. * │ │ │ │ -7 * www.openmesh.org * │ │ │ │ -8 * * │ │ │ │ -9 *---------------------------------------------------------------------------* │ │ │ │ -10 * This file is part of OpenMesh. * │ │ │ │ -11 *--------------------------------------------------------------------------- │ │ │ │ -* │ │ │ │ -12 * * │ │ │ │ -13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ -14 * modification, are permitted provided that the following conditions * │ │ │ │ -15 * are met: * │ │ │ │ -16 * * │ │ │ │ -17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ -* │ │ │ │ -18 * this list of conditions and the following disclaimer. * │ │ │ │ -19 * * │ │ │ │ -20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ -21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ -22 * documentation and/or other materials provided with the distribution. * │ │ │ │ -23 * * │ │ │ │ -24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ -25 * contributors may be used to endorse or promote products derived from * │ │ │ │ -26 * this software without specific prior written permission. * │ │ │ │ -27 * * │ │ │ │ -28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ -29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ -* │ │ │ │ -30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ -31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ -* │ │ │ │ -32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ -33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ -34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ -35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ -36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ -37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ -38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ -39 * * │ │ │ │ -40 * ========================================================================= │ │ │ │ -*/ │ │ │ │ -41 │ │ │ │ +HandleToPropHandle.hh │ │ │ │ +1#ifndef HANDLETOPROPHANDLE_HH_ │ │ │ │ +2#define HANDLETOPROPHANDLE_HH_ │ │ │ │ +3 │ │ │ │ +4#include │ │ │ │ +5#include │ │ │ │ +6 │ │ │ │ +7namespace _O_p_e_n_M_e_s_h { │ │ │ │ +8 │ │ │ │ +9 template │ │ │ │ +_1_0 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e { │ │ │ │ +11 }; │ │ │ │ +12 │ │ │ │ +13 template │ │ │ │ +_1_4 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e<_O_p_e_n_M_e_s_h::_V_e_r_t_e_x_H_a_n_d_l_e, T> { │ │ │ │ +15 using _t_y_p_e = _O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T_<_T_>; │ │ │ │ +16 }; │ │ │ │ +17 │ │ │ │ +18 template │ │ │ │ +_1_9 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e<_O_p_e_n_M_e_s_h::_H_a_l_f_e_d_g_e_H_a_n_d_l_e, T> { │ │ │ │ +20 using _t_y_p_e = _O_p_e_n_M_e_s_h_:_:_H_P_r_o_p_H_a_n_d_l_e_T_<_T_>; │ │ │ │ +21 }; │ │ │ │ +22 │ │ │ │ +23 template │ │ │ │ +_2_4 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e<_O_p_e_n_M_e_s_h::_E_d_g_e_H_a_n_d_l_e, T> { │ │ │ │ +25 using _t_y_p_e = _O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T_<_T_>; │ │ │ │ +26 }; │ │ │ │ +27 │ │ │ │ +28 template │ │ │ │ +_2_9 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e<_O_p_e_n_M_e_s_h::_F_a_c_e_H_a_n_d_l_e, T> { │ │ │ │ +30 using _t_y_p_e = _O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T_<_T_>; │ │ │ │ +31 }; │ │ │ │ +32 │ │ │ │ +33 template │ │ │ │ +_3_4 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e { │ │ │ │ +35 using _t_y_p_e = _O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_T_>; │ │ │ │ +36 }; │ │ │ │ +37 │ │ │ │ +38 template │ │ │ │ +_3_9 struct _H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e<_O_p_e_n_M_e_s_h::_M_e_s_h_H_a_n_d_l_e, T> { │ │ │ │ +40 using _t_y_p_e = _O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_T_>; │ │ │ │ +41 }; │ │ │ │ 42 │ │ │ │ -43 │ │ │ │ +43} // namespace OpenMesh │ │ │ │ 44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS TriMesh_ArrayKernelT │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef OPENMESH_TRIMESH_ARRAY_KERNEL_HH │ │ │ │ -53#define OPENMESH_TRIMESH_ARRAY_KERNEL_HH │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -57 │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_T_r_a_i_t_s_._h_h> │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65 │ │ │ │ -66 │ │ │ │ -67//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -68 │ │ │ │ -69 │ │ │ │ -70namespace _O_p_e_n_M_e_s_h { │ │ │ │ -71 │ │ │ │ -72template │ │ │ │ -73class PolyMesh_ArrayKernelT; │ │ │ │ -74//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -75 │ │ │ │ -76 │ │ │ │ -78template │ │ │ │ -_7_9struct _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T │ │ │ │ -80{ │ │ │ │ -81 typedef _F_i_n_a_l_M_e_s_h_I_t_e_m_s_T_<_T_r_a_i_t_s_,_ _t_r_u_e_> _M_e_s_h_I_t_e_m_s; │ │ │ │ -82 typedef _A_t_t_r_i_b_K_e_r_n_e_l_T_<_M_e_s_h_I_t_e_m_s_,_ _T_r_i_C_o_n_n_e_c_t_i_v_i_t_y_> _A_t_t_r_i_b_K_e_r_n_e_l; │ │ │ │ -83 typedef _T_r_i_M_e_s_h_T_<_A_t_t_r_i_b_K_e_r_n_e_l_> _M_e_s_h; │ │ │ │ -84}; │ │ │ │ -85 │ │ │ │ -86 │ │ │ │ -87 │ │ │ │ -93template │ │ │ │ -_9_4class _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -95 : public _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T::Mesh │ │ │ │ -96{ │ │ │ │ -97public: │ │ │ │ -98 _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T() {} │ │ │ │ -99 template │ │ │ │ -100 explicit _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T( const _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T_<_O_t_h_e_r_T_r_a_i_t_s_> & │ │ │ │ -t) │ │ │ │ -101 { │ │ │ │ -102 //assign the connectivity and standard properties │ │ │ │ -103 this->assign(t,true); │ │ │ │ -104 } │ │ │ │ -105}; │ │ │ │ -106 │ │ │ │ -107 │ │ │ │ -108// │ │ │ │ -============================================================================= │ │ │ │ -109} // namespace OpenMesh │ │ │ │ -110// │ │ │ │ -============================================================================= │ │ │ │ -111#endif // OPENMESH_TRIMESH_ARRAY_KERNEL_HH │ │ │ │ -112// │ │ │ │ -============================================================================= │ │ │ │ +45#endif // HANDLETOPROPHANDLE_HH_ │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_K_e_r_n_e_l_T │ │ │ │ -The attribute kernel adds all standard properties to the kernel. │ │ │ │ -DDeeffiinniittiioonn AttribKernelT.hh:73 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ -Definition of the mesh entities (items). │ │ │ │ -DDeeffiinniittiioonn FinalMeshItemsT.hh:68 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Triangle mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T │ │ │ │ -Helper class to create a TriMesh-type based on ArrayKernelT. │ │ │ │ -DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:80 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T │ │ │ │ -Base type for a triangle mesh. │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:92 │ │ │ │ -_T_r_a_i_t_s_._h_h │ │ │ │ -This file defines the default traits and some convenience macros. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ +Handle type for meshes to simplify some template programming. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_n_d_l_e_T_o_P_r_o_p_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn HandleToPropHandle.hh:10 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a vertex property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:417 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a halfedge property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:432 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing an edge property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:447 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a face property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:462 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a mesh property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:477 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00704_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/DefaultTriMesh.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/SingletonT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
DefaultTriMesh.hh
│ │ │ +
SingletonT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -137,40 +137,113 @@ │ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │ -
43#ifndef OPENMESH_DEFAULTTRIMESH_HH
│ │ │ -
44#define OPENMESH_DEFAULTTRIMESH_HH
│ │ │ -
45
│ │ │ -
46
│ │ │ -
47//== INCLUDES =================================================================
│ │ │ -
48
│ │ │ - │ │ │ -
50#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ -
51
│ │ │ -
52//== NAMESPACES ===============================================================
│ │ │ -
53
│ │ │ -
54namespace OpenMesh {
│ │ │ -
55
│ │ │ -
56//== TYPEDEFS =================================================================
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Implements a simple singleton template
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51#pragma once
│ │ │ +
52
│ │ │ +
53//=== INCLUDES ================================================================
│ │ │ +
54
│ │ │ +
55// OpenMesh
│ │ │ +
56#include <OpenMesh/Core/System/config.h>
│ │ │
57
│ │ │ -
58typedef TriMesh_ArrayKernelT<DefaultTraitsDouble> TriMesh;
│ │ │ -
59
│ │ │ -
60//=============================================================================
│ │ │ -
61} // namespace OpenMesh
│ │ │ -
62//=============================================================================
│ │ │ +
58// STL
│ │ │ +
59#include <stdexcept>
│ │ │ +
60
│ │ │ +
61
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │
63
│ │ │ -
64//=============================================================================
│ │ │ -
65#endif // OPENMESH_DEFAULTTRIMESH_HH defined
│ │ │ -
66//=============================================================================
│ │ │ +
64
│ │ │ +
65namespace OpenMesh {
│ │ │ +
66
│ │ │ +
67
│ │ │ +
68//=== IMPLEMENTATION ==========================================================
│ │ │ +
69
│ │ │ +
70
│ │ │ +
75template <typename T>
│ │ │ +
│ │ │ + │ │ │ +
77{
│ │ │ +
78public:
│ │ │ +
79
│ │ │ +
│ │ │ +
86 static T& Instance()
│ │ │ +
87 {
│ │ │ +
88 if (!pInstance__)
│ │ │ +
89 {
│ │ │ +
90 // check if singleton alive
│ │ │ +
91 if (destroyed__)
│ │ │ +
92 {
│ │ │ +
93 OnDeadReference();
│ │ │ +
94 }
│ │ │ +
95 // first time request -> initialize
│ │ │ +
96 else
│ │ │ +
97 {
│ │ │ +
98 Create();
│ │ │ +
99 }
│ │ │ +
100 }
│ │ │ +
101 return *pInstance__;
│ │ │ +
102 }
│ │ │ +
│ │ │ +
103
│ │ │ +
104
│ │ │ +
105private:
│ │ │ +
106
│ │ │ +
107 // Disable constructors/assignment to enforce uniqueness
│ │ │ +
108 SingletonT();
│ │ │ +
109 SingletonT(const SingletonT&);
│ │ │ +
110 SingletonT& operator=(const SingletonT&);
│ │ │ +
111
│ │ │ +
112 // Create a new singleton and store its pointer
│ │ │ +
113 static void Create()
│ │ │ +
114 {
│ │ │ +
115 static T theInstance;
│ │ │ +
116 pInstance__ = &theInstance;
│ │ │ +
117 }
│ │ │ +
118
│ │ │ +
119 // Will be called if instance is accessed after its lifetime has expired
│ │ │ +
120 static void OnDeadReference()
│ │ │ +
121 {
│ │ │ +
122 throw std::runtime_error("[Singelton error] - Dead reference detected!\n");
│ │ │ +
123 }
│ │ │ +
124
│ │ │ +
125 virtual ~SingletonT()
│ │ │ +
126 {
│ │ │ +
127 pInstance__ = 0;
│ │ │ +
128 destroyed__ = true;
│ │ │ +
129 }
│ │ │ +
130
│ │ │ +
131 static T* pInstance__;
│ │ │ +
132 static bool destroyed__;
│ │ │ +
133};
│ │ │ +
│ │ │ +
134
│ │ │ +
135
│ │ │ +
136
│ │ │ +
137//=============================================================================
│ │ │ +
138} // namespace OpenMesh
│ │ │ +
139//=============================================================================
│ │ │ +
140#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SINGLETON_C)
│ │ │ +
141# define OPENMESH_SINGLETON_TEMPLATES
│ │ │ +
142# include "SingletonT_impl.hh"
│ │ │ +
143#endif
│ │ │ +
144//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
This file defines the default traits and some convenience macros.
│ │ │ +
A simple singleton template.
Definition SingletonT.hh:77
│ │ │ +
static T & Instance()
Singleton access function.
Definition SingletonT.hh:86
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -DefaultTriMesh.hh │ │ │ │ +SingletonT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -46,47 +46,121 @@ │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ -43#ifndef OPENMESH_DEFAULTTRIMESH_HH │ │ │ │ -44#define OPENMESH_DEFAULTTRIMESH_HH │ │ │ │ -45 │ │ │ │ -46 │ │ │ │ -47//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -48 │ │ │ │ -49#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_T_r_a_i_t_s_._h_h> │ │ │ │ -50#include │ │ │ │ -51 │ │ │ │ -52//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -53 │ │ │ │ -54namespace _O_p_e_n_M_e_s_h { │ │ │ │ -55 │ │ │ │ -56//== TYPEDEFS │ │ │ │ -================================================================= │ │ │ │ -57 │ │ │ │ -58typedef TriMesh_ArrayKernelT TriMesh; │ │ │ │ -59 │ │ │ │ -60// │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ ============================================================================= │ │ │ │ -61} // namespace OpenMesh │ │ │ │ -62// │ │ │ │ +46// │ │ │ │ +47// Implements a simple singleton template │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ ============================================================================= │ │ │ │ +50 │ │ │ │ +51#pragma once │ │ │ │ +52 │ │ │ │ +53//=== INCLUDES │ │ │ │ +================================================================ │ │ │ │ +54 │ │ │ │ +55// OpenMesh │ │ │ │ +56#include │ │ │ │ +57 │ │ │ │ +58// STL │ │ │ │ +59#include │ │ │ │ +60 │ │ │ │ +61 │ │ │ │ +62//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ 63 │ │ │ │ -64// │ │ │ │ +64 │ │ │ │ +65namespace _O_p_e_n_M_e_s_h { │ │ │ │ +66 │ │ │ │ +67 │ │ │ │ +68//=== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ +69 │ │ │ │ +70 │ │ │ │ +75template │ │ │ │ +_7_6class _S_i_n_g_l_e_t_o_n_T │ │ │ │ +77{ │ │ │ │ +78public: │ │ │ │ +79 │ │ │ │ +_8_6 static T& _I_n_s_t_a_n_c_e() │ │ │ │ +87 { │ │ │ │ +88 if (!pInstance__) │ │ │ │ +89 { │ │ │ │ +90 // check if singleton alive │ │ │ │ +91 if (destroyed__) │ │ │ │ +92 { │ │ │ │ +93 OnDeadReference(); │ │ │ │ +94 } │ │ │ │ +95 // first time request -> initialize │ │ │ │ +96 else │ │ │ │ +97 { │ │ │ │ +98 Create(); │ │ │ │ +99 } │ │ │ │ +100 } │ │ │ │ +101 return *pInstance__; │ │ │ │ +102 } │ │ │ │ +103 │ │ │ │ +104 │ │ │ │ +105private: │ │ │ │ +106 │ │ │ │ +107 // Disable constructors/assignment to enforce uniqueness │ │ │ │ +108 _S_i_n_g_l_e_t_o_n_T(); │ │ │ │ +109 _S_i_n_g_l_e_t_o_n_T(const _S_i_n_g_l_e_t_o_n_T&); │ │ │ │ +110 _S_i_n_g_l_e_t_o_n_T& operator=(const _S_i_n_g_l_e_t_o_n_T&); │ │ │ │ +111 │ │ │ │ +112 // Create a new singleton and store its pointer │ │ │ │ +113 static void Create() │ │ │ │ +114 { │ │ │ │ +115 static T theInstance; │ │ │ │ +116 pInstance__ = &theInstance; │ │ │ │ +117 } │ │ │ │ +118 │ │ │ │ +119 // Will be called if instance is accessed after its lifetime has expired │ │ │ │ +120 static void OnDeadReference() │ │ │ │ +121 { │ │ │ │ +122 throw std::runtime_error("[Singelton error] - Dead reference detected!\n"); │ │ │ │ +123 } │ │ │ │ +124 │ │ │ │ +125 virtual ~SingletonT() │ │ │ │ +126 { │ │ │ │ +127 pInstance__ = 0; │ │ │ │ +128 destroyed__ = true; │ │ │ │ +129 } │ │ │ │ +130 │ │ │ │ +131 static T* pInstance__; │ │ │ │ +132 static bool destroyed__; │ │ │ │ +133}; │ │ │ │ +134 │ │ │ │ +135 │ │ │ │ +136 │ │ │ │ +137// │ │ │ │ +============================================================================= │ │ │ │ +138} // namespace OpenMesh │ │ │ │ +139// │ │ │ │ ============================================================================= │ │ │ │ -65#endif // OPENMESH_DEFAULTTRIMESH_HH defined │ │ │ │ -66// │ │ │ │ +140#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_SINGLETON_C) │ │ │ │ +141# define OPENMESH_SINGLETON_TEMPLATES │ │ │ │ +142# include "SingletonT_impl.hh" │ │ │ │ +143#endif │ │ │ │ +144// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_T_r_a_i_t_s_._h_h │ │ │ │ -This file defines the default traits and some convenience macros. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_i_n_g_l_e_t_o_n_T │ │ │ │ +A simple singleton template. │ │ │ │ +DDeeffiinniittiioonn SingletonT.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_i_n_g_l_e_t_o_n_T_:_:_I_n_s_t_a_n_c_e │ │ │ │ +static T & Instance() │ │ │ │ +Singleton access function. │ │ │ │ +DDeeffiinniittiioonn SingletonT.hh:86 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00710_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/gen/iterators_header.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/PropertyContainer.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
iterators_header.hh
│ │ │ +
PropertyContainer.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,54 +138,311 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44#ifndef OPENMESH_ITERATORS_HH
│ │ │ -
45#define OPENMESH_ITERATORS_HH
│ │ │ +
44#ifndef OPENMESH_PROPERTYCONTAINER
│ │ │ +
45#define OPENMESH_PROPERTYCONTAINER
│ │ │
46
│ │ │ -
47//=============================================================================
│ │ │ -
48//
│ │ │ -
49// Iterators for PolyMesh/TriMesh
│ │ │ -
50//
│ │ │ -
51//=============================================================================
│ │ │ -
52
│ │ │ -
53
│ │ │ -
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ -
56
│ │ │ -
57#include <OpenMesh/Core/System/config.h>
│ │ │ -
58#include <OpenMesh/Core/Attributes/Status.hh>
│ │ │ -
59#include <cassert>
│ │ │ -
60
│ │ │ +
47#include <OpenMesh/Core/Utils/Property.hh>
│ │ │ +
48#include <OpenMesh/Core/Utils/typename.hh>
│ │ │ +
49
│ │ │ +
50//-----------------------------------------------------------------------------
│ │ │ +
51namespace OpenMesh
│ │ │ +
52{
│ │ │ +
53//== FORWARDDECLARATIONS ======================================================
│ │ │ +
54 class BaseKernel;
│ │ │ +
55
│ │ │ +
56//== CLASS DEFINITION =========================================================
│ │ │ +
│ │ │ + │ │ │ +
59{
│ │ │ +
60public:
│ │ │
61
│ │ │ -
62//== NAMESPACES ===============================================================
│ │ │ +
62 //-------------------------------------------------- constructor / destructor
│ │ │
63
│ │ │ -
64namespace OpenMesh {
│ │ │ -
65namespace Iterators {
│ │ │ + │ │ │ +
65 virtual ~PropertyContainer() { std::for_each(properties_.begin(), properties_.end(), Delete()); }
│ │ │
66
│ │ │
67
│ │ │ -
68//== FORWARD DECLARATIONS =====================================================
│ │ │ +
68 //------------------------------------------------------------- info / access
│ │ │
69
│ │ │ -
70
│ │ │ -
71template <class Mesh> class VertexIterT;
│ │ │ -
72template <class Mesh> class ConstVertexIterT;
│ │ │ -
73template <class Mesh> class HalfedgeIterT;
│ │ │ -
74template <class Mesh> class ConstHalfedgeIterT;
│ │ │ -
75template <class Mesh> class EdgeIterT;
│ │ │ -
76template <class Mesh> class ConstEdgeIterT;
│ │ │ -
77template <class Mesh> class FaceIterT;
│ │ │ -
78template <class Mesh> class ConstFaceIterT;
│ │ │ +
70 typedef std::vector<BaseProperty*> Properties;
│ │ │ +
71 const Properties& properties() const { return properties_; }
│ │ │ +
72 size_t size() const { return properties_.size(); }
│ │ │ +
73
│ │ │ +
74
│ │ │ +
75
│ │ │ +
76 //--------------------------------------------------------- copy / assignment
│ │ │ +
77
│ │ │ +
78 PropertyContainer(const PropertyContainer& _rhs) { operator=(_rhs); }
│ │ │
79
│ │ │ -
80
│ │ │ -
81
│ │ │ -
82
│ │ │ +
80 PropertyContainer& operator=(const PropertyContainer& _rhs)
│ │ │ +
81 {
│ │ │ +
82 // The assignment below relies on all previous BaseProperty* elements having been deleted
│ │ │ +
83 std::for_each(properties_.begin(), properties_.end(), Delete());
│ │ │ +
84 properties_ = _rhs.properties_;
│ │ │ +
85 Properties::iterator p_it=properties_.begin(), p_end=properties_.end();
│ │ │ +
86 for (; p_it!=p_end; ++p_it)
│ │ │ +
87 if (*p_it)
│ │ │ +
88 *p_it = (*p_it)->clone();
│ │ │ +
89 return *this;
│ │ │ +
90 }
│ │ │ +
91
│ │ │ +
92
│ │ │ +
93
│ │ │ +
94 //--------------------------------------------------------- manage properties
│ │ │ +
95
│ │ │ +
96 template <class T>
│ │ │ +
97 BasePropHandleT<T> add(const T&, const std::string& _name="<unknown>")
│ │ │ +
98 {
│ │ │ +
99 Properties::iterator p_it=properties_.begin(), p_end=properties_.end();
│ │ │ +
100 int idx=0;
│ │ │ +
101 for ( ; p_it!=p_end && *p_it!=nullptr; ++p_it, ++idx ) {};
│ │ │ +
102 if (p_it==p_end) properties_.push_back(nullptr);
│ │ │ +
103 properties_[idx] = new PropertyT<T>(_name, get_type_name<T>() ); // create a new property with requested name and given (system dependent) internal typename
│ │ │ +
104 return BasePropHandleT<T>(idx);
│ │ │ +
105 }
│ │ │ +
106
│ │ │ +
107
│ │ │ +
108 template <class T>
│ │ │ +
109 BasePropHandleT<T> handle(const T&, const std::string& _name) const
│ │ │ +
110 {
│ │ │ +
111 Properties::const_iterator p_it = properties_.begin();
│ │ │ +
112 for (int idx=0; p_it != properties_.end(); ++p_it, ++idx)
│ │ │ +
113 {
│ │ │ +
114 if (*p_it != nullptr &&
│ │ │ +
115 (*p_it)->name() == _name //skip deleted properties
│ │ │ +
116 && (*p_it)->internal_type_name() == get_type_name<T>() // new check type
│ │ │ +
117 )
│ │ │ +
118 {
│ │ │ +
119 return BasePropHandleT<T>(idx);
│ │ │ +
120 }
│ │ │ +
121 }
│ │ │ +
122 return BasePropHandleT<T>();
│ │ │ +
123 }
│ │ │ +
124
│ │ │ +
125 BaseProperty* property( const std::string& _name ) const
│ │ │ +
126 {
│ │ │ +
127 Properties::const_iterator p_it = properties_.begin();
│ │ │ +
128 for (int idx=0; p_it != properties_.end(); ++p_it, ++idx)
│ │ │ +
129 {
│ │ │ +
130 if (*p_it != nullptr && (*p_it)->name() == _name) //skip deleted properties
│ │ │ +
131 {
│ │ │ +
132 return *p_it;
│ │ │ +
133 }
│ │ │ +
134 }
│ │ │ +
135 return nullptr;
│ │ │ +
136 }
│ │ │ +
137
│ │ │ +
138 template <class T> PropertyT<T>& property(BasePropHandleT<T> _h)
│ │ │ +
139 {
│ │ │ +
140 assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size());
│ │ │ +
141 assert(properties_[_h.idx()] != nullptr);
│ │ │ +
142 assert( properties_[_h.idx()]->internal_type_name() == get_type_name<T>() );
│ │ │ +
143 PropertyT<T> *p = static_cast< PropertyT<T>* > (properties_[_h.idx()]);
│ │ │ +
144 assert(p != nullptr);
│ │ │ +
145 return *p;
│ │ │ +
146 }
│ │ │ +
147
│ │ │ +
148
│ │ │ +
149 template <class T> const PropertyT<T>& property(BasePropHandleT<T> _h) const
│ │ │ +
150 {
│ │ │ +
151 assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size());
│ │ │ +
152 assert(properties_[_h.idx()] != nullptr);
│ │ │ +
153 assert( properties_[_h.idx()]->internal_type_name() == get_type_name<T>() );
│ │ │ +
154 PropertyT<T> *p = static_cast< PropertyT<T>* > (properties_[_h.idx()]);
│ │ │ +
155 assert(p != nullptr);
│ │ │ +
156 return *p;
│ │ │ +
157 }
│ │ │ +
158
│ │ │ +
159
│ │ │ +
160 template <class T> void remove(BasePropHandleT<T> _h)
│ │ │ +
161 {
│ │ │ +
162 assert(_h.idx() >= 0 && _h.idx() < (int)properties_.size());
│ │ │ +
163 delete properties_[_h.idx()];
│ │ │ +
164 properties_[_h.idx()] = nullptr;
│ │ │ +
165 }
│ │ │ +
166
│ │ │ +
167
│ │ │ +
168 void clear()
│ │ │ +
169 {
│ │ │ +
170 // Clear properties vector:
│ │ │ +
171 // Replaced the old version with new one
│ │ │ +
172 // which performs a swap to clear values and
│ │ │ +
173 // deallocate memory.
│ │ │ +
174
│ │ │ +
175 // Old version (changed 22.07.09) {
│ │ │ +
176 // std::for_each(properties_.begin(), properties_.end(), Delete());
│ │ │ +
177 // }
│ │ │ +
178
│ │ │ +
179 std::for_each(properties_.begin(), properties_.end(), ClearAll());
│ │ │ +
180 }
│ │ │ +
181
│ │ │ +
182
│ │ │ +
183 //---------------------------------------------------- synchronize properties
│ │ │ +
184
│ │ │ +
185/*
│ │ │ +
186 * In C++11 an beyond we can introduce more efficient and more legible
│ │ │ +
187 * implementations of the following methods.
│ │ │ +
188 */
│ │ │ +
189#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
│ │ │ +
193 void reserve(size_t _n) const {
│ │ │ +
194 std::for_each(properties_.begin(), properties_.end(),
│ │ │ +
195 [_n](BaseProperty* p) { if (p) p->reserve(_n); });
│ │ │ +
196 }
│ │ │ +
197
│ │ │ +
201 void resize(size_t _n) const {
│ │ │ +
202 std::for_each(properties_.begin(), properties_.end(),
│ │ │ +
203 [_n](BaseProperty* p) { if (p) p->resize(_n); });
│ │ │ +
204 }
│ │ │ +
205
│ │ │ +
214 void resize_if_smaller(size_t _n) const {
│ │ │ +
215 std::for_each(properties_.begin(), properties_.end(),
│ │ │ +
216 [_n](BaseProperty* p) { if (p && p->n_elements() < _n) p->resize(_n); });
│ │ │ +
217 }
│ │ │ +
218
│ │ │ +
223 void swap(size_t _i0, size_t _i1) const {
│ │ │ +
224 std::for_each(properties_.begin(), properties_.end(),
│ │ │ +
225 [_i0, _i1](BaseProperty* p) { if (p) p->swap(_i0, _i1); });
│ │ │ +
226 }
│ │ │ +
227#else
│ │ │ +
│ │ │ +
231 void reserve(size_t _n) const {
│ │ │ +
232 std::for_each(properties_.begin(), properties_.end(), Reserve(_n));
│ │ │ +
233 }
│ │ │ +
│ │ │ +
234
│ │ │ +
│ │ │ +
238 void resize(size_t _n) const {
│ │ │ +
239 std::for_each(properties_.begin(), properties_.end(), Resize(_n));
│ │ │ +
240 }
│ │ │ +
│ │ │ +
241
│ │ │ +
│ │ │ +
250 void resize_if_smaller(size_t _n) const {
│ │ │ +
251 std::for_each(properties_.begin(), properties_.end(), ResizeIfSmaller(_n));
│ │ │ +
252 }
│ │ │ +
│ │ │ +
253
│ │ │ +
│ │ │ +
258 void swap(size_t _i0, size_t _i1) const {
│ │ │ +
259 std::for_each(properties_.begin(), properties_.end(), Swap(_i0, _i1));
│ │ │ +
260 }
│ │ │ +
│ │ │ +
261#endif
│ │ │ +
262
│ │ │ +
263
│ │ │ +
264
│ │ │ +
265protected: // generic add/get
│ │ │ +
266
│ │ │ +
267 size_t _add( BaseProperty* _bp )
│ │ │ +
268 {
│ │ │ +
269 Properties::iterator p_it=properties_.begin(), p_end=properties_.end();
│ │ │ +
270 size_t idx=0;
│ │ │ +
271 for (; p_it!=p_end && *p_it!=nullptr; ++p_it, ++idx) {};
│ │ │ +
272 if (p_it==p_end) properties_.push_back(nullptr);
│ │ │ +
273 properties_[idx] = _bp;
│ │ │ +
274 return idx;
│ │ │ +
275 }
│ │ │ +
276
│ │ │ +
277 BaseProperty& _property( size_t _idx )
│ │ │ +
278 {
│ │ │ +
279 assert( _idx < properties_.size());
│ │ │ +
280 assert( properties_[_idx] != nullptr);
│ │ │ +
281 BaseProperty *p = properties_[_idx];
│ │ │ +
282 assert( p != nullptr );
│ │ │ +
283 return *p;
│ │ │ +
284 }
│ │ │ +
285
│ │ │ +
286 const BaseProperty& _property( size_t _idx ) const
│ │ │ +
287 {
│ │ │ +
288 assert( _idx < properties_.size());
│ │ │ +
289 assert( properties_[_idx] != nullptr);
│ │ │ +
290 BaseProperty *p = properties_[_idx];
│ │ │ +
291 assert( p != nullptr );
│ │ │ +
292 return *p;
│ │ │ +
293 }
│ │ │ +
294
│ │ │ +
295
│ │ │ +
296 typedef Properties::iterator iterator;
│ │ │ +
297 typedef Properties::const_iterator const_iterator;
│ │ │ +
298 iterator begin() { return properties_.begin(); }
│ │ │ +
299 iterator end() { return properties_.end(); }
│ │ │ +
300 const_iterator begin() const { return properties_.begin(); }
│ │ │ +
301 const_iterator end() const { return properties_.end(); }
│ │ │ +
302
│ │ │ +
303 friend class BaseKernel;
│ │ │ +
304
│ │ │ +
305private:
│ │ │ +
306
│ │ │ +
307 //-------------------------------------------------- synchronization functors
│ │ │ +
308
│ │ │ +
309#ifndef DOXY_IGNORE_THIS
│ │ │ +
310 struct Reserve
│ │ │ +
311 {
│ │ │ +
312 explicit Reserve(size_t _n) : n_(_n) {}
│ │ │ +
313 void operator()(BaseProperty* _p) const { if (_p) _p->reserve(n_); }
│ │ │ +
314 size_t n_;
│ │ │ +
315 };
│ │ │ +
316
│ │ │ +
317 struct Resize
│ │ │ +
318 {
│ │ │ +
319 explicit Resize(size_t _n) : n_(_n) {}
│ │ │ +
320 void operator()(BaseProperty* _p) const { if (_p) _p->resize(n_); }
│ │ │ +
321 size_t n_;
│ │ │ +
322 };
│ │ │ +
323
│ │ │ +
324 struct ResizeIfSmaller
│ │ │ +
325 {
│ │ │ +
326 explicit ResizeIfSmaller(size_t _n) : n_(_n) {}
│ │ │ +
327 void operator()(BaseProperty* _p) const { if (_p && _p->n_elements() < n_) _p->resize(n_); }
│ │ │ +
328 size_t n_;
│ │ │ +
329 };
│ │ │ +
330
│ │ │ +
331 struct ClearAll
│ │ │ +
332 {
│ │ │ +
333 ClearAll() {}
│ │ │ +
334 void operator()(BaseProperty* _p) const { if (_p) _p->clear(); }
│ │ │ +
335 };
│ │ │ +
336
│ │ │ +
337 struct Swap
│ │ │ +
338 {
│ │ │ +
339 Swap(size_t _i0, size_t _i1) : i0_(_i0), i1_(_i1) {}
│ │ │ +
340 void operator()(BaseProperty* _p) const { if (_p) _p->swap(i0_, i1_); }
│ │ │ +
341 size_t i0_, i1_;
│ │ │ +
342 };
│ │ │ +
343
│ │ │ +
344 struct Delete
│ │ │ +
345 {
│ │ │ +
346 Delete() {}
│ │ │ +
347 void operator()(BaseProperty* _p) const { if (_p) delete _p; }
│ │ │ +
348 };
│ │ │ +
349#endif
│ │ │ +
350
│ │ │ +
351 Properties properties_;
│ │ │ +
352};
│ │ │ +
│ │ │ +
353
│ │ │ +
354}//namespace OpenMesh
│ │ │ +
355
│ │ │ +
356#endif//OPENMESH_PROPERTYCONTAINER
│ │ │ +
357
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ +
Abstract class defining the basic interface of a dynamic property.
Definition BaseProperty.hh:61
│ │ │ +
Default property class for any type T.
Definition Property.hh:93
│ │ │ +
Base property handle.
Definition Property.hh:401
│ │ │ +
A a container for properties.
Definition PropertyContainer.hh:59
│ │ │ +
void reserve(size_t _n) const
Reserves space for _n elements in all property vectors.
Definition PropertyContainer.hh:231
│ │ │ +
void resize_if_smaller(size_t _n) const
Same as.
Definition PropertyContainer.hh:250
│ │ │ +
void swap(size_t _i0, size_t _i1) const
Swaps the items with index _i0 and index _i1 in all property vectors.
Definition PropertyContainer.hh:258
│ │ │ +
void resize(size_t _n) const
Resizes all property vectors to the specified size.
Definition PropertyContainer.hh:238
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -iterators_header.hh │ │ │ │ +PropertyContainer.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,58 +47,341 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44#ifndef OPENMESH_ITERATORS_HH │ │ │ │ -45#define OPENMESH_ITERATORS_HH │ │ │ │ +44#ifndef OPENMESH_PROPERTYCONTAINER │ │ │ │ +45#define OPENMESH_PROPERTYCONTAINER │ │ │ │ 46 │ │ │ │ -47// │ │ │ │ -============================================================================= │ │ │ │ -48// │ │ │ │ -49// Iterators for PolyMesh/TriMesh │ │ │ │ -50// │ │ │ │ -51// │ │ │ │ -============================================================================= │ │ │ │ -52 │ │ │ │ -53 │ │ │ │ -54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60 │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ +49 │ │ │ │ +50//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +51namespace _O_p_e_n_M_e_s_h │ │ │ │ +52{ │ │ │ │ +53//== FORWARDDECLARATIONS │ │ │ │ +====================================================== │ │ │ │ +54 class BaseKernel; │ │ │ │ +55 │ │ │ │ +56//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +_5_8class _P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r │ │ │ │ +59{ │ │ │ │ +60public: │ │ │ │ 61 │ │ │ │ -62//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ +62 //-------------------------------------------------- constructor / │ │ │ │ +destructor │ │ │ │ 63 │ │ │ │ -64namespace _O_p_e_n_M_e_s_h { │ │ │ │ -65namespace Iterators { │ │ │ │ +64 _P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r() {} │ │ │ │ +65 virtual _~_P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r() { std::for_each(properties_.begin(), │ │ │ │ +properties_.end(), Delete()); } │ │ │ │ 66 │ │ │ │ 67 │ │ │ │ -68//== FORWARD DECLARATIONS │ │ │ │ -===================================================== │ │ │ │ +68 //------------------------------------------------------------- info / │ │ │ │ +access │ │ │ │ 69 │ │ │ │ -70 │ │ │ │ -71template class VertexIterT; │ │ │ │ -72template class ConstVertexIterT; │ │ │ │ -73template class HalfedgeIterT; │ │ │ │ -74template class ConstHalfedgeIterT; │ │ │ │ -75template class EdgeIterT; │ │ │ │ -76template class ConstEdgeIterT; │ │ │ │ -77template class FaceIterT; │ │ │ │ -78template class ConstFaceIterT; │ │ │ │ +70 typedef std::vector Properties; │ │ │ │ +71 const Properties& properties() const { return properties_; } │ │ │ │ +72 size_t size() const { return properties_.size(); } │ │ │ │ +73 │ │ │ │ +74 │ │ │ │ +75 │ │ │ │ +76 //--------------------------------------------------------- copy / │ │ │ │ +assignment │ │ │ │ +77 │ │ │ │ +78 _P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r(const _P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r& _rhs) { operator=(_rhs); } │ │ │ │ 79 │ │ │ │ -80 │ │ │ │ -81 │ │ │ │ -82 │ │ │ │ +80 _P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r& operator=(const _P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r& _rhs) │ │ │ │ +81 { │ │ │ │ +82 // The assignment below relies on all previous BaseProperty* elements having │ │ │ │ +been deleted │ │ │ │ +83 std::for_each(properties_.begin(), properties_.end(), Delete()); │ │ │ │ +84 properties_ = _rhs.properties_; │ │ │ │ +85 Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); │ │ │ │ +86 for (; p_it!=p_end; ++p_it) │ │ │ │ +87 if (*p_it) │ │ │ │ +88 *p_it = (*p_it)->clone(); │ │ │ │ +89 return *this; │ │ │ │ +90 } │ │ │ │ +91 │ │ │ │ +92 │ │ │ │ +93 │ │ │ │ +94 //--------------------------------------------------------- manage │ │ │ │ +properties │ │ │ │ +95 │ │ │ │ +96 template │ │ │ │ +97 _B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_> add(const T&, const std::string& _name="") │ │ │ │ +98 { │ │ │ │ +99 Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); │ │ │ │ +100 int idx=0; │ │ │ │ +101 for ( ; p_it!=p_end && *p_it!=nullptr; ++p_it, ++idx ) {}; │ │ │ │ +102 if (p_it==p_end) properties_.push_back(nullptr); │ │ │ │ +103 properties_[idx] = new _P_r_o_p_e_r_t_y_T_<_T_>(_name, get_type_name() ); // create │ │ │ │ +a new property with requested name and given (system dependent) internal │ │ │ │ +typename │ │ │ │ +104 return _B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_>(idx); │ │ │ │ +105 } │ │ │ │ +106 │ │ │ │ +107 │ │ │ │ +108 template │ │ │ │ +109 _B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_> handle(const T&, const std::string& _name) const │ │ │ │ +110 { │ │ │ │ +111 Properties::const_iterator p_it = properties_.begin(); │ │ │ │ +112 for (int idx=0; p_it != properties_.end(); ++p_it, ++idx) │ │ │ │ +113 { │ │ │ │ +114 if (*p_it != nullptr && │ │ │ │ +115 (*p_it)->name() == _name //skip deleted properties │ │ │ │ +116 && (*p_it)->internal_type_name() == get_type_name() // new check type │ │ │ │ +117 ) │ │ │ │ +118 { │ │ │ │ +119 return _B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_>(idx); │ │ │ │ +120 } │ │ │ │ +121 } │ │ │ │ +122 return _B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_>(); │ │ │ │ +123 } │ │ │ │ +124 │ │ │ │ +125 _B_a_s_e_P_r_o_p_e_r_t_y* property( const std::string& _name ) const │ │ │ │ +126 { │ │ │ │ +127 Properties::const_iterator p_it = properties_.begin(); │ │ │ │ +128 for (int idx=0; p_it != properties_.end(); ++p_it, ++idx) │ │ │ │ +129 { │ │ │ │ +130 if (*p_it != nullptr && (*p_it)->name() == _name) //skip deleted properties │ │ │ │ +131 { │ │ │ │ +132 return *p_it; │ │ │ │ +133 } │ │ │ │ +134 } │ │ │ │ +135 return nullptr; │ │ │ │ +136 } │ │ │ │ +137 │ │ │ │ +138 template _P_r_o_p_e_r_t_y_T_<_T_>& property(_B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_> _h) │ │ │ │ +139 { │ │ │ │ +140 assert(_h._i_d_x() >= 0 && _h._i_d_x() < (int)properties_.size()); │ │ │ │ +141 assert(properties_[_h._i_d_x()] != nullptr); │ │ │ │ +142 assert( properties_[_h._i_d_x()]->internal_type_name() == get_type_name() │ │ │ │ +); │ │ │ │ +143 _P_r_o_p_e_r_t_y_T_<_T_> *p = static_cast< _P_r_o_p_e_r_t_y_T_<_T_>* > (properties_[_h._i_d_x()]); │ │ │ │ +144 assert(p != nullptr); │ │ │ │ +145 return *p; │ │ │ │ +146 } │ │ │ │ +147 │ │ │ │ +148 │ │ │ │ +149 template const _P_r_o_p_e_r_t_y_T_<_T_>& property(_B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_> _h) │ │ │ │ +const │ │ │ │ +150 { │ │ │ │ +151 assert(_h._i_d_x() >= 0 && _h._i_d_x() < (int)properties_.size()); │ │ │ │ +152 assert(properties_[_h._i_d_x()] != nullptr); │ │ │ │ +153 assert( properties_[_h._i_d_x()]->internal_type_name() == get_type_name() │ │ │ │ +); │ │ │ │ +154 _P_r_o_p_e_r_t_y_T_<_T_> *p = static_cast< _P_r_o_p_e_r_t_y_T_<_T_>* > (properties_[_h._i_d_x()]); │ │ │ │ +155 assert(p != nullptr); │ │ │ │ +156 return *p; │ │ │ │ +157 } │ │ │ │ +158 │ │ │ │ +159 │ │ │ │ +160 template void remove(_B_a_s_e_P_r_o_p_H_a_n_d_l_e_T_<_T_> _h) │ │ │ │ +161 { │ │ │ │ +162 assert(_h._i_d_x() >= 0 && _h._i_d_x() < (int)properties_.size()); │ │ │ │ +163 delete properties_[_h._i_d_x()]; │ │ │ │ +164 properties_[_h._i_d_x()] = nullptr; │ │ │ │ +165 } │ │ │ │ +166 │ │ │ │ +167 │ │ │ │ +168 void clear() │ │ │ │ +169 { │ │ │ │ +170 // Clear properties vector: │ │ │ │ +171 // Replaced the old version with new one │ │ │ │ +172 // which performs a swap to clear values and │ │ │ │ +173 // deallocate memory. │ │ │ │ +174 │ │ │ │ +175 // Old version (changed 22.07.09) { │ │ │ │ +176 // std::for_each(properties_.begin(), properties_.end(), Delete()); │ │ │ │ +177 // } │ │ │ │ +178 │ │ │ │ +179 std::for_each(properties_.begin(), properties_.end(), ClearAll()); │ │ │ │ +180 } │ │ │ │ +181 │ │ │ │ +182 │ │ │ │ +183 //---------------------------------------------------- synchronize │ │ │ │ +properties │ │ │ │ +184 │ │ │ │ +185/* │ │ │ │ +186 * In C++11 an beyond we can introduce more efficient and more legible │ │ │ │ +187 * implementations of the following methods. │ │ │ │ +188 */ │ │ │ │ +189#if ((defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || │ │ │ │ +defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) │ │ │ │ +193 void _r_e_s_e_r_v_e(size_t _n) const { │ │ │ │ +194 std::for_each(properties_.begin(), properties_.end(), │ │ │ │ +195 [_n](_B_a_s_e_P_r_o_p_e_r_t_y* p) { if (p) p->reserve(_n); }); │ │ │ │ +196 } │ │ │ │ +197 │ │ │ │ +201 void _r_e_s_i_z_e(size_t _n) const { │ │ │ │ +202 std::for_each(properties_.begin(), properties_.end(), │ │ │ │ +203 [_n](_B_a_s_e_P_r_o_p_e_r_t_y* p) { if (p) p->resize(_n); }); │ │ │ │ +204 } │ │ │ │ +205 │ │ │ │ +214 void _r_e_s_i_z_e___i_f___s_m_a_l_l_e_r(size_t _n) const { │ │ │ │ +215 std::for_each(properties_.begin(), properties_.end(), │ │ │ │ +216 [_n](_B_a_s_e_P_r_o_p_e_r_t_y* p) { if (p && p->n_elements() < _n) p->resize(_n); }); │ │ │ │ +217 } │ │ │ │ +218 │ │ │ │ +223 void _s_w_a_p(size_t _i0, size_t _i1) const { │ │ │ │ +224 std::for_each(properties_.begin(), properties_.end(), │ │ │ │ +225 [_i0, _i1](_B_a_s_e_P_r_o_p_e_r_t_y* p) { if (p) p->swap(_i0, _i1); }); │ │ │ │ +226 } │ │ │ │ +227#else │ │ │ │ +_2_3_1 void _r_e_s_e_r_v_e(size_t _n) const { │ │ │ │ +232 std::for_each(properties_.begin(), properties_.end(), Reserve(_n)); │ │ │ │ +233 } │ │ │ │ +234 │ │ │ │ +_2_3_8 void _r_e_s_i_z_e(size_t _n) const { │ │ │ │ +239 std::for_each(properties_.begin(), properties_.end(), Resize(_n)); │ │ │ │ +240 } │ │ │ │ +241 │ │ │ │ +_2_5_0 void _r_e_s_i_z_e___i_f___s_m_a_l_l_e_r(size_t _n) const { │ │ │ │ +251 std::for_each(properties_.begin(), properties_.end(), ResizeIfSmaller(_n)); │ │ │ │ +252 } │ │ │ │ +253 │ │ │ │ +_2_5_8 void _s_w_a_p(size_t _i0, size_t _i1) const { │ │ │ │ +259 std::for_each(properties_.begin(), properties_.end(), Swap(_i0, _i1)); │ │ │ │ +260 } │ │ │ │ +261#endif │ │ │ │ +262 │ │ │ │ +263 │ │ │ │ +264 │ │ │ │ +265protected: // generic add/get │ │ │ │ +266 │ │ │ │ +267 size_t _add( _B_a_s_e_P_r_o_p_e_r_t_y* _bp ) │ │ │ │ +268 { │ │ │ │ +269 Properties::iterator p_it=properties_.begin(), p_end=properties_.end(); │ │ │ │ +270 size_t idx=0; │ │ │ │ +271 for (; p_it!=p_end && *p_it!=nullptr; ++p_it, ++idx) {}; │ │ │ │ +272 if (p_it==p_end) properties_.push_back(nullptr); │ │ │ │ +273 properties_[idx] = _bp; │ │ │ │ +274 return idx; │ │ │ │ +275 } │ │ │ │ +276 │ │ │ │ +277 BaseProperty& _property( size_t _idx ) │ │ │ │ +278 { │ │ │ │ +279 assert( _idx < properties_.size()); │ │ │ │ +280 assert( properties_[_idx] != nullptr); │ │ │ │ +281 BaseProperty *p = properties_[_idx]; │ │ │ │ +282 assert( p != nullptr ); │ │ │ │ +283 return *p; │ │ │ │ +284 } │ │ │ │ +285 │ │ │ │ +286 const BaseProperty& _property( size_t _idx ) const │ │ │ │ +287 { │ │ │ │ +288 assert( _idx < properties_.size()); │ │ │ │ +289 assert( properties_[_idx] != nullptr); │ │ │ │ +290 BaseProperty *p = properties_[_idx]; │ │ │ │ +291 assert( p != nullptr ); │ │ │ │ +292 return *p; │ │ │ │ +293 } │ │ │ │ +294 │ │ │ │ +295 │ │ │ │ +296 typedef Properties::iterator iterator; │ │ │ │ +297 typedef Properties::const_iterator const_iterator; │ │ │ │ +298 iterator begin() { return properties_.begin(); } │ │ │ │ +299 iterator end() { return properties_.end(); } │ │ │ │ +300 const_iterator begin() const { return properties_.begin(); } │ │ │ │ +301 const_iterator end() const { return properties_.end(); } │ │ │ │ +302 │ │ │ │ +303 friend class BaseKernel; │ │ │ │ +304 │ │ │ │ +305private: │ │ │ │ +306 │ │ │ │ +307 //-------------------------------------------------- synchronization │ │ │ │ +functors │ │ │ │ +308 │ │ │ │ +309#ifndef DOXY_IGNORE_THIS │ │ │ │ +310 struct Reserve │ │ │ │ +311 { │ │ │ │ +312 explicit Reserve(size_t _n) : n_(_n) {} │ │ │ │ +313 void operator()(BaseProperty* _p) const { if (_p) _p->reserve(n_); } │ │ │ │ +314 size_t n_; │ │ │ │ +315 }; │ │ │ │ +316 │ │ │ │ +317 struct Resize │ │ │ │ +318 { │ │ │ │ +319 explicit Resize(size_t _n) : n_(_n) {} │ │ │ │ +320 void operator()(BaseProperty* _p) const { if (_p) _p->resize(n_); } │ │ │ │ +321 size_t n_; │ │ │ │ +322 }; │ │ │ │ +323 │ │ │ │ +324 struct ResizeIfSmaller │ │ │ │ +325 { │ │ │ │ +326 explicit ResizeIfSmaller(size_t _n) : n_(_n) {} │ │ │ │ +327 void operator()(BaseProperty* _p) const { if (_p && _p->n_elements() < n_) │ │ │ │ +_p->resize(n_); } │ │ │ │ +328 size_t n_; │ │ │ │ +329 }; │ │ │ │ +330 │ │ │ │ +331 struct ClearAll │ │ │ │ +332 { │ │ │ │ +333 ClearAll() {} │ │ │ │ +334 void operator()(BaseProperty* _p) const { if (_p) _p->clear(); } │ │ │ │ +335 }; │ │ │ │ +336 │ │ │ │ +337 struct Swap │ │ │ │ +338 { │ │ │ │ +339 Swap(size_t _i0, size_t _i1) : i0_(_i0), i1_(_i1) {} │ │ │ │ +340 void operator()(BaseProperty* _p) const { if (_p) _p->swap(i0_, i1_); } │ │ │ │ +341 size_t i0_, i1_; │ │ │ │ +342 }; │ │ │ │ +343 │ │ │ │ +344 struct Delete │ │ │ │ +345 { │ │ │ │ +346 Delete() {} │ │ │ │ +347 void operator()(BaseProperty* _p) const { if (_p) delete _p; } │ │ │ │ +348 }; │ │ │ │ +349#endif │ │ │ │ +350 │ │ │ │ +351 Properties properties_; │ │ │ │ +352}; │ │ │ │ +353 │ │ │ │ +354}//namespace OpenMesh │ │ │ │ +355 │ │ │ │ +356#endif//OPENMESH_PROPERTYCONTAINER │ │ │ │ +357 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ +int idx() const │ │ │ │ +Get the underlying index of this handle. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_P_r_o_p_e_r_t_y │ │ │ │ +Abstract class defining the basic interface of a dynamic property. │ │ │ │ +DDeeffiinniittiioonn BaseProperty.hh:61 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_T │ │ │ │ +Default property class for any type T. │ │ │ │ +DDeeffiinniittiioonn Property.hh:93 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Base property handle. │ │ │ │ +DDeeffiinniittiioonn Property.hh:401 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r │ │ │ │ +A a container for properties. │ │ │ │ +DDeeffiinniittiioonn PropertyContainer.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r_:_:_r_e_s_e_r_v_e │ │ │ │ +void reserve(size_t _n) const │ │ │ │ +Reserves space for _n elements in all property vectors. │ │ │ │ +DDeeffiinniittiioonn PropertyContainer.hh:231 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r_:_:_r_e_s_i_z_e___i_f___s_m_a_l_l_e_r │ │ │ │ +void resize_if_smaller(size_t _n) const │ │ │ │ +Same as. │ │ │ │ +DDeeffiinniittiioonn PropertyContainer.hh:250 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r_:_:_s_w_a_p │ │ │ │ +void swap(size_t _i0, size_t _i1) const │ │ │ │ +Swaps the items with index _i0 and index _i1 in all property vectors. │ │ │ │ +DDeeffiinniittiioonn PropertyContainer.hh:258 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_o_n_t_a_i_n_e_r_:_:_r_e_s_i_z_e │ │ │ │ +void resize(size_t _n) const │ │ │ │ +Resizes all property vectors to the specified size. │ │ │ │ +DDeeffiinniittiioonn PropertyContainer.hh:238 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00713_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/gen/circulators_template.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/GenProg.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,224 +92,162 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
circulators_template.hh
│ │ │ +
GenProg.hh
│ │ │
│ │ │
│ │ │ -
1//== CLASS DEFINITION =========================================================
│ │ │ -
2
│ │ │ -
3
│ │ │ -
8template <class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
10{
│ │ │ -
11 public:
│ │ │ -
12
│ │ │ -
13
│ │ │ -
14 //--- Typedefs ---
│ │ │ -
15
│ │ │ -
16 typedef typename Mesh::HalfedgeHandle HalfedgeHandle;
│ │ │ -
17
│ │ │ -
18 typedef TargetType value_type;
│ │ │ -
19 typedef TargetHandle value_handle;
│ │ │ -
20
│ │ │ -
21#if IsConst
│ │ │ -
22 typedef const Mesh& mesh_ref;
│ │ │ -
23 typedef const Mesh* mesh_ptr;
│ │ │ -
24 typedef const TargetType& reference;
│ │ │ -
25 typedef const TargetType* pointer;
│ │ │ -
26#else
│ │ │ -
27 typedef Mesh& mesh_ref;
│ │ │ -
28 typedef Mesh* mesh_ptr;
│ │ │ -
29 typedef TargetType& reference;
│ │ │ -
30 typedef TargetType* pointer;
│ │ │ -
31#endif
│ │ │ -
32
│ │ │ -
33
│ │ │ -
34
│ │ │ -
36 CirculatorT() : mesh_(0), active_(false) {}
│ │ │ -
37
│ │ │ -
38
│ │ │ -
│ │ │ -
40 CirculatorT(mesh_ref _mesh, SourceHandle _start) :
│ │ │ -
41 mesh_(&_mesh),
│ │ │ -
42 start_(_mesh.halfedge_handle(_start)),
│ │ │ -
43 heh_(start_),
│ │ │ -
44 active_(false)
│ │ │ -
45 { post_init; }
│ │ │ -
│ │ │ -
46
│ │ │ -
47
│ │ │ -
│ │ │ -
49 CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh) :
│ │ │ -
50 mesh_(&_mesh),
│ │ │ -
51 start_(_heh),
│ │ │ -
52 heh_(_heh),
│ │ │ -
53 active_(false)
│ │ │ -
54 { post_init; }
│ │ │ -
│ │ │ -
55
│ │ │ +
1/* ========================================================================= *
│ │ │ +
2 * *
│ │ │ +
3 * OpenMesh *
│ │ │ +
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
5 * Department of Computer Graphics and Multimedia *
│ │ │ +
6 * All rights reserved. *
│ │ │ +
7 * www.openmesh.org *
│ │ │ +
8 * *
│ │ │ +
9 *---------------------------------------------------------------------------*
│ │ │ +
10 * This file is part of OpenMesh. *
│ │ │ +
11 *---------------------------------------------------------------------------*
│ │ │ +
12 * *
│ │ │ +
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ +
14 * modification, are permitted provided that the following conditions *
│ │ │ +
15 * are met: *
│ │ │ +
16 * *
│ │ │ +
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ +
18 * this list of conditions and the following disclaimer. *
│ │ │ +
19 * *
│ │ │ +
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ +
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ +
22 * documentation and/or other materials provided with the distribution. *
│ │ │ +
23 * *
│ │ │ +
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ +
25 * contributors may be used to endorse or promote products derived from *
│ │ │ +
26 * this software without specific prior written permission. *
│ │ │ +
27 * *
│ │ │ +
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ +
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ +
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ +
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ +
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ +
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ +
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ +
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ +
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ +
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ +
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ +
39 * *
│ │ │ +
40 * ========================================================================= */
│ │ │ +
41
│ │ │ +
42
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Utils for generic/generative programming
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51#ifndef OPENMESH_GENPROG_HH
│ │ │ +
52#define OPENMESH_GENPROG_HH
│ │ │ +
53
│ │ │ +
54
│ │ │ +
55//== INCLUDES =================================================================
│ │ │
56
│ │ │ -
│ │ │ -
58 CirculatorT(const CirculatorT& _rhs) :
│ │ │ -
59 mesh_(_rhs.mesh_),
│ │ │ -
60 start_(_rhs.start_),
│ │ │ -
61 heh_(_rhs.heh_),
│ │ │ -
62 active_(_rhs.active_)
│ │ │ -
63 { post_init; }
│ │ │ -
│ │ │ -
64
│ │ │ -
65
│ │ │ -
│ │ │ - │ │ │ -
68 {
│ │ │ -
69 mesh_ = _rhs.mesh_;
│ │ │ -
70 start_ = _rhs.start_;
│ │ │ -
71 heh_ = _rhs.heh_;
│ │ │ -
72 active_ = _rhs.active_;
│ │ │ -
73 return *this;
│ │ │ -
74 }
│ │ │ -
│ │ │ +
57#include <OpenMesh/Core/System/config.h>
│ │ │ +
58
│ │ │ +
59
│ │ │ +
60//== NAMESPACES ===============================================================
│ │ │ +
61
│ │ │ +
62namespace OpenMesh {
│ │ │ +
63
│ │ │ +
64namespace GenProg {
│ │ │ +
65#ifndef DOXY_IGNORE_THIS
│ │ │ +
66
│ │ │ +
67//== IMPLEMENTATION ===========================================================
│ │ │ +
68
│ │ │ +
69
│ │ │ +
71template <bool b> struct Bool2Type { enum { my_bool = b }; };
│ │ │ +
72
│ │ │ +
74template <int i> struct Int2Type { enum { my_int = i }; };
│ │ │
75
│ │ │ -
76
│ │ │ -
77#if IsConst
│ │ │ -
79 CirculatorT(const NonConstCircT<Mesh>& _rhs) :
│ │ │ -
80 mesh_(_rhs.mesh_),
│ │ │ -
81 start_(_rhs.start_),
│ │ │ -
82 heh_(_rhs.heh_),
│ │ │ -
83 active_(_rhs.active_)
│ │ │ -
84 { post_init; }
│ │ │ -
85
│ │ │ +
77typedef Bool2Type<true> TrueType;
│ │ │ +
78
│ │ │ +
80typedef Bool2Type<false> FalseType;
│ │ │ +
81
│ │ │ +
82//-----------------------------------------------------------------------------
│ │ │ +
84template <bool Expr> struct AssertCompile;
│ │ │ +
85template <> struct AssertCompile<true> {};
│ │ │
86
│ │ │ -
88 CirculatorT& operator=(const NonConstCircT<Mesh>& _rhs)
│ │ │ -
89 {
│ │ │ -
90 mesh_ = _rhs.mesh_;
│ │ │ -
91 start_ = _rhs.start_;
│ │ │ -
92 heh_ = _rhs.heh_;
│ │ │ -
93 active_ = _rhs.active_;
│ │ │ -
94 return *this;
│ │ │ -
95 }
│ │ │ -
96#else
│ │ │ -
97 friend class ConstCircT<Mesh>;
│ │ │ -
98#endif
│ │ │ -
99
│ │ │ -
100
│ │ │ -
│ │ │ -
102 bool operator==(const CirculatorT& _rhs) const {
│ │ │ -
103 return ((mesh_ == _rhs.mesh_) &&
│ │ │ -
104 (start_ == _rhs.start_) &&
│ │ │ -
105 (heh_ == _rhs.heh_) &&
│ │ │ -
106 (active_ == _rhs.active_));
│ │ │ -
107 }
│ │ │ -
│ │ │ -
108
│ │ │ -
109
│ │ │ -
│ │ │ -
111 bool operator!=(const CirculatorT& _rhs) const {
│ │ │ -
112 return !operator==(_rhs);
│ │ │ -
113 }
│ │ │ -
│ │ │ -
114
│ │ │ -
115
│ │ │ -
│ │ │ - │ │ │ -
118 assert(mesh_);
│ │ │ -
119 active_ = true;
│ │ │ -
120 increment;
│ │ │ -
121 return *this;
│ │ │ -
122 }
│ │ │ -
│ │ │ -
123
│ │ │ -
124
│ │ │ -
│ │ │ - │ │ │ -
127 assert(mesh_);
│ │ │ -
128 active_ = true;
│ │ │ -
129 decrement;
│ │ │ -
130 return *this;
│ │ │ -
131 }
│ │ │ -
│ │ │ -
132
│ │ │ +
87
│ │ │ +
88
│ │ │ +
89//--- Template "if" w/ partial specialization ---------------------------------
│ │ │ +
90#if OM_PARTIAL_SPECIALIZATION
│ │ │ +
91
│ │ │ +
92
│ │ │ +
93template <bool condition, class Then, class Else>
│ │ │ +
94struct IF { typedef Then Result; };
│ │ │ +
95
│ │ │ +
101template <class Then, class Else>
│ │ │ +
102struct IF<false, Then, Else> { typedef Else Result; };
│ │ │ +
103
│ │ │ +
104
│ │ │ +
105
│ │ │ +
106
│ │ │ +
107
│ │ │ +
108//--- Template "if" w/o partial specialization --------------------------------
│ │ │ +
109#else
│ │ │ +
110
│ │ │ +
111
│ │ │ +
112struct SelectThen
│ │ │ +
113{
│ │ │ +
114 template <class Then, class Else> struct Select {
│ │ │ +
115 typedef Then Result;
│ │ │ +
116 };
│ │ │ +
117};
│ │ │ +
118
│ │ │ +
119struct SelectElse
│ │ │ +
120{
│ │ │ +
121 template <class Then, class Else> struct Select {
│ │ │ +
122 typedef Else Result;
│ │ │ +
123 };
│ │ │ +
124};
│ │ │ +
125
│ │ │ +
126template <bool condition> struct ChooseSelector {
│ │ │ +
127 typedef SelectThen Result;
│ │ │ +
128};
│ │ │ +
129
│ │ │ +
130template <> struct ChooseSelector<false> {
│ │ │ +
131 typedef SelectElse Result;
│ │ │ +
132};
│ │ │
133
│ │ │ -
│ │ │ -
138 HalfedgeHandle current_halfedge_handle() const {
│ │ │ -
139 return heh_;
│ │ │ -
140 }
│ │ │ -
│ │ │ -
141
│ │ │ -
142
│ │ │ -
│ │ │ -
144 TargetHandle handle() const {
│ │ │ -
145 assert(mesh_);
│ │ │ -
146 return get_handle;
│ │ │ -
147 }
│ │ │ -
│ │ │ +
134
│ │ │ +
141template <bool condition, class Then, class Else>
│ │ │ +
142class IF
│ │ │ +
143{
│ │ │ +
144 typedef typename ChooseSelector<condition>::Result Selector;
│ │ │ +
145public:
│ │ │ +
146 typedef typename Selector::template Select<Then, Else>::Result Result;
│ │ │ +
147};
│ │ │
148
│ │ │ -
149
│ │ │ -
│ │ │ -
151 operator TargetHandle() const {
│ │ │ -
152 assert(mesh_);
│ │ │ -
153 return get_handle;
│ │ │ -
154 }
│ │ │ -
│ │ │ -
155
│ │ │ -
156
│ │ │ -
│ │ │ -
158 reference operator*() const {
│ │ │ -
159 assert(mesh_);
│ │ │ -
160 return mesh_->deref(handle());
│ │ │ -
161 }
│ │ │ -
│ │ │ -
162
│ │ │ -
163
│ │ │ -
│ │ │ -
165 pointer operator->() const {
│ │ │ -
166 assert(mesh_);
│ │ │ -
167 return &mesh_->deref(handle());
│ │ │ -
168 }
│ │ │ -
│ │ │ -
169
│ │ │ -
170
│ │ │ -
│ │ │ -
177 operator bool() const {
│ │ │ -
178 return heh_.is_valid() && ((start_ != heh_) || (!active_));
│ │ │ -
179 }
│ │ │ -
│ │ │ -
180
│ │ │ -
181
│ │ │ -
182private:
│ │ │ -
183
│ │ │ -
184 mesh_ptr mesh_;
│ │ │ -
185 HalfedgeHandle start_, heh_;
│ │ │ -
186 bool active_;
│ │ │ -
187};
│ │ │ -
│ │ │ -
188
│ │ │ -
189
│ │ │ -
190
│ │ │ -
Circulator.
Definition circulators_template.hh:10
│ │ │ -
CirculatorT & operator++()
Pre-Increment (next cw target)
Definition circulators_template.hh:117
│ │ │ -
CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh)
Construct with mesh and start halfedge.
Definition circulators_template.hh:49
│ │ │ -
bool operator==(const CirculatorT &_rhs) const
Equal ?
Definition circulators_template.hh:102
│ │ │ -
reference operator*() const
Return a reference to the current target.
Definition circulators_template.hh:158
│ │ │ -
CirculatorT(const CirculatorT &_rhs)
Copy constructor.
Definition circulators_template.hh:58
│ │ │ -
CirculatorT()
Default constructor.
Definition circulators_template.hh:36
│ │ │ -
CirculatorT & operator--()
Pre-Decrement (next ccw target)
Definition circulators_template.hh:126
│ │ │ -
HalfedgeHandle current_halfedge_handle() const
Get the current halfedge.
Definition circulators_template.hh:138
│ │ │ -
TargetHandle handle() const
Return the handle of the current target.
Definition circulators_template.hh:144
│ │ │ -
pointer operator->() const
Return a pointer to the current target.
Definition circulators_template.hh:165
│ │ │ -
CirculatorT & operator=(const CirculatorT< Mesh > &_rhs)
Assignment operator.
Definition circulators_template.hh:67
│ │ │ -
CirculatorT(mesh_ref _mesh, SourceHandle _start)
Construct with mesh and a SourceHandle.
Definition circulators_template.hh:40
│ │ │ -
bool operator!=(const CirculatorT &_rhs) const
Not equal ?
Definition circulators_template.hh:111
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
149#endif
│ │ │ +
150
│ │ │ +
151//=============================================================================
│ │ │ +
152#endif
│ │ │ +
153} // namespace GenProg
│ │ │ +
154} // namespace OpenMesh
│ │ │ +
155
│ │ │ +
156#define assert_compile(EXPR) GenProg::AssertCompile<(EXPR)>();
│ │ │ +
157
│ │ │ +
158//=============================================================================
│ │ │ +
159#endif // OPENMESH_GENPROG_HH defined
│ │ │ +
160//=============================================================================
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,232 +1,172 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -circulators_template.hh │ │ │ │ -1//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -2 │ │ │ │ -3 │ │ │ │ -8template │ │ │ │ -_9class _C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -10{ │ │ │ │ -11 public: │ │ │ │ -12 │ │ │ │ -13 │ │ │ │ -14 //--- Typedefs --- │ │ │ │ -15 │ │ │ │ -16 typedef typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e HalfedgeHandle; │ │ │ │ -17 │ │ │ │ -18 typedef TargetType value_type; │ │ │ │ -19 typedef TargetHandle value_handle; │ │ │ │ -20 │ │ │ │ -21#if IsConst │ │ │ │ -22 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ -23 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ -24 typedef const TargetType& reference; │ │ │ │ -25 typedef const TargetType* pointer; │ │ │ │ -26#else │ │ │ │ -27 typedef _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ -28 typedef _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ -29 typedef TargetType& reference; │ │ │ │ -30 typedef TargetType* pointer; │ │ │ │ -31#endif │ │ │ │ -32 │ │ │ │ -33 │ │ │ │ -34 │ │ │ │ -_3_6 _C_i_r_c_u_l_a_t_o_r_T() : mesh_(0), active_(false) {} │ │ │ │ -37 │ │ │ │ -38 │ │ │ │ -_4_0 _C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, SourceHandle _start) : │ │ │ │ -41 mesh_(&_mesh), │ │ │ │ -42 start_(_mesh.halfedge_handle(_start)), │ │ │ │ -43 heh_(start_), │ │ │ │ -44 active_(false) │ │ │ │ -45 { post_init; } │ │ │ │ -46 │ │ │ │ -47 │ │ │ │ -_4_9 _C_i_r_c_u_l_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, HalfedgeHandle _heh) : │ │ │ │ -50 mesh_(&_mesh), │ │ │ │ -51 start_(_heh), │ │ │ │ -52 heh_(_heh), │ │ │ │ -53 active_(false) │ │ │ │ -54 { post_init; } │ │ │ │ -55 │ │ │ │ +GenProg.hh │ │ │ │ +1/* ========================================================================= * │ │ │ │ +2 * * │ │ │ │ +3 * OpenMesh * │ │ │ │ +4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +5 * Department of Computer Graphics and Multimedia * │ │ │ │ +6 * All rights reserved. * │ │ │ │ +7 * www.openmesh.org * │ │ │ │ +8 * * │ │ │ │ +9 *---------------------------------------------------------------------------* │ │ │ │ +10 * This file is part of OpenMesh. * │ │ │ │ +11 *--------------------------------------------------------------------------- │ │ │ │ +* │ │ │ │ +12 * * │ │ │ │ +13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ +14 * modification, are permitted provided that the following conditions * │ │ │ │ +15 * are met: * │ │ │ │ +16 * * │ │ │ │ +17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ +* │ │ │ │ +18 * this list of conditions and the following disclaimer. * │ │ │ │ +19 * * │ │ │ │ +20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ +21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ +22 * documentation and/or other materials provided with the distribution. * │ │ │ │ +23 * * │ │ │ │ +24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ +25 * contributors may be used to endorse or promote products derived from * │ │ │ │ +26 * this software without specific prior written permission. * │ │ │ │ +27 * * │ │ │ │ +28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ +29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ +* │ │ │ │ +30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ +31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ +* │ │ │ │ +32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ +33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ +34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ +35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ +36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ +37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ +38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ +39 * * │ │ │ │ +40 * ========================================================================= │ │ │ │ +*/ │ │ │ │ +41 │ │ │ │ +42 │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Utils for generic/generative programming │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ +51#ifndef OPENMESH_GENPROG_HH │ │ │ │ +52#define OPENMESH_GENPROG_HH │ │ │ │ +53 │ │ │ │ +54 │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 56 │ │ │ │ -_5_8 _C_i_r_c_u_l_a_t_o_r_T(const _C_i_r_c_u_l_a_t_o_r_T& _rhs) : │ │ │ │ -59 mesh_(_rhs.mesh_), │ │ │ │ -60 start_(_rhs.start_), │ │ │ │ -61 heh_(_rhs.heh_), │ │ │ │ -62 active_(_rhs.active_) │ │ │ │ -63 { post_init; } │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -_6_7 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const _C_i_r_c_u_l_a_t_o_r_T_<_M_e_s_h_>& _rhs) │ │ │ │ -68 { │ │ │ │ -69 mesh_ = _rhs.mesh_; │ │ │ │ -70 start_ = _rhs.start_; │ │ │ │ -71 heh_ = _rhs.heh_; │ │ │ │ -72 active_ = _rhs.active_; │ │ │ │ -73 return *this; │ │ │ │ -74 } │ │ │ │ +57#include │ │ │ │ +58 │ │ │ │ +59 │ │ │ │ +60//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +61 │ │ │ │ +62namespace _O_p_e_n_M_e_s_h { │ │ │ │ +63 │ │ │ │ +64namespace GenProg { │ │ │ │ +65#ifndef DOXY_IGNORE_THIS │ │ │ │ +66 │ │ │ │ +67//== IMPLEMENTATION │ │ │ │ +=========================================================== │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +71template struct Bool2Type { enum { my_bool = b }; }; │ │ │ │ +72 │ │ │ │ +74template struct Int2Type { enum { my_int = i }; }; │ │ │ │ 75 │ │ │ │ -76 │ │ │ │ -77#if IsConst │ │ │ │ -79 _C_i_r_c_u_l_a_t_o_r_T(const NonConstCircT& _rhs) : │ │ │ │ -80 mesh_(_rhs.mesh_), │ │ │ │ -81 start_(_rhs.start_), │ │ │ │ -82 heh_(_rhs.heh_), │ │ │ │ -83 active_(_rhs.active_) │ │ │ │ -84 { post_init; } │ │ │ │ -85 │ │ │ │ +77typedef Bool2Type TrueType; │ │ │ │ +78 │ │ │ │ +80typedef Bool2Type FalseType; │ │ │ │ +81 │ │ │ │ +82//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +84template struct AssertCompile; │ │ │ │ +85template <> struct AssertCompile {}; │ │ │ │ 86 │ │ │ │ -88 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const NonConstCircT& _rhs) │ │ │ │ -89 { │ │ │ │ -90 mesh_ = _rhs.mesh_; │ │ │ │ -91 start_ = _rhs.start_; │ │ │ │ -92 heh_ = _rhs.heh_; │ │ │ │ -93 active_ = _rhs.active_; │ │ │ │ -94 return *this; │ │ │ │ -95 } │ │ │ │ -96#else │ │ │ │ -97 friend class ConstCircT; │ │ │ │ -98#endif │ │ │ │ -99 │ │ │ │ -100 │ │ │ │ -_1_0_2 bool _o_p_e_r_a_t_o_r_=_=(const _C_i_r_c_u_l_a_t_o_r_T& _rhs) const { │ │ │ │ -103 return ((mesh_ == _rhs.mesh_) && │ │ │ │ -104 (start_ == _rhs.start_) && │ │ │ │ -105 (heh_ == _rhs.heh_) && │ │ │ │ -106 (active_ == _rhs.active_)); │ │ │ │ -107 } │ │ │ │ -108 │ │ │ │ -109 │ │ │ │ -_1_1_1 bool _o_p_e_r_a_t_o_r_!_=(const _C_i_r_c_u_l_a_t_o_r_T& _rhs) const { │ │ │ │ -112 return !_o_p_e_r_a_t_o_r_=_=(_rhs); │ │ │ │ -113 } │ │ │ │ -114 │ │ │ │ -115 │ │ │ │ -_1_1_7 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_+_+() { │ │ │ │ -118 assert(mesh_); │ │ │ │ -119 active_ = true; │ │ │ │ -120 increment; │ │ │ │ -121 return *this; │ │ │ │ -122 } │ │ │ │ -123 │ │ │ │ -124 │ │ │ │ -_1_2_6 _C_i_r_c_u_l_a_t_o_r_T& _o_p_e_r_a_t_o_r_-_-() { │ │ │ │ -127 assert(mesh_); │ │ │ │ -128 active_ = true; │ │ │ │ -129 decrement; │ │ │ │ -130 return *this; │ │ │ │ -131 } │ │ │ │ -132 │ │ │ │ +87 │ │ │ │ +88 │ │ │ │ +89//--- Template "if" w/ partial specialization ------------------------------- │ │ │ │ +-- │ │ │ │ +90#if OM_PARTIAL_SPECIALIZATION │ │ │ │ +91 │ │ │ │ +92 │ │ │ │ +93template │ │ │ │ +94struct IF { typedef Then Result; }; │ │ │ │ +95 │ │ │ │ +101template │ │ │ │ +102struct IF { typedef Else Result; }; │ │ │ │ +103 │ │ │ │ +104 │ │ │ │ +105 │ │ │ │ +106 │ │ │ │ +107 │ │ │ │ +108//--- Template "if" w/o partial specialization ----------------------------- │ │ │ │ +--- │ │ │ │ +109#else │ │ │ │ +110 │ │ │ │ +111 │ │ │ │ +112struct SelectThen │ │ │ │ +113{ │ │ │ │ +114 template struct Select { │ │ │ │ +115 typedef Then Result; │ │ │ │ +116 }; │ │ │ │ +117}; │ │ │ │ +118 │ │ │ │ +119struct SelectElse │ │ │ │ +120{ │ │ │ │ +121 template struct Select { │ │ │ │ +122 typedef Else Result; │ │ │ │ +123 }; │ │ │ │ +124}; │ │ │ │ +125 │ │ │ │ +126template struct ChooseSelector { │ │ │ │ +127 typedef SelectThen Result; │ │ │ │ +128}; │ │ │ │ +129 │ │ │ │ +130template <> struct ChooseSelector { │ │ │ │ +131 typedef SelectElse Result; │ │ │ │ +132}; │ │ │ │ 133 │ │ │ │ -_1_3_8 HalfedgeHandle _c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e() const { │ │ │ │ -139 return heh_; │ │ │ │ -140 } │ │ │ │ -141 │ │ │ │ -142 │ │ │ │ -_1_4_4 TargetHandle _h_a_n_d_l_e() const { │ │ │ │ -145 assert(mesh_); │ │ │ │ -146 return get_handle; │ │ │ │ -147 } │ │ │ │ +134 │ │ │ │ +141template │ │ │ │ +142class IF │ │ │ │ +143{ │ │ │ │ +144 typedef typename ChooseSelector::Result Selector; │ │ │ │ +145public: │ │ │ │ +146 typedef typename Selector::template Select::Result Result; │ │ │ │ +147}; │ │ │ │ 148 │ │ │ │ -149 │ │ │ │ -_1_5_1 operator TargetHandle() const { │ │ │ │ -152 assert(mesh_); │ │ │ │ -153 return get_handle; │ │ │ │ -154 } │ │ │ │ +149#endif │ │ │ │ +150 │ │ │ │ +151// │ │ │ │ +============================================================================= │ │ │ │ +152#endif │ │ │ │ +153} // namespace GenProg │ │ │ │ +154} // namespace OpenMesh │ │ │ │ 155 │ │ │ │ -156 │ │ │ │ -_1_5_8 reference _o_p_e_r_a_t_o_r_*() const { │ │ │ │ -159 assert(mesh_); │ │ │ │ -160 return mesh_->deref(_h_a_n_d_l_e()); │ │ │ │ -161 } │ │ │ │ -162 │ │ │ │ -163 │ │ │ │ -_1_6_5 pointer _o_p_e_r_a_t_o_r_-_>() const { │ │ │ │ -166 assert(mesh_); │ │ │ │ -167 return &mesh_->deref(_h_a_n_d_l_e()); │ │ │ │ -168 } │ │ │ │ -169 │ │ │ │ -170 │ │ │ │ -_1_7_7 operator bool() const { │ │ │ │ -178 return heh_.is_valid() && ((start_ != heh_) || (!active_)); │ │ │ │ -179 } │ │ │ │ -180 │ │ │ │ -181 │ │ │ │ -182private: │ │ │ │ -183 │ │ │ │ -184 mesh_ptr mesh_; │ │ │ │ -185 HalfedgeHandle start_, heh_; │ │ │ │ -186 bool active_; │ │ │ │ -187}; │ │ │ │ -188 │ │ │ │ -189 │ │ │ │ -190 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:10 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ -CirculatorT & operator++() │ │ │ │ -Pre-Increment (next cw target) │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:117 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -CirculatorT(mesh_ref _mesh, HalfedgeHandle _heh) │ │ │ │ -Construct with mesh and start halfedge. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:49 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ -bool operator==(const CirculatorT &_rhs) const │ │ │ │ -Equal ? │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:102 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -reference operator*() const │ │ │ │ -Return a reference to the current target. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:158 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -CirculatorT(const CirculatorT &_rhs) │ │ │ │ -Copy constructor. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:58 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -CirculatorT() │ │ │ │ -Default constructor. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:36 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ -CirculatorT & operator--() │ │ │ │ -Pre-Decrement (next ccw target) │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:126 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_c_u_r_r_e_n_t___h_a_l_f_e_d_g_e___h_a_n_d_l_e │ │ │ │ -HalfedgeHandle current_halfedge_handle() const │ │ │ │ -Get the current halfedge. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:138 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_h_a_n_d_l_e │ │ │ │ -TargetHandle handle() const │ │ │ │ -Return the handle of the current target. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:144 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ -pointer operator->() const │ │ │ │ -Return a pointer to the current target. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:165 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ -CirculatorT & operator=(const CirculatorT< Mesh > &_rhs) │ │ │ │ -Assignment operator. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:67 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_C_i_r_c_u_l_a_t_o_r_T │ │ │ │ -CirculatorT(mesh_ref _mesh, SourceHandle _start) │ │ │ │ -Construct with mesh and a SourceHandle. │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:40 │ │ │ │ -_C_i_r_c_u_l_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ -bool operator!=(const CirculatorT &_rhs) const │ │ │ │ -Not equal ? │ │ │ │ -DDeeffiinniittiioonn circulators_template.hh:111 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +156#define assert_compile(EXPR) GenProg::AssertCompile<(EXPR)>(); │ │ │ │ +157 │ │ │ │ +158// │ │ │ │ +============================================================================= │ │ │ │ +159#endif // OPENMESH_GENPROG_HH defined │ │ │ │ +160// │ │ │ │ +============================================================================= │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00719_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/gen/iterators_template.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/Predicates.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,194 +92,364 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
iterators_template.hh
│ │ │ +
Predicates.hh
│ │ │
│ │ │
│ │ │ -
1//== CLASS DEFINITION =========================================================
│ │ │ -
2
│ │ │ -
3
│ │ │ -
8template <class Mesh>
│ │ │ -
│ │ │ - │ │ │ -
10{
│ │ │ -
11public:
│ │ │ -
12
│ │ │ -
13
│ │ │ -
14 //--- Typedefs ---
│ │ │ -
15
│ │ │ -
16 typedef TargetType value_type;
│ │ │ -
17 typedef TargetHandle value_handle;
│ │ │ -
18
│ │ │ -
19#if IsConst
│ │ │ -
20 typedef const value_type& reference;
│ │ │ -
21 typedef const value_type* pointer;
│ │ │ -
22 typedef const Mesh* mesh_ptr;
│ │ │ -
23 typedef const Mesh& mesh_ref;
│ │ │ -
24#else
│ │ │ -
25 typedef value_type& reference;
│ │ │ -
26 typedef value_type* pointer;
│ │ │ -
27 typedef Mesh* mesh_ptr;
│ │ │ -
28 typedef Mesh& mesh_ref;
│ │ │ -
29#endif
│ │ │ -
30
│ │ │ -
31
│ │ │ -
32
│ │ │ -
33
│ │ │ -
│ │ │ - │ │ │ -
36 : mesh_(0), skip_bits_(0)
│ │ │ -
37 {}
│ │ │ -
│ │ │ -
38
│ │ │ -
39
│ │ │ -
│ │ │ -
41 IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)
│ │ │ -
42 : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0)
│ │ │ -
43 {
│ │ │ -
44 if (_skip) enable_skipping();
│ │ │ -
45 }
│ │ │ -
│ │ │ -
46
│ │ │ +
1/* ========================================================================= *
│ │ │ +
2 * *
│ │ │ +
3 * OpenMesh *
│ │ │ +
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │ +
5 * Department of Computer Graphics and Multimedia *
│ │ │ +
6 * All rights reserved. *
│ │ │ +
7 * www.openmesh.org *
│ │ │ +
8 * *
│ │ │ +
9 *---------------------------------------------------------------------------*
│ │ │ +
10 * This file is part of OpenMesh. *
│ │ │ +
11 *---------------------------------------------------------------------------*
│ │ │ +
12 * *
│ │ │ +
13 * Redistribution and use in source and binary forms, with or without *
│ │ │ +
14 * modification, are permitted provided that the following conditions *
│ │ │ +
15 * are met: *
│ │ │ +
16 * *
│ │ │ +
17 * 1. Redistributions of source code must retain the above copyright notice, *
│ │ │ +
18 * this list of conditions and the following disclaimer. *
│ │ │ +
19 * *
│ │ │ +
20 * 2. Redistributions in binary form must reproduce the above copyright *
│ │ │ +
21 * notice, this list of conditions and the following disclaimer in the *
│ │ │ +
22 * documentation and/or other materials provided with the distribution. *
│ │ │ +
23 * *
│ │ │ +
24 * 3. Neither the name of the copyright holder nor the names of its *
│ │ │ +
25 * contributors may be used to endorse or promote products derived from *
│ │ │ +
26 * this software without specific prior written permission. *
│ │ │ +
27 * *
│ │ │ +
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
│ │ │ +
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
│ │ │ +
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
│ │ │ +
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
│ │ │ +
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
│ │ │ +
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
│ │ │ +
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
│ │ │ +
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │ +
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │ +
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │ +
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │ +
39 * *
│ │ │ +
40 * ========================================================================= */
│ │ │ +
41
│ │ │ +
42
│ │ │ +
43#pragma once
│ │ │ +
44
│ │ │ +
45#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
46#include <OpenMesh/Core/Utils/PropertyManager.hh>
│ │ │
47
│ │ │ -
│ │ │ -
49 IteratorT(const IteratorT& _rhs)
│ │ │ -
50 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_)
│ │ │ -
51 {}
│ │ │ -
│ │ │ -
52
│ │ │ +
48#include <utility>
│ │ │ +
49#include <array>
│ │ │ +
50#include <vector>
│ │ │ +
51#include <set>
│ │ │ +
52#include <type_traits>
│ │ │
53
│ │ │ -
│ │ │ - │ │ │ -
56 {
│ │ │ -
57 mesh_ = _rhs.mesh_;
│ │ │ -
58 hnd_ = _rhs.hnd_;
│ │ │ -
59 skip_bits_ = _rhs.skip_bits_;
│ │ │ -
60 return *this;
│ │ │ -
61 }
│ │ │ -
│ │ │ -
62
│ │ │ +
54//== NAMESPACES ===============================================================
│ │ │ +
55
│ │ │ +
56namespace OpenMesh {
│ │ │ +
57
│ │ │ +
58namespace Predicates {
│ │ │ +
59
│ │ │ +
60//== FORWARD DECLARATION ======================================================
│ │ │ +
61
│ │ │ +
62//== CLASS DEFINITION =========================================================
│ │ │
63
│ │ │ -
64#if IsConst
│ │ │ -
65
│ │ │ -
67 IteratorT(const NonConstIterT<Mesh>& _rhs)
│ │ │ -
68 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_)
│ │ │ -
69 {}
│ │ │ -
70
│ │ │ -
71
│ │ │ -
73 IteratorT& operator=(const NonConstIterT<Mesh>& _rhs)
│ │ │ -
74 {
│ │ │ -
75 mesh_ = _rhs.mesh_;
│ │ │ -
76 hnd_ = _rhs.hnd_;
│ │ │ -
77 skip_bits_ = _rhs.skip_bits_;
│ │ │ -
78 return *this;
│ │ │ -
79 }
│ │ │ -
80
│ │ │ -
81#else
│ │ │ -
82 friend class ConstIterT<Mesh>;
│ │ │ -
83#endif
│ │ │ -
84
│ │ │ +
64template <typename PredicateT>
│ │ │ +
│ │ │ + │ │ │ +
66{
│ │ │ +
67};
│ │ │ +
│ │ │ +
68
│ │ │ +
69template <typename PredicateT>
│ │ │ +
│ │ │ +
70struct Predicate : public PredicateBase<Predicate<PredicateT>>
│ │ │ +
71{
│ │ │ +
72 Predicate(PredicateT _p)
│ │ │ +
73 :
│ │ │ +
74 p_(_p)
│ │ │ +
75 {}
│ │ │ +
76
│ │ │ +
77 template <typename T>
│ │ │ +
78 bool operator()(const T& _t) const { return p_(_t); }
│ │ │ +
79
│ │ │ +
80 PredicateT p_;
│ │ │ +
81};
│ │ │ +
│ │ │ +
82
│ │ │ +
83template <typename PredicateT>
│ │ │ +
84Predicate<const PredicateT&> make_predicate(PredicateT& _p) { return { _p }; }
│ │ │
85
│ │ │ -
87 reference operator*() const { return mesh_->deref(hnd_); }
│ │ │ -
88
│ │ │ -
90 pointer operator->() const { return &(mesh_->deref(hnd_)); }
│ │ │ -
91
│ │ │ -
93 value_handle handle() const { return hnd_; }
│ │ │ -
94
│ │ │ -
96 operator value_handle() const { return hnd_; }
│ │ │ +
86template <typename PredicateT>
│ │ │ +
87Predicate<PredicateT> make_predicate(PredicateT&& _p) { return { _p }; }
│ │ │ +
88
│ │ │ +
89template <typename Predicate1T, typename Predicate2T>
│ │ │ +
│ │ │ +
90struct Disjunction : public PredicateBase<Disjunction<Predicate1T, Predicate2T>>
│ │ │ +
91{
│ │ │ +
92 Disjunction(Predicate1T _p1, Predicate2T _p2)
│ │ │ +
93 :
│ │ │ +
94 p1_(_p1),
│ │ │ +
95 p2_(_p2)
│ │ │ +
96 {}
│ │ │
97
│ │ │ -
│ │ │ -
99 bool operator==(const IteratorT& _rhs) const
│ │ │ -
100 { return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_)); }
│ │ │ -
│ │ │ -
101
│ │ │ -
│ │ │ -
103 bool operator!=(const IteratorT& _rhs) const
│ │ │ -
104 { return !operator==(_rhs); }
│ │ │ -
│ │ │ -
105
│ │ │ -
│ │ │ - │ │ │ -
108 { hnd_.__increment(); if (skip_bits_) skip_fwd(); return *this; }
│ │ │ -
│ │ │ -
109
│ │ │ -
│ │ │ - │ │ │ -
112 { hnd_.__decrement(); if (skip_bits_) skip_bwd(); return *this; }
│ │ │ -
│ │ │ -
113
│ │ │ -
114
│ │ │ -
│ │ │ - │ │ │ -
117 {
│ │ │ -
118 if (mesh_ && mesh_->has_element_status())
│ │ │ -
119 {
│ │ │ -
120 Attributes::StatusInfo status;
│ │ │ -
121 status.set_deleted(true);
│ │ │ -
122 status.set_hidden(true);
│ │ │ -
123 skip_bits_ = status.bits();
│ │ │ -
124 skip_fwd();
│ │ │ -
125 }
│ │ │ -
126 else skip_bits_ = 0;
│ │ │ -
127 }
│ │ │ -
│ │ │ -
128
│ │ │ +
98 template <typename T>
│ │ │ +
99 bool operator()(const T& _t) const { return p1_( _t) || p2_( _t); }
│ │ │ +
100
│ │ │ +
101 Predicate1T p1_;
│ │ │ +
102 Predicate2T p2_;
│ │ │ +
103};
│ │ │ +
│ │ │ +
104
│ │ │ +
105template <typename Predicate1T, typename Predicate2T>
│ │ │ +
│ │ │ +
106struct Conjunction : public PredicateBase<Conjunction<Predicate1T, Predicate2T>>
│ │ │ +
107{
│ │ │ +
108 Conjunction(Predicate1T _p1, Predicate2T _p2)
│ │ │ +
109 :
│ │ │ +
110 p1_(_p1),
│ │ │ +
111 p2_(_p2)
│ │ │ +
112 {}
│ │ │ +
113
│ │ │ +
114 template <typename T>
│ │ │ +
115 bool operator()(const T& _t) const { return p1_( _t) && p2_( _t); }
│ │ │ +
116
│ │ │ +
117 Predicate1T p1_;
│ │ │ +
118 Predicate2T p2_;
│ │ │ +
119};
│ │ │ +
│ │ │ +
120
│ │ │ +
121
│ │ │ +
122template <typename PredicateT>
│ │ │ +
│ │ │ +
123struct Negation : public PredicateBase<Negation<PredicateT>>
│ │ │ +
124{
│ │ │ +
125 Negation(const PredicateT& _p1)
│ │ │ +
126 :
│ │ │ +
127 p1_(_p1)
│ │ │ +
128 {}
│ │ │
129
│ │ │ -
131 void disable_skipping() { skip_bits_ = 0; }
│ │ │ +
130 template <typename T>
│ │ │ +
131 bool operator()(const T& _t) const { return !p1_( _t); }
│ │ │
132
│ │ │ -
133
│ │ │ -
134
│ │ │ -
135private:
│ │ │ -
136
│ │ │ -
137 void skip_fwd()
│ │ │ -
138 {
│ │ │ -
139 assert(mesh_ && skip_bits_);
│ │ │ -
140 while ((hnd_.idx() < (signed) mesh_->n_elements()) &&
│ │ │ -
141 (mesh_->status(hnd_).bits() & skip_bits_))
│ │ │ -
142 hnd_.__increment();
│ │ │ -
143 }
│ │ │ -
144
│ │ │ -
145
│ │ │ -
146 void skip_bwd()
│ │ │ -
147 {
│ │ │ -
148 assert(mesh_ && skip_bits_);
│ │ │ -
149 while ((hnd_.idx() >= 0) &&
│ │ │ -
150 (mesh_->status(hnd_).bits() & skip_bits_))
│ │ │ -
151 hnd_.__decrement();
│ │ │ -
152 }
│ │ │ +
133 PredicateT p1_;
│ │ │ +
134};
│ │ │ +
│ │ │ +
135
│ │ │ +
136template <typename P1, typename P2>
│ │ │ + │ │ │ +
138{
│ │ │ +
139 return Disjunction<const P1&, const P2&>(static_cast<const P1&>(p1), static_cast<const P2&>(p2));
│ │ │ +
140}
│ │ │ +
141
│ │ │ +
142template <typename P1, typename P2>
│ │ │ +
143Disjunction<const P1&, P2> operator||(PredicateBase<P1>& p1, PredicateBase<P2>&& p2)
│ │ │ +
144{
│ │ │ +
145 return Disjunction<const P1&, P2>(static_cast<const P1&>(p1), static_cast<P2&&>(p2));
│ │ │ +
146}
│ │ │ +
147
│ │ │ +
148template <typename P1, typename P2>
│ │ │ +
149Disjunction<P1, const P2&> operator||(PredicateBase<P1>&& p1, PredicateBase<P2>& p2)
│ │ │ +
150{
│ │ │ +
151 return Disjunction<P1, const P2&>(static_cast<P1&&>(p1), static_cast<const P2&>(p2));
│ │ │ +
152}
│ │ │
153
│ │ │ -
154
│ │ │ -
155
│ │ │ -
156private:
│ │ │ -
157 mesh_ptr mesh_;
│ │ │ -
158 value_handle hnd_;
│ │ │ -
159 unsigned int skip_bits_;
│ │ │ -
160};
│ │ │ -
│ │ │ -
161
│ │ │ -
162
│ │ │ -
Linear iterator.
Definition iterators_template.hh:10
│ │ │ -
bool operator!=(const IteratorT &_rhs) const
Not equal?
Definition iterators_template.hh:103
│ │ │ -
IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false)
Construct with mesh and a target handle.
Definition iterators_template.hh:41
│ │ │ -
IteratorT & operator=(const IteratorT< Mesh > &_rhs)
Assignment operator.
Definition iterators_template.hh:55
│ │ │ -
IteratorT()
Default constructor.
Definition iterators_template.hh:35
│ │ │ -
void disable_skipping()
Turn on skipping: automatically skip deleted/hidden elements.
Definition iterators_template.hh:131
│ │ │ -
IteratorT & operator++()
Standard pre-increment operator.
Definition iterators_template.hh:107
│ │ │ -
IteratorT & operator--()
Standard pre-decrement operator.
Definition iterators_template.hh:111
│ │ │ -
bool operator==(const IteratorT &_rhs) const
Are two iterators equal? Only valid if they refer to the same mesh!
Definition iterators_template.hh:99
│ │ │ -
IteratorT(const IteratorT &_rhs)
Copy constructor.
Definition iterators_template.hh:49
│ │ │ -
reference operator*() const
Standard dereferencing operator.
Definition iterators_template.hh:87
│ │ │ -
value_handle handle() const
Get the handle of the item the iterator refers to.
Definition iterators_template.hh:93
│ │ │ -
void enable_skipping()
Turn on skipping: automatically skip deleted/hidden elements.
Definition iterators_template.hh:116
│ │ │ -
pointer operator->() const
Standard pointer operator.
Definition iterators_template.hh:90
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
154template <typename P1, typename P2>
│ │ │ +
155Disjunction<P1, P2> operator||(PredicateBase<P1>&& p1, PredicateBase<P2>&& p2)
│ │ │ +
156{
│ │ │ +
157 return Disjunction<P1, P2>(static_cast<P1&&>(p1), static_cast<P2&&>(p2));
│ │ │ +
158}
│ │ │ +
159
│ │ │ +
160template <typename P1, typename P2>
│ │ │ +
161Conjunction<const P1&, const P2&> operator&&(PredicateBase<P1>& p1, PredicateBase<P2>& p2)
│ │ │ +
162{
│ │ │ +
163 return Conjunction<const P1&, const P2&>(static_cast<const P1&>(p1), static_cast<const P2&>(p2));
│ │ │ +
164}
│ │ │ +
165
│ │ │ +
166template <typename P1, typename P2>
│ │ │ +
167Conjunction<const P1&, P2> operator&&(PredicateBase<P1>& p1, PredicateBase<P2>&& p2)
│ │ │ +
168{
│ │ │ +
169 return Conjunction<const P1&, P2>(static_cast<const P1&>(p1), static_cast<P2&&>(p2));
│ │ │ +
170}
│ │ │ +
171
│ │ │ +
172template <typename P1, typename P2>
│ │ │ +
173Conjunction<P1, const P2&> operator&&(PredicateBase<P1>&& p1, PredicateBase<P2>& p2)
│ │ │ +
174{
│ │ │ +
175 return Conjunction<P1, const P2&>(static_cast<P1>(p1), static_cast<const P2&>(p2));
│ │ │ +
176}
│ │ │ +
177
│ │ │ +
178template <typename P1, typename P2>
│ │ │ +
179Conjunction<P1, P2> operator&&(PredicateBase<P1>&& p1, PredicateBase<P2>&& p2)
│ │ │ +
180{
│ │ │ +
181 return Conjunction<P1, P2>(static_cast<P1&&>(p1), static_cast<P2&&>(p2));
│ │ │ +
182}
│ │ │ +
183
│ │ │ +
184template <typename P>
│ │ │ +
185Negation<const P&> operator!(PredicateBase<P>& p)
│ │ │ +
186{
│ │ │ +
187 return Negation<const P&>(static_cast<const P&>(p));
│ │ │ +
188}
│ │ │ +
189
│ │ │ +
190template <typename P>
│ │ │ +
191Negation<P> operator!(PredicateBase<P>&& p)
│ │ │ +
192{
│ │ │ +
193 return Negation<P>(static_cast<P&&>(p));
│ │ │ +
194}
│ │ │ +
195
│ │ │ +
│ │ │ +
196struct Feature : public PredicateBase<Feature>
│ │ │ +
197{
│ │ │ +
198 template <typename HandleType>
│ │ │ +
199 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.feature(); }
│ │ │ +
200};
│ │ │ +
│ │ │ +
201
│ │ │ +
│ │ │ +
202struct Selected : public PredicateBase<Selected>
│ │ │ +
203{
│ │ │ +
204 template <typename HandleType>
│ │ │ +
205 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.selected(); }
│ │ │ +
206};
│ │ │ +
│ │ │ +
207
│ │ │ +
│ │ │ +
208struct Tagged : public PredicateBase<Tagged>
│ │ │ +
209{
│ │ │ +
210 template <typename HandleType>
│ │ │ +
211 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.tagged(); }
│ │ │ +
212};
│ │ │ +
│ │ │ +
213
│ │ │ +
│ │ │ +
214struct Tagged2 : public PredicateBase<Tagged2>
│ │ │ +
215{
│ │ │ +
216 template <typename HandleType>
│ │ │ +
217 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.tagged2(); }
│ │ │ +
218};
│ │ │ +
│ │ │ +
219
│ │ │ +
│ │ │ +
220struct Locked : public PredicateBase<Locked>
│ │ │ +
221{
│ │ │ +
222 template <typename HandleType>
│ │ │ +
223 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.locked(); }
│ │ │ +
224};
│ │ │ +
│ │ │ +
225
│ │ │ +
│ │ │ +
226struct Hidden : public PredicateBase<Hidden>
│ │ │ +
227{
│ │ │ +
228 template <typename HandleType>
│ │ │ +
229 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.hidden(); }
│ │ │ +
230};
│ │ │ +
│ │ │ +
231
│ │ │ +
│ │ │ +
232struct Deleted : public PredicateBase<Deleted>
│ │ │ +
233{
│ │ │ +
234 template <typename HandleType>
│ │ │ +
235 bool operator()(const SmartHandleStatusPredicates<HandleType>& _h) const { return _h.deleted(); }
│ │ │ +
236};
│ │ │ +
│ │ │ +
237
│ │ │ +
│ │ │ +
238struct Boundary : public PredicateBase<Boundary>
│ │ │ +
239{
│ │ │ +
240 template <typename HandleType>
│ │ │ +
241 bool operator()(const SmartHandleBoundaryPredicate<HandleType>& _h) const { return _h.is_boundary(); }
│ │ │ +
242};
│ │ │ +
│ │ │ +
243
│ │ │ +
244template <int inner_reg, int boundary_reg>
│ │ │ +
│ │ │ +
245struct Regular: public PredicateBase<Regular<inner_reg, boundary_reg>>
│ │ │ +
246{
│ │ │ +
247 bool operator()(const SmartVertexHandle& _vh) const { return _vh.valence() == (_vh.is_boundary() ? boundary_reg : inner_reg); }
│ │ │ +
248};
│ │ │ +
│ │ │ +
249
│ │ │ + │ │ │ + │ │ │ +
252
│ │ │ +
253
│ │ │ +
256template <typename T, typename MF>
│ │ │ +
│ │ │ + │ │ │ +
258{
│ │ │ +
259 T t_; // Objects whose member function we want to call
│ │ │ +
260 MF mf_; // pointer to member function
│ │ │ +
261
│ │ │ +
262 MemberFunctionWrapper(T _t, MF _mf)
│ │ │ +
263 :
│ │ │ +
264 t_(_t),
│ │ │ +
265 mf_(_mf)
│ │ │ +
266 {}
│ │ │ +
267
│ │ │ +
268 template <typename O>
│ │ │ +
269 auto operator()(const O& _o) -> decltype ((t_.*mf_)(_o))
│ │ │ +
270 {
│ │ │ +
271 return (t_.*mf_)(_o);
│ │ │ +
272 }
│ │ │ +
273};
│ │ │ +
│ │ │ +
274
│ │ │ +
276template <typename T, typename MF>
│ │ │ +
277MemberFunctionWrapper<T,MF> make_member_function_wrapper(T&& _t, MF _mf)
│ │ │ +
278{
│ │ │ +
279 return MemberFunctionWrapper<T,MF>(std::forward<T>(_t), _mf);
│ │ │ +
280}
│ │ │ +
281
│ │ │ +
283#define OM_MFW(member_function) OpenMesh::Predicates::make_member_function_wrapper(*this, &std::decay<decltype(*this)>::type::member_function)
│ │ │ +
284
│ │ │ +
285
│ │ │ +
286
│ │ │ +
287//=============================================================================
│ │ │ +
288} // namespace Predicates
│ │ │ +
289
│ │ │ +
290} // namespace OpenMesh
│ │ │ +
291//=============================================================================
│ │ │ +
292
│ │ │ +
293//=============================================================================
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
Base class for all smart handle types that contains status related methods.
Definition SmartHandles.hh:81
│ │ │ +
bool selected() const
Returns true iff the handle is marked as selected.
Definition SmartHandles.hh:302
│ │ │ +
bool feature() const
Returns true iff the handle is marked as feature.
Definition SmartHandles.hh:294
│ │ │ +
bool locked() const
Returns true iff the handle is marked as locked.
Definition SmartHandles.hh:326
│ │ │ +
bool deleted() const
Returns true iff the handle is marked as deleted.
Definition SmartHandles.hh:342
│ │ │ +
bool tagged() const
Returns true iff the handle is marked as tagged.
Definition SmartHandles.hh:310
│ │ │ +
bool tagged2() const
Returns true iff the handle is marked as tagged2.
Definition SmartHandles.hh:318
│ │ │ +
bool hidden() const
Returns true iff the handle is marked as hidden.
Definition SmartHandles.hh:334
│ │ │ +
Base class for all smart handle types that contains status related methods.
Definition SmartHandles.hh:102
│ │ │ +
bool is_boundary() const
Returns true iff the handle is boundary.
Definition SmartHandles.hh:350
│ │ │ +
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ +
uint valence() const
Returns valence of the vertex.
Definition SmartHandles.hh:373
│ │ │ +
Definition Predicates.hh:66
│ │ │ +
Definition Predicates.hh:71
│ │ │ +
Definition Predicates.hh:91
│ │ │ +
Definition Predicates.hh:107
│ │ │ +
Definition Predicates.hh:124
│ │ │ +
Definition Predicates.hh:197
│ │ │ +
Definition Predicates.hh:203
│ │ │ +
Definition Predicates.hh:209
│ │ │ +
Definition Predicates.hh:215
│ │ │ +
Definition Predicates.hh:221
│ │ │ +
Definition Predicates.hh:227
│ │ │ +
Definition Predicates.hh:233
│ │ │ +
Definition Predicates.hh:239
│ │ │ +
Definition Predicates.hh:246
│ │ │ +
Wrapper object to hold an object and a member function pointer, and provides operator() to call that ...
Definition Predicates.hh:258
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,209 +1,418 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -iterators_template.hh │ │ │ │ -1//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -2 │ │ │ │ -3 │ │ │ │ -8template │ │ │ │ -_9class _I_t_e_r_a_t_o_r_T │ │ │ │ -10{ │ │ │ │ -11public: │ │ │ │ -12 │ │ │ │ -13 │ │ │ │ -14 //--- Typedefs --- │ │ │ │ -15 │ │ │ │ -16 typedef TargetType value_type; │ │ │ │ -17 typedef TargetHandle value_handle; │ │ │ │ -18 │ │ │ │ -19#if IsConst │ │ │ │ -20 typedef const value_type& reference; │ │ │ │ -21 typedef const value_type* pointer; │ │ │ │ -22 typedef const _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ -23 typedef const _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ -24#else │ │ │ │ -25 typedef value_type& reference; │ │ │ │ -26 typedef value_type* pointer; │ │ │ │ -27 typedef _M_e_s_h* _m_e_s_h___p_t_r; │ │ │ │ -28 typedef _M_e_s_h& _m_e_s_h___r_e_f; │ │ │ │ -29#endif │ │ │ │ -30 │ │ │ │ -31 │ │ │ │ -32 │ │ │ │ -33 │ │ │ │ -_3_5 _I_t_e_r_a_t_o_r_T() │ │ │ │ -36 : mesh_(0), skip_bits_(0) │ │ │ │ -37 {} │ │ │ │ -38 │ │ │ │ -39 │ │ │ │ -_4_1 _I_t_e_r_a_t_o_r_T(_m_e_s_h___r_e_f _mesh, value_handle _hnd, bool _skip=false) │ │ │ │ -42 : mesh_(&_mesh), hnd_(_hnd), skip_bits_(0) │ │ │ │ -43 { │ │ │ │ -44 if (_skip) _e_n_a_b_l_e___s_k_i_p_p_i_n_g(); │ │ │ │ -45 } │ │ │ │ -46 │ │ │ │ +Predicates.hh │ │ │ │ +1/* ========================================================================= * │ │ │ │ +2 * * │ │ │ │ +3 * OpenMesh * │ │ │ │ +4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ +5 * Department of Computer Graphics and Multimedia * │ │ │ │ +6 * All rights reserved. * │ │ │ │ +7 * www.openmesh.org * │ │ │ │ +8 * * │ │ │ │ +9 *---------------------------------------------------------------------------* │ │ │ │ +10 * This file is part of OpenMesh. * │ │ │ │ +11 *--------------------------------------------------------------------------- │ │ │ │ +* │ │ │ │ +12 * * │ │ │ │ +13 * Redistribution and use in source and binary forms, with or without * │ │ │ │ +14 * modification, are permitted provided that the following conditions * │ │ │ │ +15 * are met: * │ │ │ │ +16 * * │ │ │ │ +17 * 1. Redistributions of source code must retain the above copyright notice, │ │ │ │ +* │ │ │ │ +18 * this list of conditions and the following disclaimer. * │ │ │ │ +19 * * │ │ │ │ +20 * 2. Redistributions in binary form must reproduce the above copyright * │ │ │ │ +21 * notice, this list of conditions and the following disclaimer in the * │ │ │ │ +22 * documentation and/or other materials provided with the distribution. * │ │ │ │ +23 * * │ │ │ │ +24 * 3. Neither the name of the copyright holder nor the names of its * │ │ │ │ +25 * contributors may be used to endorse or promote products derived from * │ │ │ │ +26 * this software without specific prior written permission. * │ │ │ │ +27 * * │ │ │ │ +28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * │ │ │ │ +29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED │ │ │ │ +* │ │ │ │ +30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * │ │ │ │ +31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER │ │ │ │ +* │ │ │ │ +32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * │ │ │ │ +33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * │ │ │ │ +34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * │ │ │ │ +35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * │ │ │ │ +36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ +37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ +38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ +39 * * │ │ │ │ +40 * ========================================================================= │ │ │ │ +*/ │ │ │ │ +41 │ │ │ │ +42 │ │ │ │ +43#pragma once │ │ │ │ +44 │ │ │ │ +45#include │ │ │ │ +46#include │ │ │ │ 47 │ │ │ │ -_4_9 _I_t_e_r_a_t_o_r_T(const _I_t_e_r_a_t_o_r_T& _rhs) │ │ │ │ -50 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_) │ │ │ │ -51 {} │ │ │ │ -52 │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50#include │ │ │ │ +51#include │ │ │ │ +52#include │ │ │ │ 53 │ │ │ │ -_5_5 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const _I_t_e_r_a_t_o_r_T_<_M_e_s_h_>& _rhs) │ │ │ │ -56 { │ │ │ │ -57 mesh_ = _rhs.mesh_; │ │ │ │ -58 hnd_ = _rhs.hnd_; │ │ │ │ -59 skip_bits_ = _rhs.skip_bits_; │ │ │ │ -60 return *this; │ │ │ │ -61 } │ │ │ │ -62 │ │ │ │ +54//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +55 │ │ │ │ +56namespace _O_p_e_n_M_e_s_h { │ │ │ │ +57 │ │ │ │ +58namespace Predicates { │ │ │ │ +59 │ │ │ │ +60//== FORWARD DECLARATION │ │ │ │ +====================================================== │ │ │ │ +61 │ │ │ │ +62//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ 63 │ │ │ │ -64#if IsConst │ │ │ │ -65 │ │ │ │ -67 _I_t_e_r_a_t_o_r_T(const NonConstIterT& _rhs) │ │ │ │ -68 : mesh_(_rhs.mesh_), hnd_(_rhs.hnd_), skip_bits_(_rhs.skip_bits_) │ │ │ │ -69 {} │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -73 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_=(const NonConstIterT& _rhs) │ │ │ │ -74 { │ │ │ │ -75 mesh_ = _rhs.mesh_; │ │ │ │ -76 hnd_ = _rhs.hnd_; │ │ │ │ -77 skip_bits_ = _rhs.skip_bits_; │ │ │ │ -78 return *this; │ │ │ │ -79 } │ │ │ │ -80 │ │ │ │ -81#else │ │ │ │ -82 friend class ConstIterT; │ │ │ │ -83#endif │ │ │ │ -84 │ │ │ │ +64template │ │ │ │ +_6_5struct _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +66{ │ │ │ │ +67}; │ │ │ │ +68 │ │ │ │ +69template │ │ │ │ +_7_0struct _P_r_e_d_i_c_a_t_e : public _P_r_e_d_i_c_a_t_e_B_a_s_e> │ │ │ │ +71{ │ │ │ │ +72 _P_r_e_d_i_c_a_t_e(PredicateT _p) │ │ │ │ +73 : │ │ │ │ +74 p_(_p) │ │ │ │ +75 {} │ │ │ │ +76 │ │ │ │ +77 template │ │ │ │ +78 bool operator()(const T& _t) const { return p_(_t); } │ │ │ │ +79 │ │ │ │ +80 PredicateT p_; │ │ │ │ +81}; │ │ │ │ +82 │ │ │ │ +83template │ │ │ │ +84_P_r_e_d_i_c_a_t_e_<_c_o_n_s_t_ _P_r_e_d_i_c_a_t_e_T_&_> make_predicate(PredicateT& _p) { return { _p }; │ │ │ │ +} │ │ │ │ 85 │ │ │ │ -_8_7 reference _o_p_e_r_a_t_o_r_*() const { return mesh_->deref(hnd_); } │ │ │ │ +86template │ │ │ │ +87Predicate make_predicate(PredicateT&& _p) { return { _p }; } │ │ │ │ 88 │ │ │ │ -_9_0 pointer _o_p_e_r_a_t_o_r_-_>() const { return &(mesh_->deref(hnd_)); } │ │ │ │ -91 │ │ │ │ -_9_3 value_handle _h_a_n_d_l_e() const { return hnd_; } │ │ │ │ -94 │ │ │ │ -_9_6 operator value_handle() const { return hnd_; } │ │ │ │ +89template │ │ │ │ +_9_0struct _D_i_s_j_u_n_c_t_i_o_n : public _P_r_e_d_i_c_a_t_e_B_a_s_e> │ │ │ │ +91{ │ │ │ │ +92 _D_i_s_j_u_n_c_t_i_o_n(Predicate1T _p1, Predicate2T _p2) │ │ │ │ +93 : │ │ │ │ +94 p1_(_p1), │ │ │ │ +95 p2_(_p2) │ │ │ │ +96 {} │ │ │ │ 97 │ │ │ │ -_9_9 bool _o_p_e_r_a_t_o_r_=_=(const _I_t_e_r_a_t_o_r_T& _rhs) const │ │ │ │ -100 { return ((mesh_ == _rhs.mesh_) && (hnd_ == _rhs.hnd_)); } │ │ │ │ -101 │ │ │ │ -_1_0_3 bool _o_p_e_r_a_t_o_r_!_=(const _I_t_e_r_a_t_o_r_T& _rhs) const │ │ │ │ -104 { return !_o_p_e_r_a_t_o_r_=_=(_rhs); } │ │ │ │ -105 │ │ │ │ -_1_0_7 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_+_+() │ │ │ │ -108 { hnd_.__increment(); if (skip_bits_) skip_fwd(); return *this; } │ │ │ │ -109 │ │ │ │ -_1_1_1 _I_t_e_r_a_t_o_r_T& _o_p_e_r_a_t_o_r_-_-() │ │ │ │ -112 { hnd_.__decrement(); if (skip_bits_) skip_bwd(); return *this; } │ │ │ │ +98 template │ │ │ │ +99 bool operator()(const T& _t) const { return p1_( _t) || p2_( _t); } │ │ │ │ +100 │ │ │ │ +101 Predicate1T p1_; │ │ │ │ +102 Predicate2T p2_; │ │ │ │ +103}; │ │ │ │ +104 │ │ │ │ +105template │ │ │ │ +_1_0_6struct _C_o_n_j_u_n_c_t_i_o_n : public _P_r_e_d_i_c_a_t_e_B_a_s_e> │ │ │ │ +107{ │ │ │ │ +108 _C_o_n_j_u_n_c_t_i_o_n(Predicate1T _p1, Predicate2T _p2) │ │ │ │ +109 : │ │ │ │ +110 p1_(_p1), │ │ │ │ +111 p2_(_p2) │ │ │ │ +112 {} │ │ │ │ 113 │ │ │ │ -114 │ │ │ │ -_1_1_6 void _e_n_a_b_l_e___s_k_i_p_p_i_n_g() │ │ │ │ -117 { │ │ │ │ -118 if (mesh_ && mesh_->has_element_status()) │ │ │ │ -119 { │ │ │ │ -120 Attributes::StatusInfo status; │ │ │ │ -121 status.set_deleted(true); │ │ │ │ -122 status.set_hidden(true); │ │ │ │ -123 skip_bits_ = status.bits(); │ │ │ │ -124 skip_fwd(); │ │ │ │ -125 } │ │ │ │ -126 else skip_bits_ = 0; │ │ │ │ -127 } │ │ │ │ -128 │ │ │ │ +114 template │ │ │ │ +115 bool operator()(const T& _t) const { return p1_( _t) && p2_( _t); } │ │ │ │ +116 │ │ │ │ +117 Predicate1T p1_; │ │ │ │ +118 Predicate2T p2_; │ │ │ │ +119}; │ │ │ │ +120 │ │ │ │ +121 │ │ │ │ +122template │ │ │ │ +_1_2_3struct _N_e_g_a_t_i_o_n : public _P_r_e_d_i_c_a_t_e_B_a_s_e> │ │ │ │ +124{ │ │ │ │ +125 _N_e_g_a_t_i_o_n(const PredicateT& _p1) │ │ │ │ +126 : │ │ │ │ +127 p1_(_p1) │ │ │ │ +128 {} │ │ │ │ 129 │ │ │ │ -_1_3_1 void _d_i_s_a_b_l_e___s_k_i_p_p_i_n_g() { skip_bits_ = 0; } │ │ │ │ +130 template │ │ │ │ +131 bool operator()(const T& _t) const { return !p1_( _t); } │ │ │ │ 132 │ │ │ │ -133 │ │ │ │ -134 │ │ │ │ -135private: │ │ │ │ -136 │ │ │ │ -137 void skip_fwd() │ │ │ │ -138 { │ │ │ │ -139 assert(mesh_ && skip_bits_); │ │ │ │ -140 while ((hnd_.idx() < (signed) mesh_->n_elements()) && │ │ │ │ -141 (mesh_->status(hnd_).bits() & skip_bits_)) │ │ │ │ -142 hnd_.__increment(); │ │ │ │ -143 } │ │ │ │ -144 │ │ │ │ -145 │ │ │ │ -146 void skip_bwd() │ │ │ │ -147 { │ │ │ │ -148 assert(mesh_ && skip_bits_); │ │ │ │ -149 while ((hnd_.idx() >= 0) && │ │ │ │ -150 (mesh_->status(hnd_).bits() & skip_bits_)) │ │ │ │ -151 hnd_.__decrement(); │ │ │ │ -152 } │ │ │ │ +133 PredicateT p1_; │ │ │ │ +134}; │ │ │ │ +135 │ │ │ │ +136template │ │ │ │ +137_D_i_s_j_u_n_c_t_i_o_n_<_c_o_n_s_t_ _P_1_&_,_ _c_o_n_s_t_ _P_2_&_> operator||(_P_r_e_d_i_c_a_t_e_B_a_s_e_<_P_1_>& p1, │ │ │ │ +_P_r_e_d_i_c_a_t_e_B_a_s_e_<_P_2_>& p2) │ │ │ │ +138{ │ │ │ │ +139 return _D_i_s_j_u_n_c_t_i_o_n_<_c_o_n_s_t_ _P_1_&_,_ _c_o_n_s_t_ _P_2_&_>(static_cast(p1), │ │ │ │ +static_cast(p2)); │ │ │ │ +140} │ │ │ │ +141 │ │ │ │ +142template │ │ │ │ +143Disjunction operator||(PredicateBase& p1, │ │ │ │ +PredicateBase&& p2) │ │ │ │ +144{ │ │ │ │ +145 return Disjunction(static_cast(p1), │ │ │ │ +static_cast(p2)); │ │ │ │ +146} │ │ │ │ +147 │ │ │ │ +148template │ │ │ │ +149Disjunction operator||(PredicateBase&& p1, │ │ │ │ +PredicateBase& p2) │ │ │ │ +150{ │ │ │ │ +151 return Disjunction(static_cast(p1), static_cast(p2)); │ │ │ │ +152} │ │ │ │ 153 │ │ │ │ -154 │ │ │ │ -155 │ │ │ │ -156private: │ │ │ │ -157 mesh_ptr mesh_; │ │ │ │ -158 value_handle hnd_; │ │ │ │ -159 unsigned int skip_bits_; │ │ │ │ -160}; │ │ │ │ -161 │ │ │ │ -162 │ │ │ │ -_I_t_e_r_a_t_o_r_T │ │ │ │ -Linear iterator. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:10 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ -bool operator!=(const IteratorT &_rhs) const │ │ │ │ -Not equal? │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:103 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_I_t_e_r_a_t_o_r_T │ │ │ │ -IteratorT(mesh_ref _mesh, value_handle _hnd, bool _skip=false) │ │ │ │ -Construct with mesh and a target handle. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:41 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ -IteratorT & operator=(const IteratorT< Mesh > &_rhs) │ │ │ │ -Assignment operator. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:55 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_I_t_e_r_a_t_o_r_T │ │ │ │ -IteratorT() │ │ │ │ -Default constructor. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:35 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_d_i_s_a_b_l_e___s_k_i_p_p_i_n_g │ │ │ │ -void disable_skipping() │ │ │ │ -Turn on skipping: automatically skip deleted/hidden elements. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:131 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ -IteratorT & operator++() │ │ │ │ -Standard pre-increment operator. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:107 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_- │ │ │ │ -IteratorT & operator--() │ │ │ │ -Standard pre-decrement operator. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:111 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ -bool operator==(const IteratorT &_rhs) const │ │ │ │ -Are two iterators equal? Only valid if they refer to the same mesh! │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:99 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_I_t_e_r_a_t_o_r_T │ │ │ │ -IteratorT(const IteratorT &_rhs) │ │ │ │ -Copy constructor. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:49 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -reference operator*() const │ │ │ │ -Standard dereferencing operator. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:87 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_h_a_n_d_l_e │ │ │ │ -value_handle handle() const │ │ │ │ -Get the handle of the item the iterator refers to. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:93 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_e_n_a_b_l_e___s_k_i_p_p_i_n_g │ │ │ │ -void enable_skipping() │ │ │ │ -Turn on skipping: automatically skip deleted/hidden elements. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:116 │ │ │ │ -_I_t_e_r_a_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_> │ │ │ │ -pointer operator->() const │ │ │ │ -Standard pointer operator. │ │ │ │ -DDeeffiinniittiioonn iterators_template.hh:90 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +154template │ │ │ │ +155Disjunction operator||(PredicateBase&& p1, PredicateBase&& │ │ │ │ +p2) │ │ │ │ +156{ │ │ │ │ +157 return Disjunction(static_cast(p1), static_cast(p2)); │ │ │ │ +158} │ │ │ │ +159 │ │ │ │ +160template │ │ │ │ +161Conjunction operator&&(PredicateBase& p1, │ │ │ │ +PredicateBase& p2) │ │ │ │ +162{ │ │ │ │ +163 return Conjunction(static_cast(p1), │ │ │ │ +static_cast(p2)); │ │ │ │ +164} │ │ │ │ +165 │ │ │ │ +166template │ │ │ │ +167Conjunction operator&&(PredicateBase& p1, │ │ │ │ +PredicateBase&& p2) │ │ │ │ +168{ │ │ │ │ +169 return Conjunction(static_cast(p1), │ │ │ │ +static_cast(p2)); │ │ │ │ +170} │ │ │ │ +171 │ │ │ │ +172template │ │ │ │ +173Conjunction operator&&(PredicateBase&& p1, │ │ │ │ +PredicateBase& p2) │ │ │ │ +174{ │ │ │ │ +175 return Conjunction(static_cast(p1), static_cast(p2)); │ │ │ │ +176} │ │ │ │ +177 │ │ │ │ +178template │ │ │ │ +179Conjunction operator&&(PredicateBase&& p1, PredicateBase&& │ │ │ │ +p2) │ │ │ │ +180{ │ │ │ │ +181 return Conjunction(static_cast(p1), static_cast(p2)); │ │ │ │ +182} │ │ │ │ +183 │ │ │ │ +184template │ │ │ │ +185Negation operator!(PredicateBase

& p) │ │ │ │ +186{ │ │ │ │ +187 return Negation(static_cast(p)); │ │ │ │ +188} │ │ │ │ +189 │ │ │ │ +190template │ │ │ │ +191Negation

operator!(PredicateBase

&& p) │ │ │ │ +192{ │ │ │ │ +193 return Negation

(static_cast(p)); │ │ │ │ +194} │ │ │ │ +195 │ │ │ │ +_1_9_6struct _F_e_a_t_u_r_e : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +197{ │ │ │ │ +198 template │ │ │ │ +199 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._f_e_a_t_u_r_e(); } │ │ │ │ +200}; │ │ │ │ +201 │ │ │ │ +_2_0_2struct _S_e_l_e_c_t_e_d : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +203{ │ │ │ │ +204 template │ │ │ │ +205 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._s_e_l_e_c_t_e_d(); } │ │ │ │ +206}; │ │ │ │ +207 │ │ │ │ +_2_0_8struct _T_a_g_g_e_d : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +209{ │ │ │ │ +210 template │ │ │ │ +211 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._t_a_g_g_e_d(); } │ │ │ │ +212}; │ │ │ │ +213 │ │ │ │ +_2_1_4struct _T_a_g_g_e_d_2 : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +215{ │ │ │ │ +216 template │ │ │ │ +217 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._t_a_g_g_e_d_2(); } │ │ │ │ +218}; │ │ │ │ +219 │ │ │ │ +_2_2_0struct _L_o_c_k_e_d : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +221{ │ │ │ │ +222 template │ │ │ │ +223 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._l_o_c_k_e_d(); } │ │ │ │ +224}; │ │ │ │ +225 │ │ │ │ +_2_2_6struct _H_i_d_d_e_n : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +227{ │ │ │ │ +228 template │ │ │ │ +229 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._h_i_d_d_e_n(); } │ │ │ │ +230}; │ │ │ │ +231 │ │ │ │ +_2_3_2struct _D_e_l_e_t_e_d : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +233{ │ │ │ │ +234 template │ │ │ │ +235 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._d_e_l_e_t_e_d(); } │ │ │ │ +236}; │ │ │ │ +237 │ │ │ │ +_2_3_8struct _B_o_u_n_d_a_r_y : public _P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +239{ │ │ │ │ +240 template │ │ │ │ +241 bool operator()(const _S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e_<_H_a_n_d_l_e_T_y_p_e_>& _h) const │ │ │ │ +{ return _h._i_s___b_o_u_n_d_a_r_y(); } │ │ │ │ +242}; │ │ │ │ +243 │ │ │ │ +244template │ │ │ │ +_2_4_5struct _R_e_g_u_l_a_r: public _P_r_e_d_i_c_a_t_e_B_a_s_e> │ │ │ │ +246{ │ │ │ │ +247 bool operator()(const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e& _vh) const { return _vh._v_a_l_e_n_c_e() │ │ │ │ +== (_vh._i_s___b_o_u_n_d_a_r_y() ? boundary_reg : inner_reg); } │ │ │ │ +248}; │ │ │ │ +249 │ │ │ │ +250using _R_e_g_u_l_a_r_Q_u_a_d = _R_e_g_u_l_a_r_<_4_,_3_>; │ │ │ │ +251using _R_e_g_u_l_a_r_T_r_i = _R_e_g_u_l_a_r_<_6_,_4_>; │ │ │ │ +252 │ │ │ │ +253 │ │ │ │ +256template │ │ │ │ +_2_5_7struct _M_e_m_b_e_r_F_u_n_c_t_i_o_n_W_r_a_p_p_e_r │ │ │ │ +258{ │ │ │ │ +259 T t_; // Objects whose member function we want to call │ │ │ │ +260 MF mf_; // pointer to member function │ │ │ │ +261 │ │ │ │ +262 _M_e_m_b_e_r_F_u_n_c_t_i_o_n_W_r_a_p_p_e_r(T _t, MF _mf) │ │ │ │ +263 : │ │ │ │ +264 t_(_t), │ │ │ │ +265 mf_(_mf) │ │ │ │ +266 {} │ │ │ │ +267 │ │ │ │ +268 template │ │ │ │ +269 auto operator()(const O& _o) -> decltype ((t_.*mf_)(_o)) │ │ │ │ +270 { │ │ │ │ +271 return (t_.*mf_)(_o); │ │ │ │ +272 } │ │ │ │ +273}; │ │ │ │ +274 │ │ │ │ +276template │ │ │ │ +277_M_e_m_b_e_r_F_u_n_c_t_i_o_n_W_r_a_p_p_e_r_<_T_,_M_F_> make_member_function_wrapper(T&& _t, MF _mf) │ │ │ │ +278{ │ │ │ │ +279 return _M_e_m_b_e_r_F_u_n_c_t_i_o_n_W_r_a_p_p_e_r_<_T_,_M_F_>(std::forward(_t), _mf); │ │ │ │ +280} │ │ │ │ +281 │ │ │ │ +283#define OM_MFW(member_function) OpenMesh::Predicates:: │ │ │ │ +make_member_function_wrapper(*this, &std::decay::type:: │ │ │ │ +member_function) │ │ │ │ +284 │ │ │ │ +285 │ │ │ │ +286 │ │ │ │ +287// │ │ │ │ +============================================================================= │ │ │ │ +288} // namespace Predicates │ │ │ │ +289 │ │ │ │ +290} // namespace OpenMesh │ │ │ │ +291// │ │ │ │ +============================================================================= │ │ │ │ +292 │ │ │ │ +293// │ │ │ │ +============================================================================= │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s │ │ │ │ +Base class for all smart handle types that contains status related methods. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_s_e_l_e_c_t_e_d │ │ │ │ +bool selected() const │ │ │ │ +Returns true iff the handle is marked as selected. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:302 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_f_e_a_t_u_r_e │ │ │ │ +bool feature() const │ │ │ │ +Returns true iff the handle is marked as feature. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:294 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_l_o_c_k_e_d │ │ │ │ +bool locked() const │ │ │ │ +Returns true iff the handle is marked as locked. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:326 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_d_e_l_e_t_e_d │ │ │ │ +bool deleted() const │ │ │ │ +Returns true iff the handle is marked as deleted. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:342 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_t_a_g_g_e_d │ │ │ │ +bool tagged() const │ │ │ │ +Returns true iff the handle is marked as tagged. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:310 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_t_a_g_g_e_d_2 │ │ │ │ +bool tagged2() const │ │ │ │ +Returns true iff the handle is marked as tagged2. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:318 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_h_i_d_d_e_n │ │ │ │ +bool hidden() const │ │ │ │ +Returns true iff the handle is marked as hidden. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:334 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ +Base class for all smart handle types that contains status related methods. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:102 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ +bool is_boundary() const │ │ │ │ +Returns true iff the handle is boundary. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:350 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ +allows easier access t... │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e │ │ │ │ +uint valence() const │ │ │ │ +Returns valence of the vertex. │ │ │ │ +DDeeffiinniittiioonn SmartHandles.hh:373 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_P_r_e_d_i_c_a_t_e_B_a_s_e │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:66 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_P_r_e_d_i_c_a_t_e │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:71 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_D_i_s_j_u_n_c_t_i_o_n │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:91 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_C_o_n_j_u_n_c_t_i_o_n │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:107 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_N_e_g_a_t_i_o_n │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:124 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_F_e_a_t_u_r_e │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:197 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_S_e_l_e_c_t_e_d │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:203 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_T_a_g_g_e_d │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:209 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_T_a_g_g_e_d_2 │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:215 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_L_o_c_k_e_d │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:221 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_H_i_d_d_e_n │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:227 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_D_e_l_e_t_e_d │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:233 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_B_o_u_n_d_a_r_y │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:239 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_R_e_g_u_l_a_r │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:246 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_e_d_i_c_a_t_e_s_:_:_M_e_m_b_e_r_F_u_n_c_t_i_o_n_W_r_a_p_p_e_r │ │ │ │ +Wrapper object to hold an object and a member function pointer, and provides │ │ │ │ +operator() to call that ... │ │ │ │ +DDeeffiinniittiioonn Predicates.hh:258 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00722_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/SmartHandles.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/Noncopyable.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │

No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
SmartHandles.hh
│ │ │ +
Noncopyable.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,514 +136,59 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ -
43#error Do not include this directly, include instead PolyConnectivity.hh
│ │ │ -
44#endif//OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE
│ │ │ -
45
│ │ │ -
46#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ -
47
│ │ │ -
48//== NAMESPACES ===============================================================
│ │ │ -
49
│ │ │ -
50namespace OpenMesh {
│ │ │ -
51
│ │ │ -
52//== FORWARD DECLARATION ======================================================
│ │ │ +
42
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Implements the Non-Copyable metapher
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51#ifndef OPENMESH_NONCOPYABLE_HH
│ │ │ +
52#define OPENMESH_NONCOPYABLE_HH
│ │ │
53
│ │ │ -
54struct SmartVertexHandle;
│ │ │ -
55struct SmartHalfedgeHandle;
│ │ │ -
56struct SmartEdgeHandle;
│ │ │ -
57struct SmartFaceHandle;
│ │ │ +
54
│ │ │ +
55//-----------------------------------------------------------------------------
│ │ │ +
56
│ │ │ +
57#include <OpenMesh/Core/System/config.h>
│ │ │
58
│ │ │ -
59
│ │ │ -
60//== CLASS DEFINITION =========================================================
│ │ │ -
61
│ │ │ -
│ │ │ -
63class OPENMESHDLLEXPORT SmartBaseHandle
│ │ │ -
64{
│ │ │ -
65public:
│ │ │ -
66 explicit SmartBaseHandle(const PolyConnectivity* _mesh = nullptr) : mesh_(_mesh) {}
│ │ │ -
67
│ │ │ -
69 const PolyConnectivity* mesh() const { return mesh_; }
│ │ │ -
70
│ │ │ -
71 // TODO: should operators ==, !=, < look at mesh_?
│ │ │ -
72
│ │ │ -
73private:
│ │ │ -
74 const PolyConnectivity* mesh_;
│ │ │ +
59//-----------------------------------------------------------------------------
│ │ │ +
60
│ │ │ +
61namespace OpenMesh {
│ │ │ +
62namespace Utils {
│ │ │ +
63
│ │ │ +
64//-----------------------------------------------------------------------------
│ │ │ +
65
│ │ │ +
│ │ │ + │ │ │ +
72{
│ │ │ +
73public:
│ │ │ +
74 Noncopyable() { }
│ │ │
75
│ │ │ -
76};
│ │ │ -
│ │ │ -
77
│ │ │ -
79template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
81{
│ │ │ -
82public:
│ │ │ -
│ │ │ -
84 bool feature() const;
│ │ │ -
│ │ │ -
86 bool selected() const;
│ │ │ -
│ │ │ -
88 bool tagged() const;
│ │ │ -
│ │ │ -
90 bool tagged2() const;
│ │ │ -
│ │ │ -
92 bool locked() const;
│ │ │ -
│ │ │ -
94 bool hidden() const;
│ │ │ -
│ │ │ -
96 bool deleted() const;
│ │ │ -
97};
│ │ │ -
98
│ │ │ -
100template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
102{
│ │ │ -
103public:
│ │ │ -
│ │ │ -
105 bool is_boundary() const;
│ │ │ -
106};
│ │ │ -
107
│ │ │ -
│ │ │ -
109struct OPENMESHDLLEXPORT SmartVertexHandle : public SmartBaseHandle, VertexHandle, SmartHandleStatusPredicates<SmartVertexHandle>, SmartHandleBoundaryPredicate<SmartVertexHandle>
│ │ │ -
110{
│ │ │ -
111 explicit SmartVertexHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), VertexHandle(_idx) {}
│ │ │ -
112
│ │ │ -
114 SmartHalfedgeHandle out() const;
│ │ │ -
116 SmartHalfedgeHandle halfedge() const; // alias for out
│ │ │ -
118 SmartHalfedgeHandle in() const;
│ │ │ -
119
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
139 PolyConnectivity::ConstVertexIHalfedgeRange incoming_halfedges() const;
│ │ │ -
141 PolyConnectivity::ConstVertexIHalfedgeCWRange incoming_halfedges_cw() const;
│ │ │ -
143 PolyConnectivity::ConstVertexIHalfedgeCCWRange incoming_halfedges_ccw() const;
│ │ │ -
145 PolyConnectivity::ConstVertexIHalfedgeRange incoming_halfedges(HalfedgeHandle _heh) const;
│ │ │ -
147 PolyConnectivity::ConstVertexIHalfedgeCWRange incoming_halfedges_cw(HalfedgeHandle _heh) const;
│ │ │ -
149 PolyConnectivity::ConstVertexIHalfedgeCCWRange incoming_halfedges_ccw(HalfedgeHandle _heh) const;
│ │ │ -
151 PolyConnectivity::ConstVertexOHalfedgeRange outgoing_halfedges() const;
│ │ │ -
153 PolyConnectivity::ConstVertexOHalfedgeCWRange outgoing_halfedges_cw() const;
│ │ │ -
155 PolyConnectivity::ConstVertexOHalfedgeCCWRange outgoing_halfedges_ccw() const;
│ │ │ -
157 PolyConnectivity::ConstVertexOHalfedgeRange outgoing_halfedges(HalfedgeHandle _heh) const;
│ │ │ -
159 PolyConnectivity::ConstVertexOHalfedgeCWRange outgoing_halfedges_cw(HalfedgeHandle _heh) const;
│ │ │ -
161 PolyConnectivity::ConstVertexOHalfedgeCCWRange outgoing_halfedges_ccw(HalfedgeHandle _heh) const;
│ │ │ -
162
│ │ │ -
164 uint valence() const;
│ │ │ -
166 bool is_manifold() const;
│ │ │ -
167};
│ │ │ -
│ │ │ -
168
│ │ │ -
│ │ │ -
169struct OPENMESHDLLEXPORT SmartHalfedgeHandle : public SmartBaseHandle, HalfedgeHandle, SmartHandleStatusPredicates<SmartHalfedgeHandle>, SmartHandleBoundaryPredicate<SmartHalfedgeHandle>
│ │ │ -
170{
│ │ │ -
171 explicit SmartHalfedgeHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), HalfedgeHandle(_idx) {}
│ │ │ -
172
│ │ │ -
174 SmartHalfedgeHandle next() const;
│ │ │ -
176 SmartHalfedgeHandle prev() const;
│ │ │ -
178 SmartHalfedgeHandle opp() const;
│ │ │ -
180 SmartVertexHandle to() const;
│ │ │ -
182 SmartVertexHandle from() const;
│ │ │ -
184 SmartEdgeHandle edge() const;
│ │ │ -
186 SmartFaceHandle face() const;
│ │ │ -
187
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
194};
│ │ │ -
│ │ │ -
195
│ │ │ -
│ │ │ -
196struct OPENMESHDLLEXPORT SmartEdgeHandle : public SmartBaseHandle, EdgeHandle, SmartHandleStatusPredicates<SmartEdgeHandle>, SmartHandleBoundaryPredicate<SmartEdgeHandle>
│ │ │ -
197{
│ │ │ -
198 explicit SmartEdgeHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), EdgeHandle(_idx) {}
│ │ │ -
199
│ │ │ -
201 SmartHalfedgeHandle halfedge(unsigned int _i) const;
│ │ │ -
203 SmartHalfedgeHandle h(unsigned int _i) const;
│ │ │ -
205 SmartHalfedgeHandle h0() const;
│ │ │ -
207 SmartHalfedgeHandle h1() const;
│ │ │ -
209 SmartVertexHandle vertex(unsigned int _i) const;
│ │ │ -
211 SmartVertexHandle v(unsigned int _i) const;
│ │ │ -
213 SmartVertexHandle v0() const;
│ │ │ -
215 SmartVertexHandle v1() const;
│ │ │ -
216
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
225};
│ │ │ -
│ │ │ -
226
│ │ │ -
│ │ │ -
227struct OPENMESHDLLEXPORT SmartFaceHandle : public SmartBaseHandle, FaceHandle, SmartHandleStatusPredicates<SmartFaceHandle>, SmartHandleBoundaryPredicate<SmartFaceHandle>
│ │ │ -
228{
│ │ │ -
229 explicit SmartFaceHandle(int _idx=-1, const PolyConnectivity* _mesh = nullptr) : SmartBaseHandle(_mesh), FaceHandle(_idx) {}
│ │ │ -
230
│ │ │ -
232 SmartHalfedgeHandle halfedge() const;
│ │ │ -
233
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
258
│ │ │ -
260 uint valence() const;
│ │ │ -
261};
│ │ │ -
│ │ │ -
262
│ │ │ -
263
│ │ │ -
265inline SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity* _mesh) { return SmartVertexHandle (_vh.idx(), _mesh); }
│ │ │ -
267inline SmartHalfedgeHandle make_smart(HalfedgeHandle _hh, const PolyConnectivity* _mesh) { return SmartHalfedgeHandle(_hh.idx(), _mesh); }
│ │ │ -
269inline SmartEdgeHandle make_smart(EdgeHandle _eh, const PolyConnectivity* _mesh) { return SmartEdgeHandle (_eh.idx(), _mesh); }
│ │ │ -
271inline SmartFaceHandle make_smart(FaceHandle _fh, const PolyConnectivity* _mesh) { return SmartFaceHandle (_fh.idx(), _mesh); }
│ │ │ -
272
│ │ │ -
274inline SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity& _mesh) { return SmartVertexHandle (_vh.idx(), &_mesh); }
│ │ │ -
276inline SmartHalfedgeHandle make_smart(HalfedgeHandle _hh, const PolyConnectivity& _mesh) { return SmartHalfedgeHandle(_hh.idx(), &_mesh); }
│ │ │ -
278inline SmartEdgeHandle make_smart(EdgeHandle _eh, const PolyConnectivity& _mesh) { return SmartEdgeHandle (_eh.idx(), &_mesh); }
│ │ │ -
280inline SmartFaceHandle make_smart(FaceHandle _fh, const PolyConnectivity& _mesh) { return SmartFaceHandle (_fh.idx(), &_mesh); }
│ │ │ -
281
│ │ │ -
282
│ │ │ -
283// helper to convert Handle Types to Smarthandle Types
│ │ │ -
284template <typename HandleT>
│ │ │ - │ │ │ -
286
│ │ │ -
287template <> struct SmartHandle<VertexHandle> { using type = SmartVertexHandle; };
│ │ │ -
288template <> struct SmartHandle<HalfedgeHandle> { using type = SmartHalfedgeHandle; };
│ │ │ -
289template <> struct SmartHandle<EdgeHandle> { using type = SmartEdgeHandle; };
│ │ │ -
290template <> struct SmartHandle<FaceHandle> { using type = SmartFaceHandle; };
│ │ │ -
291
│ │ │ -
292
│ │ │ -
293template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
295{
│ │ │ -
296 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
297 assert(handle.mesh() != nullptr);
│ │ │ -
298 return handle.mesh()->status(handle).feature();
│ │ │ -
299}
│ │ │ -
│ │ │ -
300
│ │ │ -
301template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
303{
│ │ │ -
304 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
305 assert(handle.mesh() != nullptr);
│ │ │ -
306 return handle.mesh()->status(handle).selected();
│ │ │ -
307}
│ │ │ -
│ │ │ -
308
│ │ │ -
309template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
311{
│ │ │ -
312 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
313 assert(handle.mesh() != nullptr);
│ │ │ -
314 return handle.mesh()->status(handle).tagged();
│ │ │ -
315}
│ │ │ -
│ │ │ -
316
│ │ │ -
317template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
319{
│ │ │ -
320 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
321 assert(handle.mesh() != nullptr);
│ │ │ -
322 return handle.mesh()->status(handle).tagged2();
│ │ │ -
323}
│ │ │ -
│ │ │ -
324
│ │ │ -
325template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
327{
│ │ │ -
328 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
329 assert(handle.mesh() != nullptr);
│ │ │ -
330 return handle.mesh()->status(handle).locked();
│ │ │ -
331}
│ │ │ -
│ │ │ -
332
│ │ │ -
333template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
335{
│ │ │ -
336 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
337 assert(handle.mesh() != nullptr);
│ │ │ -
338 return handle.mesh()->status(handle).hidden();
│ │ │ -
339}
│ │ │ -
│ │ │ -
340
│ │ │ -
341template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
343{
│ │ │ -
344 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
345 assert(handle.mesh() != nullptr);
│ │ │ -
346 return handle.mesh()->status(handle).deleted();
│ │ │ -
347}
│ │ │ -
│ │ │ -
348
│ │ │ -
349template <typename HandleType>
│ │ │ -
│ │ │ - │ │ │ -
351{
│ │ │ -
352 const auto& handle = static_cast<const HandleType&>(*this);
│ │ │ -
353 assert(handle.mesh() != nullptr);
│ │ │ -
354 return handle.mesh()->is_boundary(handle);
│ │ │ -
355}
│ │ │ -
│ │ │ -
│ │ │ -
356
│ │ │ -
│ │ │ - │ │ │ -
358{
│ │ │ -
359 assert(mesh() != nullptr);
│ │ │ -
360 return make_smart(mesh()->halfedge_handle(*this), mesh());
│ │ │ -
361}
│ │ │ -
│ │ │ -
362
│ │ │ -
│ │ │ - │ │ │ -
364{
│ │ │ -
365 return out();
│ │ │ -
366}
│ │ │ -
│ │ │ -
367
│ │ │ -
│ │ │ - │ │ │ -
369{
│ │ │ -
370 return out().opp();
│ │ │ -
371}
│ │ │ -
│ │ │ -
372
│ │ │ -
│ │ │ -
373inline uint SmartVertexHandle::valence() const
│ │ │ -
374{
│ │ │ -
375 assert(mesh() != nullptr);
│ │ │ -
376 return mesh()->valence(*this);
│ │ │ -
377}
│ │ │ -
│ │ │ -
378
│ │ │ -
│ │ │ - │ │ │ -
380{
│ │ │ -
381 assert(mesh() != nullptr);
│ │ │ -
382 return mesh()->is_manifold(*this);
│ │ │ -
383}
│ │ │ -
│ │ │ -
384
│ │ │ -
│ │ │ - │ │ │ -
386{
│ │ │ -
387 assert(mesh() != nullptr);
│ │ │ -
388 return make_smart(mesh()->next_halfedge_handle(*this), mesh());
│ │ │ -
389}
│ │ │ -
│ │ │ -
390
│ │ │ -
│ │ │ - │ │ │ -
392{
│ │ │ -
393 assert(mesh() != nullptr);
│ │ │ -
394 return make_smart(mesh()->prev_halfedge_handle(*this), mesh());
│ │ │ -
395}
│ │ │ -
│ │ │ -
396
│ │ │ -
│ │ │ - │ │ │ -
398{
│ │ │ -
399 assert(mesh() != nullptr);
│ │ │ -
400 return make_smart(mesh()->opposite_halfedge_handle(*this), mesh());
│ │ │ -
401}
│ │ │ -
│ │ │ -
402
│ │ │ -
│ │ │ - │ │ │ -
404{
│ │ │ -
405 assert(mesh() != nullptr);
│ │ │ -
406 return make_smart(mesh()->to_vertex_handle(*this), mesh());
│ │ │ -
407}
│ │ │ -
│ │ │ -
408
│ │ │ -
│ │ │ - │ │ │ -
410{
│ │ │ -
411 assert(mesh() != nullptr);
│ │ │ -
412 return make_smart(mesh()->from_vertex_handle(*this), mesh());
│ │ │ -
413}
│ │ │ -
│ │ │ -
414
│ │ │ -
│ │ │ - │ │ │ -
416{
│ │ │ -
417 assert(mesh() != nullptr);
│ │ │ -
418 return make_smart(mesh()->edge_handle(*this), mesh());
│ │ │ -
419}
│ │ │ -
│ │ │ -
420
│ │ │ -
│ │ │ - │ │ │ -
422{
│ │ │ -
423 assert(mesh() != nullptr);
│ │ │ -
424 return make_smart(mesh()->face_handle(*this), mesh());
│ │ │ -
425}
│ │ │ -
│ │ │ -
426
│ │ │ -
│ │ │ -
427inline SmartHalfedgeHandle SmartEdgeHandle::halfedge(unsigned int _i = 0) const
│ │ │ -
428{
│ │ │ -
429 assert(mesh() != nullptr);
│ │ │ -
430 return make_smart(mesh()->halfedge_handle(*this, _i), mesh());
│ │ │ -
431}
│ │ │ -
│ │ │ -
432
│ │ │ -
│ │ │ -
433inline SmartHalfedgeHandle SmartEdgeHandle::h(unsigned int _i = 0) const
│ │ │ -
434{
│ │ │ -
435 return halfedge(_i);
│ │ │ -
436}
│ │ │ -
│ │ │ -
437
│ │ │ -
│ │ │ - │ │ │ -
439{
│ │ │ -
440 return h(0);
│ │ │ -
441}
│ │ │ -
│ │ │ -
442
│ │ │ -
│ │ │ - │ │ │ -
444{
│ │ │ -
445 return h(1);
│ │ │ -
446}
│ │ │ -
│ │ │ -
447
│ │ │ -
│ │ │ -
448inline SmartVertexHandle SmartEdgeHandle::vertex(unsigned int _i) const
│ │ │ -
449{
│ │ │ -
450 return halfedge(_i).from();
│ │ │ -
451}
│ │ │ -
│ │ │ -
452
│ │ │ -
│ │ │ -
453inline SmartVertexHandle SmartEdgeHandle::v(unsigned int _i) const
│ │ │ -
454{
│ │ │ -
455 return vertex(_i);
│ │ │ -
456}
│ │ │ -
│ │ │ -
457
│ │ │ -
│ │ │ - │ │ │ -
459{
│ │ │ -
460 return v(0);
│ │ │ -
461}
│ │ │ -
│ │ │ -
462
│ │ │ -
│ │ │ - │ │ │ -
464{
│ │ │ -
465 return v(1);
│ │ │ -
466}
│ │ │ -
│ │ │ -
467
│ │ │ -
│ │ │ - │ │ │ -
469{
│ │ │ -
470 assert(mesh() != nullptr);
│ │ │ -
471 return make_smart(mesh()->halfedge_handle(*this), mesh());
│ │ │ -
472}
│ │ │ -
│ │ │ -
473
│ │ │ -
│ │ │ -
474inline uint SmartFaceHandle::valence() const
│ │ │ -
475{
│ │ │ -
476 assert(mesh() != nullptr);
│ │ │ -
477 return mesh()->valence(*this);
│ │ │ -
478}
│ │ │ -
│ │ │ -
479
│ │ │ -
480//=============================================================================
│ │ │ -
481} // namespace OpenMesh
│ │ │ -
482//=============================================================================
│ │ │ -
483
│ │ │ -
484//=============================================================================
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ -
│ │ │ +
76private:
│ │ │ +
78 Noncopyable( const Noncopyable& );
│ │ │ +
79
│ │ │ +
81 const Noncopyable& operator=( const Noncopyable& );
│ │ │ +
82};
│ │ │ +
│ │ │ +
83
│ │ │ +
84//=============================================================================
│ │ │ +
85} // namespace Utils
│ │ │ +
86} // namespace OpenMesh
│ │ │ +
87//=============================================================================
│ │ │ +
88#endif // OPENMESH_NONCOPYABLE_HH
│ │ │ +
89//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Definition SmartHandles.hh:265
│ │ │ -
Generic class for iterator ranges.
Definition PolyConnectivity_inline_impl.hh:92
│ │ │ -
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Connectivity Class for polygonal meshes.
Definition PolyConnectivity.hh:115
│ │ │ -
uint valence(VertexHandle _vh) const
Vertex valence.
Definition PolyConnectivity.cc:1072
│ │ │ -
bool is_manifold(VertexHandle _vh) const
Is (the mesh at) vertex _vh two-manifold ?
Definition PolyConnectivity.cc:84
│ │ │ -
Base class for all smart handle types.
Definition SmartHandles.hh:64
│ │ │ -
const PolyConnectivity * mesh() const
Get the underlying mesh of this handle.
Definition SmartHandles.hh:69
│ │ │ -
Base class for all smart handle types that contains status related methods.
Definition SmartHandles.hh:81
│ │ │ -
bool selected() const
Returns true iff the handle is marked as selected.
Definition SmartHandles.hh:302
│ │ │ -
bool feature() const
Returns true iff the handle is marked as feature.
Definition SmartHandles.hh:294
│ │ │ -
bool locked() const
Returns true iff the handle is marked as locked.
Definition SmartHandles.hh:326
│ │ │ -
bool deleted() const
Returns true iff the handle is marked as deleted.
Definition SmartHandles.hh:342
│ │ │ -
bool tagged() const
Returns true iff the handle is marked as tagged.
Definition SmartHandles.hh:310
│ │ │ -
bool tagged2() const
Returns true iff the handle is marked as tagged2.
Definition SmartHandles.hh:318
│ │ │ -
bool hidden() const
Returns true iff the handle is marked as hidden.
Definition SmartHandles.hh:334
│ │ │ -
Base class for all smart handle types that contains status related methods.
Definition SmartHandles.hh:102
│ │ │ -
bool is_boundary() const
Returns true iff the handle is boundary.
Definition SmartHandles.hh:350
│ │ │ -
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ -
SmartHalfedgeHandle halfedge() const
Returns an outgoing halfedge.
Definition SmartHandles.hh:363
│ │ │ -
SmartHalfedgeHandle out() const
Returns an outgoing halfedge.
Definition SmartHandles.hh:357
│ │ │ -
bool is_manifold() const
Returns true iff (the mesh at) the vertex is two-manifold ?
Definition SmartHandles.hh:379
│ │ │ -
SmartHalfedgeHandle in() const
Returns an incoming halfedge.
Definition SmartHandles.hh:368
│ │ │ -
uint valence() const
Returns valence of the vertex.
Definition SmartHandles.hh:373
│ │ │ -
Definition SmartHandles.hh:170
│ │ │ -
SmartFaceHandle face() const
Returns incident face of halfedge.
Definition SmartHandles.hh:421
│ │ │ -
SmartVertexHandle from() const
Returns vertex at start of halfedge.
Definition SmartHandles.hh:409
│ │ │ -
SmartHalfedgeHandle next() const
Returns next halfedge handle.
Definition SmartHandles.hh:385
│ │ │ -
SmartHalfedgeHandle prev() const
Returns previous halfedge handle.
Definition SmartHandles.hh:391
│ │ │ -
SmartEdgeHandle edge() const
Returns incident edge of halfedge.
Definition SmartHandles.hh:415
│ │ │ -
SmartHalfedgeHandle opp() const
Returns opposite halfedge handle.
Definition SmartHandles.hh:397
│ │ │ -
SmartVertexHandle to() const
Returns vertex pointed to by halfedge.
Definition SmartHandles.hh:403
│ │ │ -
Definition SmartHandles.hh:197
│ │ │ -
SmartVertexHandle v(unsigned int _i) const
Shorthand for vertex()
Definition SmartHandles.hh:453
│ │ │ -
SmartVertexHandle v1() const
Shorthand for vertex(1)
Definition SmartHandles.hh:463
│ │ │ -
SmartHalfedgeHandle h(unsigned int _i) const
Shorthand for halfedge()
Definition SmartHandles.hh:433
│ │ │ -
SmartHalfedgeHandle h1() const
Shorthand for halfedge(1)
Definition SmartHandles.hh:443
│ │ │ -
SmartVertexHandle vertex(unsigned int _i) const
Returns one of the two incident vertices of the edge.
Definition SmartHandles.hh:448
│ │ │ -
SmartVertexHandle v0() const
Shorthand for vertex(0)
Definition SmartHandles.hh:458
│ │ │ -
SmartHalfedgeHandle halfedge(unsigned int _i) const
Returns one of the two halfedges of the edge.
Definition SmartHandles.hh:427
│ │ │ -
SmartHalfedgeHandle h0() const
Shorthand for halfedge(0)
Definition SmartHandles.hh:438
│ │ │ -
Definition SmartHandles.hh:228
│ │ │ -
uint valence() const
Returns the valence of the face.
Definition SmartHandles.hh:474
│ │ │ -
SmartHalfedgeHandle halfedge() const
Returns one of the halfedges of the face.
Definition SmartHandles.hh:468
│ │ │ -
Definition SmartHandles.hh:285
│ │ │ +
This class demonstrates the non copyable idiom.
Definition Noncopyable.hh:72
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -SmartHandles.hh │ │ │ │ +Noncopyable.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,596 +45,66 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42#ifndef OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ -43#error Do not include this directly, include instead PolyConnectivity.hh │ │ │ │ -44#endif//OPENMESH_POLYCONNECTIVITY_INTERFACE_INCLUDE │ │ │ │ -45 │ │ │ │ -46#include │ │ │ │ -47 │ │ │ │ -48//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -49 │ │ │ │ -50namespace _O_p_e_n_M_e_s_h { │ │ │ │ -51 │ │ │ │ -52//== FORWARD DECLARATION │ │ │ │ -====================================================== │ │ │ │ +42 │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Implements the Non-Copyable metapher │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ +51#ifndef OPENMESH_NONCOPYABLE_HH │ │ │ │ +52#define OPENMESH_NONCOPYABLE_HH │ │ │ │ 53 │ │ │ │ -54struct SmartVertexHandle; │ │ │ │ -55struct SmartHalfedgeHandle; │ │ │ │ -56struct SmartEdgeHandle; │ │ │ │ -57struct SmartFaceHandle; │ │ │ │ +54 │ │ │ │ +55//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +56 │ │ │ │ +57#include │ │ │ │ 58 │ │ │ │ -59 │ │ │ │ -60//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -61 │ │ │ │ -_6_3class OPENMESHDLLEXPORT _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e │ │ │ │ -64{ │ │ │ │ -65public: │ │ │ │ -66 explicit _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = nullptr) : mesh_ │ │ │ │ -(_mesh) {} │ │ │ │ -67 │ │ │ │ -_6_9 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _m_e_s_h() const { return mesh_; } │ │ │ │ -70 │ │ │ │ -71 // TODO: should operators ==, !=, < look at mesh_? │ │ │ │ -72 │ │ │ │ -73private: │ │ │ │ -74 const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* mesh_; │ │ │ │ +59//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +60 │ │ │ │ +61namespace _O_p_e_n_M_e_s_h { │ │ │ │ +62namespace Utils { │ │ │ │ +63 │ │ │ │ +64//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +65 │ │ │ │ +_7_1class _N_o_n_c_o_p_y_a_b_l_e │ │ │ │ +72{ │ │ │ │ +73public: │ │ │ │ +74 _N_o_n_c_o_p_y_a_b_l_e() { } │ │ │ │ 75 │ │ │ │ -76}; │ │ │ │ -77 │ │ │ │ -79template │ │ │ │ -_8_0class _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s │ │ │ │ -81{ │ │ │ │ -82public: │ │ │ │ -_8_4 bool _f_e_a_t_u_r_e() const; │ │ │ │ -_8_6 bool _s_e_l_e_c_t_e_d() const; │ │ │ │ -_8_8 bool _t_a_g_g_e_d() const; │ │ │ │ -_9_0 bool _t_a_g_g_e_d_2() const; │ │ │ │ -_9_2 bool _l_o_c_k_e_d() const; │ │ │ │ -_9_4 bool _h_i_d_d_e_n() const; │ │ │ │ -_9_6 bool _d_e_l_e_t_e_d() const; │ │ │ │ -97}; │ │ │ │ -98 │ │ │ │ -100template │ │ │ │ -_1_0_1class _S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ -102{ │ │ │ │ -103public: │ │ │ │ -_1_0_5 bool _i_s___b_o_u_n_d_a_r_y() const; │ │ │ │ -106}; │ │ │ │ -107 │ │ │ │ -_1_0_9struct OPENMESHDLLEXPORT _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ -_V_e_r_t_e_x_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ -_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ -110{ │ │ │ │ -111 explicit _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ -nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _V_e_r_t_e_x_H_a_n_d_l_e(_idx) {} │ │ │ │ -112 │ │ │ │ -114 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e out() const; │ │ │ │ -116 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge() const; // alias for out │ │ │ │ -118 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e in() const; │ │ │ │ -119 │ │ │ │ -121 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_R_a_n_g_e faces() const; │ │ │ │ -123 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_W_R_a_n_g_e faces_cw() const; │ │ │ │ -125 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_C_C_W_R_a_n_g_e faces_ccw() const; │ │ │ │ -127 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_R_a_n_g_e edges() const; │ │ │ │ -129 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_W_R_a_n_g_e edges_cw() const; │ │ │ │ -131 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_C_C_W_R_a_n_g_e edges_ccw() const; │ │ │ │ -133 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_R_a_n_g_e vertices() const; │ │ │ │ -135 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_W_R_a_n_g_e vertices_cw() const; │ │ │ │ -137 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_C_C_W_R_a_n_g_e vertices_ccw() const; │ │ │ │ -139 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e incoming_halfedges() const; │ │ │ │ -141 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e incoming_halfedges_cw() │ │ │ │ -const; │ │ │ │ -143 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e incoming_halfedges_ccw() │ │ │ │ -const; │ │ │ │ -145 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_R_a_n_g_e incoming_halfedges │ │ │ │ -(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -147 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e incoming_halfedges_cw │ │ │ │ -(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -149 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e incoming_halfedges_ccw │ │ │ │ -(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -151 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e outgoing_halfedges() const; │ │ │ │ -153 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e outgoing_halfedges_cw() │ │ │ │ -const; │ │ │ │ -155 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e outgoing_halfedges_ccw() │ │ │ │ -const; │ │ │ │ -157 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_R_a_n_g_e outgoing_halfedges │ │ │ │ -(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -159 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e outgoing_halfedges_cw │ │ │ │ -(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -161 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e outgoing_halfedges_ccw │ │ │ │ -(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const; │ │ │ │ -162 │ │ │ │ -164 uint valence() const; │ │ │ │ -166 bool is_manifold() const; │ │ │ │ -167}; │ │ │ │ -168 │ │ │ │ -_1_6_9struct OPENMESHDLLEXPORT _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ -_H_a_l_f_e_d_g_e_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ -_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ -170{ │ │ │ │ -171 explicit _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ -nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _H_a_l_f_e_d_g_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -172 │ │ │ │ -174 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e next() const; │ │ │ │ -176 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e prev() const; │ │ │ │ -178 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e opp() const; │ │ │ │ -180 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e to() const; │ │ │ │ -182 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e from() const; │ │ │ │ -184 _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e edge() const; │ │ │ │ -186 _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e face() const; │ │ │ │ -187 │ │ │ │ -189 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_R_a_n_g_e loop() const; │ │ │ │ -191 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_W_R_a_n_g_e loop_cw() const; │ │ │ │ -193 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_H_a_l_f_e_d_g_e_L_o_o_p_C_C_W_R_a_n_g_e loop_ccw() const; │ │ │ │ -194}; │ │ │ │ -195 │ │ │ │ -_1_9_6struct OPENMESHDLLEXPORT _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ -_E_d_g_e_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ -_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ -197{ │ │ │ │ -198 explicit _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ -nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _E_d_g_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -199 │ │ │ │ -201 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge(unsigned int _i) const; │ │ │ │ -203 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e h(unsigned int _i) const; │ │ │ │ -205 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e h0() const; │ │ │ │ -207 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e h1() const; │ │ │ │ -209 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vertex(unsigned int _i) const; │ │ │ │ -211 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e v(unsigned int _i) const; │ │ │ │ -213 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e v0() const; │ │ │ │ -215 _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e v1() const; │ │ │ │ -216 │ │ │ │ -218 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_V_e_r_t_e_x_R_a_n_g_e vertices() const; │ │ │ │ -220 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e halfedges() const; │ │ │ │ -222 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_H_a_l_f_e_d_g_e_R_a_n_g_e halfedges(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) │ │ │ │ -const; │ │ │ │ -224 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_E_d_g_e_F_a_c_e_R_a_n_g_e faces() const; │ │ │ │ -225}; │ │ │ │ -226 │ │ │ │ -_2_2_7struct OPENMESHDLLEXPORT _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e : public _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e, │ │ │ │ -_F_a_c_e_H_a_n_d_l_e, _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s, │ │ │ │ -_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ -228{ │ │ │ │ -229 explicit _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e(int _idx=-1, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh = │ │ │ │ -nullptr) : _S_m_a_r_t_B_a_s_e_H_a_n_d_l_e(_mesh), _F_a_c_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -230 │ │ │ │ -232 _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e halfedge() const; │ │ │ │ -233 │ │ │ │ -235 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_R_a_n_g_e vertices() const; │ │ │ │ -237 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_W_R_a_n_g_e vertices_cw() const; │ │ │ │ -239 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_C_C_W_R_a_n_g_e vertices_ccw() const; │ │ │ │ -241 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_R_a_n_g_e halfedges() const; │ │ │ │ -243 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_W_R_a_n_g_e halfedges_cw() const; │ │ │ │ -245 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_C_C_W_R_a_n_g_e halfedges_ccw() const; │ │ │ │ -247 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_R_a_n_g_e edges() const; │ │ │ │ -249 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_W_R_a_n_g_e edges_cw() const; │ │ │ │ -251 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_C_C_W_R_a_n_g_e edges_ccw() const; │ │ │ │ -253 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_R_a_n_g_e faces() const; │ │ │ │ -255 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_W_R_a_n_g_e faces_cw() const; │ │ │ │ -257 _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_C_C_W_R_a_n_g_e faces_ccw() const; │ │ │ │ -258 │ │ │ │ -260 uint valence() const; │ │ │ │ -261}; │ │ │ │ -262 │ │ │ │ -263 │ │ │ │ -_2_6_5inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ -_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh) { return _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e (_vh._i_d_x(), _mesh); } │ │ │ │ -_2_6_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh, const │ │ │ │ -_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* _mesh) { return _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_hh._i_d_x(), _mesh); } │ │ │ │ -_2_6_9inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_E_d_g_e_H_a_n_d_l_e _eh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* │ │ │ │ -_mesh) { return _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e (_eh._i_d_x(), _mesh); } │ │ │ │ -_2_7_1inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_F_a_c_e_H_a_n_d_l_e _fh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y* │ │ │ │ -_mesh) { return _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e (_fh._i_d_x(), _mesh); } │ │ │ │ -272 │ │ │ │ -_2_7_4inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ -_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _mesh) { return _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e (_vh._i_d_x(), &_mesh); } │ │ │ │ -_2_7_6inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _hh, const │ │ │ │ -_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& _mesh) { return _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e(_hh._i_d_x(), &_mesh); } │ │ │ │ -_2_7_8inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_E_d_g_e_H_a_n_d_l_e _eh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& │ │ │ │ -_mesh) { return _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e (_eh._i_d_x(), &_mesh); } │ │ │ │ -_2_8_0inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _m_a_k_e___s_m_a_r_t(_F_a_c_e_H_a_n_d_l_e _fh, const _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y& │ │ │ │ -_mesh) { return _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e (_fh._i_d_x(), &_mesh); } │ │ │ │ -281 │ │ │ │ -282 │ │ │ │ -283// helper to convert Handle Types to Smarthandle Types │ │ │ │ -284template │ │ │ │ -_2_8_5struct _S_m_a_r_t_H_a_n_d_l_e; │ │ │ │ -286 │ │ │ │ -_2_8_7template <> struct _S_m_a_r_t_H_a_n_d_l_e<_V_e_r_t_e_x_H_a_n_d_l_e> { using _t_y_p_e = │ │ │ │ -_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e; }; │ │ │ │ -_2_8_8template <> struct _S_m_a_r_t_H_a_n_d_l_e<_H_a_l_f_e_d_g_e_H_a_n_d_l_e> { using _t_y_p_e = │ │ │ │ -_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e; }; │ │ │ │ -_2_8_9template <> struct _S_m_a_r_t_H_a_n_d_l_e<_E_d_g_e_H_a_n_d_l_e> { using _t_y_p_e = _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e; │ │ │ │ -}; │ │ │ │ -_2_9_0template <> struct _S_m_a_r_t_H_a_n_d_l_e<_F_a_c_e_H_a_n_d_l_e> { using _t_y_p_e = _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e; │ │ │ │ -}; │ │ │ │ -291 │ │ │ │ -292 │ │ │ │ -293template │ │ │ │ -_2_9_4inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_f_e_a_t_u_r_e() const │ │ │ │ -295{ │ │ │ │ -296 const auto& handle = static_cast(*this); │ │ │ │ -297 assert(handle.mesh() != nullptr); │ │ │ │ -298 return handle.mesh()->status(handle).feature(); │ │ │ │ -299} │ │ │ │ -300 │ │ │ │ -301template │ │ │ │ -_3_0_2inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_s_e_l_e_c_t_e_d() const │ │ │ │ -303{ │ │ │ │ -304 const auto& handle = static_cast(*this); │ │ │ │ -305 assert(handle.mesh() != nullptr); │ │ │ │ -306 return handle.mesh()->status(handle).selected(); │ │ │ │ -307} │ │ │ │ -308 │ │ │ │ -309template │ │ │ │ -_3_1_0inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_t_a_g_g_e_d() const │ │ │ │ -311{ │ │ │ │ -312 const auto& handle = static_cast(*this); │ │ │ │ -313 assert(handle.mesh() != nullptr); │ │ │ │ -314 return handle.mesh()->status(handle).tagged(); │ │ │ │ -315} │ │ │ │ -316 │ │ │ │ -317template │ │ │ │ -_3_1_8inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_t_a_g_g_e_d_2() const │ │ │ │ -319{ │ │ │ │ -320 const auto& handle = static_cast(*this); │ │ │ │ -321 assert(handle.mesh() != nullptr); │ │ │ │ -322 return handle.mesh()->status(handle).tagged2(); │ │ │ │ -323} │ │ │ │ -324 │ │ │ │ -325template │ │ │ │ -_3_2_6inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_l_o_c_k_e_d() const │ │ │ │ -327{ │ │ │ │ -328 const auto& handle = static_cast(*this); │ │ │ │ -329 assert(handle.mesh() != nullptr); │ │ │ │ -330 return handle.mesh()->status(handle).locked(); │ │ │ │ -331} │ │ │ │ -332 │ │ │ │ -333template │ │ │ │ -_3_3_4inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_h_i_d_d_e_n() const │ │ │ │ -335{ │ │ │ │ -336 const auto& handle = static_cast(*this); │ │ │ │ -337 assert(handle.mesh() != nullptr); │ │ │ │ -338 return handle.mesh()->status(handle).hidden(); │ │ │ │ -339} │ │ │ │ -340 │ │ │ │ -341template │ │ │ │ -_3_4_2inline bool _S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_<_H_a_n_d_l_e_T_y_p_e_>_:_:_d_e_l_e_t_e_d() const │ │ │ │ -343{ │ │ │ │ -344 const auto& handle = static_cast(*this); │ │ │ │ -345 assert(handle.mesh() != nullptr); │ │ │ │ -346 return handle.mesh()->status(handle).deleted(); │ │ │ │ -347} │ │ │ │ -348 │ │ │ │ -349template │ │ │ │ -_3_5_0inline bool _S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e_<_H_a_n_d_l_e_T_y_p_e_>_:_:_i_s___b_o_u_n_d_a_r_y() const │ │ │ │ -351{ │ │ │ │ -352 const auto& handle = static_cast(*this); │ │ │ │ -353 assert(handle.mesh() != nullptr); │ │ │ │ -354 return handle.mesh()->is_boundary(handle); │ │ │ │ -355} │ │ │ │ -356 │ │ │ │ -_3_5_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t() const │ │ │ │ -358{ │ │ │ │ -359 assert(_m_e_s_h() != nullptr); │ │ │ │ -360 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->halfedge_handle(*this), _m_e_s_h()); │ │ │ │ -361} │ │ │ │ -362 │ │ │ │ -_3_6_3inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e() const │ │ │ │ -364{ │ │ │ │ -365 return _o_u_t(); │ │ │ │ -366} │ │ │ │ -367 │ │ │ │ -_3_6_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n() const │ │ │ │ -369{ │ │ │ │ -370 return _o_u_t()._o_p_p(); │ │ │ │ -371} │ │ │ │ -372 │ │ │ │ -_3_7_3inline uint _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e() const │ │ │ │ -374{ │ │ │ │ -375 assert(_m_e_s_h() != nullptr); │ │ │ │ -376 return _m_e_s_h()->_v_a_l_e_n_c_e(*this); │ │ │ │ -377} │ │ │ │ -378 │ │ │ │ -_3_7_9inline bool _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_s___m_a_n_i_f_o_l_d() const │ │ │ │ -380{ │ │ │ │ -381 assert(_m_e_s_h() != nullptr); │ │ │ │ -382 return _m_e_s_h()->_i_s___m_a_n_i_f_o_l_d(*this); │ │ │ │ -383} │ │ │ │ -384 │ │ │ │ -_3_8_5inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_n_e_x_t() const │ │ │ │ -386{ │ │ │ │ -387 assert(_m_e_s_h() != nullptr); │ │ │ │ -388 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->next_halfedge_handle(*this), _m_e_s_h()); │ │ │ │ -389} │ │ │ │ -390 │ │ │ │ -_3_9_1inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_p_r_e_v() const │ │ │ │ -392{ │ │ │ │ -393 assert(_m_e_s_h() != nullptr); │ │ │ │ -394 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->prev_halfedge_handle(*this), _m_e_s_h()); │ │ │ │ -395} │ │ │ │ -396 │ │ │ │ -_3_9_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_o_p_p() const │ │ │ │ -398{ │ │ │ │ -399 assert(_m_e_s_h() != nullptr); │ │ │ │ -400 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->opposite_halfedge_handle(*this), _m_e_s_h()); │ │ │ │ -401} │ │ │ │ -402 │ │ │ │ -_4_0_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_t_o() const │ │ │ │ -404{ │ │ │ │ -405 assert(_m_e_s_h() != nullptr); │ │ │ │ -406 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->to_vertex_handle(*this), _m_e_s_h()); │ │ │ │ -407} │ │ │ │ -408 │ │ │ │ -_4_0_9inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_r_o_m() const │ │ │ │ -410{ │ │ │ │ -411 assert(_m_e_s_h() != nullptr); │ │ │ │ -412 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->from_vertex_handle(*this), _m_e_s_h()); │ │ │ │ -413} │ │ │ │ -414 │ │ │ │ -_4_1_5inline _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_e_d_g_e() const │ │ │ │ -416{ │ │ │ │ -417 assert(_m_e_s_h() != nullptr); │ │ │ │ -418 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->edge_handle(*this), _m_e_s_h()); │ │ │ │ -419} │ │ │ │ -420 │ │ │ │ -_4_2_1inline _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_a_c_e() const │ │ │ │ -422{ │ │ │ │ -423 assert(_m_e_s_h() != nullptr); │ │ │ │ -424 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->face_handle(*this), _m_e_s_h()); │ │ │ │ -425} │ │ │ │ -426 │ │ │ │ -_4_2_7inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e(unsigned int _i = 0) │ │ │ │ -const │ │ │ │ -428{ │ │ │ │ -429 assert(_m_e_s_h() != nullptr); │ │ │ │ -430 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->halfedge_handle(*this, _i), _m_e_s_h()); │ │ │ │ -431} │ │ │ │ -432 │ │ │ │ -_4_3_3inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h(unsigned int _i = 0) const │ │ │ │ -434{ │ │ │ │ -435 return _h_a_l_f_e_d_g_e(_i); │ │ │ │ -436} │ │ │ │ -437 │ │ │ │ -_4_3_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_0() const │ │ │ │ -439{ │ │ │ │ -440 return _h(0); │ │ │ │ -441} │ │ │ │ -442 │ │ │ │ -_4_4_3inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_1() const │ │ │ │ -444{ │ │ │ │ -445 return _h(1); │ │ │ │ -446} │ │ │ │ -447 │ │ │ │ -_4_4_8inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_e_r_t_e_x(unsigned int _i) const │ │ │ │ -449{ │ │ │ │ -450 return _h_a_l_f_e_d_g_e(_i)._f_r_o_m(); │ │ │ │ -451} │ │ │ │ -452 │ │ │ │ -_4_5_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v(unsigned int _i) const │ │ │ │ -454{ │ │ │ │ -455 return _v_e_r_t_e_x(_i); │ │ │ │ -456} │ │ │ │ -457 │ │ │ │ -_4_5_8inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_0() const │ │ │ │ -459{ │ │ │ │ -460 return _v(0); │ │ │ │ -461} │ │ │ │ -462 │ │ │ │ -_4_6_3inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_1() const │ │ │ │ -464{ │ │ │ │ -465 return _v(1); │ │ │ │ -466} │ │ │ │ -467 │ │ │ │ -_4_6_8inline _S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e() const │ │ │ │ -469{ │ │ │ │ -470 assert(_m_e_s_h() != nullptr); │ │ │ │ -471 return _m_a_k_e___s_m_a_r_t(_m_e_s_h()->halfedge_handle(*this), _m_e_s_h()); │ │ │ │ -472} │ │ │ │ -473 │ │ │ │ -_4_7_4inline uint _S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e() const │ │ │ │ -475{ │ │ │ │ -476 assert(_m_e_s_h() != nullptr); │ │ │ │ -477 return _m_e_s_h()->_v_a_l_e_n_c_e(*this); │ │ │ │ -478} │ │ │ │ -479 │ │ │ │ -480// │ │ │ │ +76private: │ │ │ │ +78 _N_o_n_c_o_p_y_a_b_l_e( const _N_o_n_c_o_p_y_a_b_l_e& ); │ │ │ │ +79 │ │ │ │ +81 const _N_o_n_c_o_p_y_a_b_l_e& operator=( const _N_o_n_c_o_p_y_a_b_l_e& ); │ │ │ │ +82}; │ │ │ │ +83 │ │ │ │ +84// │ │ │ │ ============================================================================= │ │ │ │ -481} // namespace OpenMesh │ │ │ │ -482// │ │ │ │ +85} // namespace Utils │ │ │ │ +86} // namespace OpenMesh │ │ │ │ +87// │ │ │ │ ============================================================================= │ │ │ │ -483 │ │ │ │ -484// │ │ │ │ +88#endif // OPENMESH_NONCOPYABLE_HH │ │ │ │ +89// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_m_a_k_e___s_m_a_r_t │ │ │ │ -SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh) │ │ │ │ -Creats a SmartVertexHandle from a VertexHandle and a Mesh. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:265 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_C_i_r_c_u_l_a_t_o_r_R_a_n_g_e │ │ │ │ -Generic class for iterator ranges. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity_inline_impl.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ -int idx() const │ │ │ │ -Get the underlying index of this handle. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y │ │ │ │ -Connectivity Class for polygonal meshes. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.hh:115 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_v_a_l_e_n_c_e │ │ │ │ -uint valence(VertexHandle _vh) const │ │ │ │ -Vertex valence. │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.cc:1072 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_:_:_i_s___m_a_n_i_f_o_l_d │ │ │ │ -bool is_manifold(VertexHandle _vh) const │ │ │ │ -Is (the mesh at) vertex _vh two-manifold ? │ │ │ │ -DDeeffiinniittiioonn PolyConnectivity.cc:84 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_B_a_s_e_H_a_n_d_l_e │ │ │ │ -Base class for all smart handle types. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:64 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_B_a_s_e_H_a_n_d_l_e_:_:_m_e_s_h │ │ │ │ -const PolyConnectivity * mesh() const │ │ │ │ -Get the underlying mesh of this handle. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:69 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s │ │ │ │ -Base class for all smart handle types that contains status related methods. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:81 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_s_e_l_e_c_t_e_d │ │ │ │ -bool selected() const │ │ │ │ -Returns true iff the handle is marked as selected. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:302 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_f_e_a_t_u_r_e │ │ │ │ -bool feature() const │ │ │ │ -Returns true iff the handle is marked as feature. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:294 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_l_o_c_k_e_d │ │ │ │ -bool locked() const │ │ │ │ -Returns true iff the handle is marked as locked. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:326 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_d_e_l_e_t_e_d │ │ │ │ -bool deleted() const │ │ │ │ -Returns true iff the handle is marked as deleted. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:342 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_t_a_g_g_e_d │ │ │ │ -bool tagged() const │ │ │ │ -Returns true iff the handle is marked as tagged. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:310 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_t_a_g_g_e_d_2 │ │ │ │ -bool tagged2() const │ │ │ │ -Returns true iff the handle is marked as tagged2. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:318 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_S_t_a_t_u_s_P_r_e_d_i_c_a_t_e_s_:_:_h_i_d_d_e_n │ │ │ │ -bool hidden() const │ │ │ │ -Returns true iff the handle is marked as hidden. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:334 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e │ │ │ │ -Base class for all smart handle types that contains status related methods. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:102 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e_B_o_u_n_d_a_r_y_P_r_e_d_i_c_a_t_e_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary() const │ │ │ │ -Returns true iff the handle is boundary. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:350 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ -allows easier access t... │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e │ │ │ │ -SmartHalfedgeHandle halfedge() const │ │ │ │ -Returns an outgoing halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:363 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_o_u_t │ │ │ │ -SmartHalfedgeHandle out() const │ │ │ │ -Returns an outgoing halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:357 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_s___m_a_n_i_f_o_l_d │ │ │ │ -bool is_manifold() const │ │ │ │ -Returns true iff (the mesh at) the vertex is two-manifold ? │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:379 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_i_n │ │ │ │ -SmartHalfedgeHandle in() const │ │ │ │ -Returns an incoming halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:368 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e │ │ │ │ -uint valence() const │ │ │ │ -Returns valence of the vertex. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:373 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:170 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_a_c_e │ │ │ │ -SmartFaceHandle face() const │ │ │ │ -Returns incident face of halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:421 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_f_r_o_m │ │ │ │ -SmartVertexHandle from() const │ │ │ │ -Returns vertex at start of halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:409 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_n_e_x_t │ │ │ │ -SmartHalfedgeHandle next() const │ │ │ │ -Returns next halfedge handle. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:385 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_p_r_e_v │ │ │ │ -SmartHalfedgeHandle prev() const │ │ │ │ -Returns previous halfedge handle. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:391 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_e_d_g_e │ │ │ │ -SmartEdgeHandle edge() const │ │ │ │ -Returns incident edge of halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:415 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_o_p_p │ │ │ │ -SmartHalfedgeHandle opp() const │ │ │ │ -Returns opposite halfedge handle. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:397 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_l_f_e_d_g_e_H_a_n_d_l_e_:_:_t_o │ │ │ │ -SmartVertexHandle to() const │ │ │ │ -Returns vertex pointed to by halfedge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:403 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:197 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v │ │ │ │ -SmartVertexHandle v(unsigned int _i) const │ │ │ │ -Shorthand for vertex() │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:453 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_1 │ │ │ │ -SmartVertexHandle v1() const │ │ │ │ -Shorthand for vertex(1) │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:463 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h │ │ │ │ -SmartHalfedgeHandle h(unsigned int _i) const │ │ │ │ -Shorthand for halfedge() │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:433 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_1 │ │ │ │ -SmartHalfedgeHandle h1() const │ │ │ │ -Shorthand for halfedge(1) │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:443 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_e_r_t_e_x │ │ │ │ -SmartVertexHandle vertex(unsigned int _i) const │ │ │ │ -Returns one of the two incident vertices of the edge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:448 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_v_0 │ │ │ │ -SmartVertexHandle v0() const │ │ │ │ -Shorthand for vertex(0) │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:458 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e │ │ │ │ -SmartHalfedgeHandle halfedge(unsigned int _i) const │ │ │ │ -Returns one of the two halfedges of the edge. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:427 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_E_d_g_e_H_a_n_d_l_e_:_:_h_0 │ │ │ │ -SmartHalfedgeHandle h0() const │ │ │ │ -Shorthand for halfedge(0) │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:438 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:228 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_v_a_l_e_n_c_e │ │ │ │ -uint valence() const │ │ │ │ -Returns the valence of the face. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:474 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_F_a_c_e_H_a_n_d_l_e_:_:_h_a_l_f_e_d_g_e │ │ │ │ -SmartHalfedgeHandle halfedge() const │ │ │ │ -Returns one of the halfedges of the face. │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:468 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_H_a_n_d_l_e │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:285 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_N_o_n_c_o_p_y_a_b_l_e │ │ │ │ +This class demonstrates the non copyable idiom. │ │ │ │ +DDeeffiinniittiioonn Noncopyable.hh:72 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00725_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/Handles.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/SingletonT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
Handles.hh
│ │ │ +
SingletonT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,228 +138,52 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44#ifndef OPENMESH_HANDLES_HH
│ │ │ -
45#define OPENMESH_HANDLES_HH
│ │ │ -
46
│ │ │ -
47
│ │ │ -
48//== INCLUDES =================================================================
│ │ │ -
49
│ │ │ -
50#include <OpenMesh/Core/System/config.h>
│ │ │ -
51#include <ostream>
│ │ │ -
52
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Implements a simple singleton template
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52#define OPENMESH_SINGLETON_C
│ │ │
53
│ │ │ -
54//== NAMESPACES ===============================================================
│ │ │ -
55
│ │ │ -
56namespace OpenMesh {
│ │ │ +
54
│ │ │ +
55//== INCLUDES =================================================================
│ │ │ +
56
│ │ │
57
│ │ │ -
58//== CLASS DEFINITION =========================================================
│ │ │ -
59
│ │ │ +
58// header
│ │ │ +
59#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │
60
│ │ │ -
│ │ │ -
62class OPENMESHDLLEXPORT BaseHandle
│ │ │ -
63{
│ │ │ -
64public:
│ │ │ -
65
│ │ │ -
66 explicit BaseHandle(int _idx=-1) : idx_(_idx) {}
│ │ │ +
61
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │ +
63
│ │ │ +
64
│ │ │ +
65namespace OpenMesh {
│ │ │ +
66
│ │ │
67
│ │ │ -
69 int idx() const { return idx_; }
│ │ │ +
68//== SINGLETON'S DATA =========================================================
│ │ │ +
69
│ │ │
70
│ │ │ -
72 bool is_valid() const { return idx_ >= 0; }
│ │ │ +
71template <class T>
│ │ │ +
72T* SingletonT<T>::pInstance__ = 0;
│ │ │
73
│ │ │ -
75 void reset() { idx_=-1; }
│ │ │ -
77 void invalidate() { idx_ = -1; }
│ │ │ -
78
│ │ │ -
79 bool operator==(const BaseHandle& _rhs) const {
│ │ │ -
80 return (this->idx_ == _rhs.idx_);
│ │ │ -
81 }
│ │ │ -
82
│ │ │ -
83 bool operator!=(const BaseHandle& _rhs) const {
│ │ │ -
84 return (this->idx_ != _rhs.idx_);
│ │ │ -
85 }
│ │ │ -
86
│ │ │ -
87 bool operator<(const BaseHandle& _rhs) const {
│ │ │ -
88 return (this->idx_ < _rhs.idx_);
│ │ │ -
89 }
│ │ │ -
90
│ │ │ -
91
│ │ │ -
92 // this is to be used only by the iterators
│ │ │ -
93 void __increment() { ++idx_; }
│ │ │ -
94 void __decrement() { --idx_; }
│ │ │ -
95
│ │ │ -
96 void __increment(int amount) { idx_ += amount; }
│ │ │ -
97 void __decrement(int amount) { idx_ -= amount; }
│ │ │ -
98
│ │ │ -
99private:
│ │ │ -
100
│ │ │ -
101 int idx_;
│ │ │ -
102};
│ │ │ -
│ │ │ -
103
│ │ │ -
104// this is used by boost::unordered_set/map
│ │ │ -
105inline size_t hash_value(const BaseHandle& h) { return h.idx(); }
│ │ │ -
106
│ │ │ -
107//-----------------------------------------------------------------------------
│ │ │ -
108
│ │ │ -
│ │ │ -
110inline std::ostream& operator<<(std::ostream& _os, const BaseHandle& _hnd)
│ │ │ -
111{
│ │ │ -
112 return (_os << _hnd.idx());
│ │ │ -
113}
│ │ │ -
│ │ │ -
114
│ │ │ -
115
│ │ │ -
116//-----------------------------------------------------------------------------
│ │ │ -
117
│ │ │ -
118
│ │ │ -
│ │ │ -
120struct OPENMESHDLLEXPORT VertexHandle : public BaseHandle
│ │ │ -
121{
│ │ │ -
122 explicit VertexHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ -
123};
│ │ │ -
│ │ │ -
124
│ │ │ -
125
│ │ │ -
│ │ │ -
127struct OPENMESHDLLEXPORT HalfedgeHandle : public BaseHandle
│ │ │ -
128{
│ │ │ -
129 explicit HalfedgeHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ -
130};
│ │ │ -
│ │ │ -
131
│ │ │ -
132
│ │ │ -
│ │ │ -
134struct OPENMESHDLLEXPORT EdgeHandle : public BaseHandle
│ │ │ -
135{
│ │ │ -
136 explicit EdgeHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ -
137};
│ │ │ -
│ │ │ -
138
│ │ │ -
139
│ │ │ -
│ │ │ -
141struct OPENMESHDLLEXPORT FaceHandle : public BaseHandle
│ │ │ -
142{
│ │ │ -
143 explicit FaceHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ -
144};
│ │ │ -
│ │ │ -
145
│ │ │ -
146
│ │ │ -
│ │ │ -
148struct OPENMESHDLLEXPORT MeshHandle : public BaseHandle
│ │ │ -
149{
│ │ │ -
150 explicit MeshHandle(int _idx=-1) : BaseHandle(_idx) {}
│ │ │ -
151};
│ │ │ -
│ │ │ -
152
│ │ │ -
153
│ │ │ -
154
│ │ │ -
155
│ │ │ -
156//=============================================================================
│ │ │ -
157} // namespace OpenMesh
│ │ │ -
158//=============================================================================
│ │ │ -
159
│ │ │ -
160#ifdef OM_HAS_HASH
│ │ │ -
161#include <functional>
│ │ │ -
162namespace std {
│ │ │ -
163
│ │ │ -
164#if defined(_MSVC_VER)
│ │ │ -
165# pragma warning(push)
│ │ │ -
166# pragma warning(disable:4099) // For VC++ it is class hash
│ │ │ -
167#endif
│ │ │ -
168
│ │ │ -
169
│ │ │ -
170template <>
│ │ │ -
171struct hash<OpenMesh::BaseHandle >
│ │ │ -
172{
│ │ │ -
173 typedef OpenMesh::BaseHandle argument_type;
│ │ │ -
174 typedef std::size_t result_type;
│ │ │ -
175
│ │ │ -
176 std::size_t operator()(const OpenMesh::BaseHandle& h) const
│ │ │ -
177 {
│ │ │ -
178 return h.idx();
│ │ │ -
179 }
│ │ │ -
180};
│ │ │ -
181
│ │ │ -
182template <>
│ │ │ -
183struct hash<OpenMesh::VertexHandle >
│ │ │ -
184{
│ │ │ -
185 typedef OpenMesh::VertexHandle argument_type;
│ │ │ -
186 typedef std::size_t result_type;
│ │ │ -
187
│ │ │ -
188 std::size_t operator()(const OpenMesh::VertexHandle& h) const
│ │ │ -
189 {
│ │ │ -
190 return h.idx();
│ │ │ -
191 }
│ │ │ -
192};
│ │ │ -
193
│ │ │ -
194template <>
│ │ │ -
195struct hash<OpenMesh::HalfedgeHandle >
│ │ │ -
196{
│ │ │ -
197
│ │ │ -
198 typedef OpenMesh::HalfedgeHandle argument_type;
│ │ │ -
199 typedef std::size_t result_type;
│ │ │ -
200
│ │ │ -
201 std::size_t operator()(const OpenMesh::HalfedgeHandle& h) const
│ │ │ -
202 {
│ │ │ -
203 return h.idx();
│ │ │ -
204 }
│ │ │ -
205};
│ │ │ -
206
│ │ │ -
207template <>
│ │ │ -
208struct hash<OpenMesh::EdgeHandle >
│ │ │ -
209{
│ │ │ -
210
│ │ │ -
211 typedef OpenMesh::EdgeHandle argument_type;
│ │ │ -
212 typedef std::size_t result_type;
│ │ │ -
213
│ │ │ -
214 std::size_t operator()(const OpenMesh::EdgeHandle& h) const
│ │ │ -
215 {
│ │ │ -
216 return h.idx();
│ │ │ -
217 }
│ │ │ -
218};
│ │ │ -
219
│ │ │ -
220template <>
│ │ │ -
221struct hash<OpenMesh::FaceHandle >
│ │ │ -
222{
│ │ │ -
223
│ │ │ -
224 typedef OpenMesh::FaceHandle argument_type;
│ │ │ -
225 typedef std::size_t result_type;
│ │ │ -
226
│ │ │ -
227 std::size_t operator()(const OpenMesh::FaceHandle& h) const
│ │ │ -
228 {
│ │ │ -
229 return h.idx();
│ │ │ -
230 }
│ │ │ -
231};
│ │ │ -
232
│ │ │ -
233#if defined(_MSVC_VER)
│ │ │ -
234# pragma warning(pop)
│ │ │ -
235#endif
│ │ │ -
236
│ │ │ -
237}
│ │ │ -
238#endif // OM_HAS_HASH
│ │ │ -
239
│ │ │ -
240
│ │ │ -
241#endif // OPENMESH_HANDLES_HH
│ │ │ -
242//=============================================================================
│ │ │ +
74template <class T>
│ │ │ +
75bool SingletonT<T>::destroyed__ = false;
│ │ │ +
76
│ │ │ +
77
│ │ │ +
78//=============================================================================
│ │ │ +
79} // namespace OpenMesh
│ │ │ +
80//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
auto operator<<(std::ostream &os, const VectorT< Scalar, DIM > &_vec) -> typename std::enable_if< sizeof(decltype(os<< _vec[0])) >=0
output a vector by printing its space-separated compontens
│ │ │ -
Base class for all handle types.
Definition Handles.hh:63
│ │ │ -
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ -
void invalidate()
reset handle to be invalid
Definition Handles.hh:77
│ │ │ -
void reset()
reset handle to be invalid
Definition Handles.hh:75
│ │ │ -
int idx() const
Get the underlying index of this handle.
Definition Handles.hh:69
│ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -Handles.hh │ │ │ │ +SingletonT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,248 +47,58 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44#ifndef OPENMESH_HANDLES_HH │ │ │ │ -45#define OPENMESH_HANDLES_HH │ │ │ │ -46 │ │ │ │ -47 │ │ │ │ -48//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -49 │ │ │ │ -50#include │ │ │ │ -51#include │ │ │ │ -52 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Implements a simple singleton template │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52#define OPENMESH_SINGLETON_C │ │ │ │ 53 │ │ │ │ -54//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -55 │ │ │ │ -56namespace _O_p_e_n_M_e_s_h { │ │ │ │ +54 │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +56 │ │ │ │ 57 │ │ │ │ -58//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -59 │ │ │ │ +58// header │ │ │ │ +59#include │ │ │ │ 60 │ │ │ │ -_6_2class OPENMESHDLLEXPORT _B_a_s_e_H_a_n_d_l_e │ │ │ │ -63{ │ │ │ │ -64public: │ │ │ │ -65 │ │ │ │ -66 explicit _B_a_s_e_H_a_n_d_l_e(int _idx=-1) : idx_(_idx) {} │ │ │ │ +61 │ │ │ │ +62//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +63 │ │ │ │ +64 │ │ │ │ +65namespace _O_p_e_n_M_e_s_h { │ │ │ │ +66 │ │ │ │ 67 │ │ │ │ -_6_9 int _i_d_x() const { return idx_; } │ │ │ │ +68//== SINGLETON'S DATA │ │ │ │ +========================================================= │ │ │ │ +69 │ │ │ │ 70 │ │ │ │ -_7_2 bool _i_s___v_a_l_i_d() const { return idx_ >= 0; } │ │ │ │ +71template │ │ │ │ +72T* SingletonT::pInstance__ = 0; │ │ │ │ 73 │ │ │ │ -_7_5 void _r_e_s_e_t() { idx_=-1; } │ │ │ │ -_7_7 void _i_n_v_a_l_i_d_a_t_e() { idx_ = -1; } │ │ │ │ -78 │ │ │ │ -79 bool operator==(const _B_a_s_e_H_a_n_d_l_e& _rhs) const { │ │ │ │ -80 return (this->idx_ == _rhs.idx_); │ │ │ │ -81 } │ │ │ │ -82 │ │ │ │ -83 bool operator!=(const BaseHandle& _rhs) const { │ │ │ │ -84 return (this->idx_ != _rhs.idx_); │ │ │ │ -85 } │ │ │ │ -86 │ │ │ │ -87 bool operator<(const BaseHandle& _rhs) const { │ │ │ │ -88 return (this->idx_ < _rhs.idx_); │ │ │ │ -89 } │ │ │ │ -90 │ │ │ │ -91 │ │ │ │ -92 // this is to be used only by the iterators │ │ │ │ -93 void __increment() { ++idx_; } │ │ │ │ -94 void __decrement() { --idx_; } │ │ │ │ -95 │ │ │ │ -96 void __increment(int amount) { idx_ += amount; } │ │ │ │ -97 void __decrement(int amount) { idx_ -= amount; } │ │ │ │ -98 │ │ │ │ -99private: │ │ │ │ -100 │ │ │ │ -101 int idx_; │ │ │ │ -102}; │ │ │ │ -103 │ │ │ │ -104// this is used by boost::unordered_set/map │ │ │ │ -105inline size_t hash_value(const BaseHandle& h) { return h.idx(); } │ │ │ │ -106 │ │ │ │ -107//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -108 │ │ │ │ -_1_1_0inline std::ostream& _o_p_e_r_a_t_o_r_<_<(std::ostream& _os, const _B_a_s_e_H_a_n_d_l_e& _hnd) │ │ │ │ -111{ │ │ │ │ -112 return (_os << _hnd._i_d_x()); │ │ │ │ -113} │ │ │ │ -114 │ │ │ │ -115 │ │ │ │ -116//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -117 │ │ │ │ -118 │ │ │ │ -_1_2_0struct OPENMESHDLLEXPORT _V_e_r_t_e_x_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ -121{ │ │ │ │ -122 explicit _V_e_r_t_e_x_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -123}; │ │ │ │ -124 │ │ │ │ -125 │ │ │ │ -_1_2_7struct OPENMESHDLLEXPORT _H_a_l_f_e_d_g_e_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ -128{ │ │ │ │ -129 explicit _H_a_l_f_e_d_g_e_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -130}; │ │ │ │ -131 │ │ │ │ -132 │ │ │ │ -_1_3_4struct OPENMESHDLLEXPORT _E_d_g_e_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ -135{ │ │ │ │ -136 explicit _E_d_g_e_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -137}; │ │ │ │ -138 │ │ │ │ -139 │ │ │ │ -_1_4_1struct OPENMESHDLLEXPORT _F_a_c_e_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ -142{ │ │ │ │ -143 explicit _F_a_c_e_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -144}; │ │ │ │ -145 │ │ │ │ -146 │ │ │ │ -_1_4_8struct OPENMESHDLLEXPORT _M_e_s_h_H_a_n_d_l_e : public _B_a_s_e_H_a_n_d_l_e │ │ │ │ -149{ │ │ │ │ -150 explicit _M_e_s_h_H_a_n_d_l_e(int _idx=-1) : _B_a_s_e_H_a_n_d_l_e(_idx) {} │ │ │ │ -151}; │ │ │ │ -152 │ │ │ │ -153 │ │ │ │ -154 │ │ │ │ -155 │ │ │ │ -156// │ │ │ │ -============================================================================= │ │ │ │ -157} // namespace OpenMesh │ │ │ │ -158// │ │ │ │ +74template │ │ │ │ +75bool SingletonT::destroyed__ = false; │ │ │ │ +76 │ │ │ │ +77 │ │ │ │ +78// │ │ │ │ ============================================================================= │ │ │ │ -159 │ │ │ │ -160#ifdef OM_HAS_HASH │ │ │ │ -161#include │ │ │ │ -162namespace std { │ │ │ │ -163 │ │ │ │ -164#if defined(_MSVC_VER) │ │ │ │ -165# pragma warning(push) │ │ │ │ -166# pragma warning(disable:4099) // For VC++ it is class hash │ │ │ │ -167#endif │ │ │ │ -168 │ │ │ │ -169 │ │ │ │ -170template <> │ │ │ │ -171struct hash<_O_p_e_n_M_e_s_h::BaseHandle > │ │ │ │ -172{ │ │ │ │ -173 typedef _O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e argument_type; │ │ │ │ -174 typedef std::size_t result_type; │ │ │ │ -175 │ │ │ │ -176 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e& h) const │ │ │ │ -177 { │ │ │ │ -178 return h._i_d_x(); │ │ │ │ -179 } │ │ │ │ -180}; │ │ │ │ -181 │ │ │ │ -182template <> │ │ │ │ -183struct hash<_O_p_e_n_M_e_s_h::VertexHandle > │ │ │ │ -184{ │ │ │ │ -185 typedef _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e argument_type; │ │ │ │ -186 typedef std::size_t result_type; │ │ │ │ -187 │ │ │ │ -188 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e& h) const │ │ │ │ -189 { │ │ │ │ -190 return h._i_d_x(); │ │ │ │ -191 } │ │ │ │ -192}; │ │ │ │ -193 │ │ │ │ -194template <> │ │ │ │ -195struct hash<_O_p_e_n_M_e_s_h::HalfedgeHandle > │ │ │ │ -196{ │ │ │ │ -197 │ │ │ │ -198 typedef _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e argument_type; │ │ │ │ -199 typedef std::size_t result_type; │ │ │ │ -200 │ │ │ │ -201 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e& h) const │ │ │ │ -202 { │ │ │ │ -203 return h._i_d_x(); │ │ │ │ -204 } │ │ │ │ -205}; │ │ │ │ -206 │ │ │ │ -207template <> │ │ │ │ -208struct hash<_O_p_e_n_M_e_s_h::EdgeHandle > │ │ │ │ -209{ │ │ │ │ -210 │ │ │ │ -211 typedef _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e argument_type; │ │ │ │ -212 typedef std::size_t result_type; │ │ │ │ -213 │ │ │ │ -214 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e& h) const │ │ │ │ -215 { │ │ │ │ -216 return h._i_d_x(); │ │ │ │ -217 } │ │ │ │ -218}; │ │ │ │ -219 │ │ │ │ -220template <> │ │ │ │ -221struct hash<_O_p_e_n_M_e_s_h::FaceHandle > │ │ │ │ -222{ │ │ │ │ -223 │ │ │ │ -224 typedef _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e argument_type; │ │ │ │ -225 typedef std::size_t result_type; │ │ │ │ -226 │ │ │ │ -227 std::size_t operator()(const _O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e& h) const │ │ │ │ -228 { │ │ │ │ -229 return h._i_d_x(); │ │ │ │ -230 } │ │ │ │ -231}; │ │ │ │ -232 │ │ │ │ -233#if defined(_MSVC_VER) │ │ │ │ -234# pragma warning(pop) │ │ │ │ -235#endif │ │ │ │ -236 │ │ │ │ -237} │ │ │ │ -238#endif // OM_HAS_HASH │ │ │ │ -239 │ │ │ │ -240 │ │ │ │ -241#endif // OPENMESH_HANDLES_HH │ │ │ │ -242// │ │ │ │ +79} // namespace OpenMesh │ │ │ │ +80// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ -auto operator<<(std::ostream &os, const VectorT< Scalar, DIM > &_vec) - │ │ │ │ -> typename std::enable_if< sizeof(decltype(os<< _vec[0])) >=0 │ │ │ │ -output a vector by printing its space-separated compontens │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e │ │ │ │ -Base class for all handle types. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:63 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ -bool is_valid() const │ │ │ │ -The handle is valid iff the index is not negative. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_n_v_a_l_i_d_a_t_e │ │ │ │ -void invalidate() │ │ │ │ -reset handle to be invalid │ │ │ │ -DDeeffiinniittiioonn Handles.hh:77 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_r_e_s_e_t │ │ │ │ -void reset() │ │ │ │ -reset handle to be invalid │ │ │ │ -DDeeffiinniittiioonn Handles.hh:75 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_d_x │ │ │ │ -int idx() const │ │ │ │ -Get the underlying index of this handle. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:69 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ -Handle type for meshes to simplify some template programming. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00728_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/AutoPropertyHandleT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
PolyMesh_ArrayKernelT.hh
│ │ │ +
AutoPropertyHandleT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,88 +138,108 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS PolyMesh_ArrayKernelT
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ +
44#ifndef OPENMESH_AutoPropertyHandleT_HH
│ │ │ +
45#define OPENMESH_AutoPropertyHandleT_HH
│ │ │ +
46
│ │ │ +
47//== INCLUDES =================================================================
│ │ │ +
48#include <assert.h>
│ │ │ +
49#include <string>
│ │ │
50
│ │ │ -
51
│ │ │ -
52#ifndef OPENMESH_POLY_MESH_ARRAY_KERNEL_HH
│ │ │ -
53#define OPENMESH_POLY_MESH_ARRAY_KERNEL_HH
│ │ │ +
51//== NAMESPACES ===============================================================
│ │ │ +
52
│ │ │ +
53namespace OpenMesh {
│ │ │
54
│ │ │ -
55
│ │ │ -
56//== INCLUDES =================================================================
│ │ │ -
57
│ │ │ -
58
│ │ │ -
59#include <OpenMesh/Core/System/config.h>
│ │ │ -
60#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ - │ │ │ -
62#include <OpenMesh/Core/Mesh/FinalMeshItemsT.hh>
│ │ │ -
63#include <OpenMesh/Core/Mesh/AttribKernelT.hh>
│ │ │ -
64#include <OpenMesh/Core/Mesh/PolyMeshT.hh>
│ │ │ -
65
│ │ │ -
66
│ │ │ -
67//== NAMESPACES ===============================================================
│ │ │ -
68
│ │ │ -
69
│ │ │ -
70namespace OpenMesh {
│ │ │ -
71
│ │ │ -
72template<class Traits>
│ │ │ -
73class TriMesh_ArrayKernelT;
│ │ │ -
74//== CLASS DEFINITION =========================================================
│ │ │ -
75
│ │ │ -
77template <class Traits>
│ │ │ -
│ │ │ - │ │ │ -
79{
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
83};
│ │ │ -
│ │ │ -
84
│ │ │ -
85
│ │ │ -
93template <class Traits = DefaultTraits>
│ │ │ -
│ │ │ - │ │ │ -
95 : public PolyMesh_ArrayKernel_GeneratorT<Traits>::Mesh
│ │ │ -
96{
│ │ │ -
97public:
│ │ │ - │ │ │ -
99 template<class OtherTraits>
│ │ │ - │ │ │ -
101 {
│ │ │ -
102 //assign the connectivity and standard properties
│ │ │ -
103 this->assign(t, true);
│ │ │ -
104
│ │ │ -
105 }
│ │ │ -
106};
│ │ │ -
│ │ │ -
107
│ │ │ -
108
│ │ │ -
109//=============================================================================
│ │ │ -
110} // namespace OpenMesh
│ │ │ -
111//=============================================================================
│ │ │ -
112#endif // OPENMESH_POLY_MESH_ARRAY_KERNEL_HH
│ │ │ -
113//=============================================================================
│ │ │ +
55//== CLASS DEFINITION =========================================================
│ │ │ +
56
│ │ │ +
57template <class Mesh_, class PropertyHandle_>
│ │ │ +
│ │ │ +
58class AutoPropertyHandleT : public PropertyHandle_
│ │ │ +
59{
│ │ │ +
60public:
│ │ │ +
61 typedef Mesh_ Mesh;
│ │ │ +
62 typedef PropertyHandle_ PropertyHandle;
│ │ │ +
63 typedef PropertyHandle Base;
│ │ │ +
64 typedef typename PropertyHandle::Value Value;
│ │ │ + │ │ │ +
66 Self;
│ │ │ +
67protected:
│ │ │ +
68 Mesh* m_;
│ │ │ +
69 bool own_property_;//ref counting?
│ │ │ +
70
│ │ │ +
71public:
│ │ │ + │ │ │ +
73 : m_(nullptr), own_property_(false)
│ │ │ +
74 {}
│ │ │ +
75
│ │ │ +
76 AutoPropertyHandleT(const Self& _other)
│ │ │ +
77 : Base(_other.idx()), m_(_other.m_), own_property_(false)
│ │ │ +
78 {}
│ │ │ +
79
│ │ │ +
80 explicit AutoPropertyHandleT(Mesh& _m, const std::string& _pp_name = std::string())
│ │ │ +
81 { add_property(_m, _pp_name); }
│ │ │ +
82
│ │ │ +
83 AutoPropertyHandleT(Mesh& _m, PropertyHandle _pph)
│ │ │ +
84 : Base(_pph.idx()), m_(&_m), own_property_(false)
│ │ │ +
85 {}
│ │ │ +
86
│ │ │ + │ │ │ +
88 {
│ │ │ +
89 if (own_property_)
│ │ │ +
90 {
│ │ │ +
91 m_->remove_property(*this);
│ │ │ +
92 }
│ │ │ +
93 }
│ │ │ +
94
│ │ │ +
95 inline void add_property(Mesh& _m, const std::string& _pp_name = std::string())
│ │ │ +
96 {
│ │ │ +
97 assert(!is_valid());
│ │ │ +
98 m_ = &_m;
│ │ │ +
99 own_property_ = _pp_name.empty() || !m_->get_property_handle(*this, _pp_name);
│ │ │ +
100 if (own_property_)
│ │ │ +
101 {
│ │ │ +
102 m_->add_property(*this, _pp_name);
│ │ │ +
103 }
│ │ │ +
104 }
│ │ │ +
105
│ │ │ +
106 inline void remove_property()
│ │ │ +
107 {
│ │ │ +
108 assert(own_property_);//only the owner can delete the property
│ │ │ +
109 m_->remove_property(*this);
│ │ │ +
110 own_property_ = false;
│ │ │ +
111 invalidate();
│ │ │ +
112 }
│ │ │ +
113
│ │ │ +
114 template <class _Handle>
│ │ │ +
115 inline Value& operator [] (_Handle _hnd)
│ │ │ +
116 { return m_->property(*this, _hnd); }
│ │ │ +
117
│ │ │ +
118 template <class _Handle>
│ │ │ +
119 inline const Value& operator [] (_Handle _hnd) const
│ │ │ +
120 { return m_->property(*this, _hnd); }
│ │ │ +
121
│ │ │ +
122 inline bool own_property() const
│ │ │ +
123 { return own_property_; }
│ │ │ +
124
│ │ │ +
125 inline void free_property()
│ │ │ +
126 { own_property_ = false; }
│ │ │ +
127};
│ │ │ +
│ │ │ +
128
│ │ │ +
129//=============================================================================
│ │ │ +
130} // namespace OpenMesh
│ │ │ +
131//=============================================================================
│ │ │ +
132#endif // OPENMESH_AutoPropertyHandleT_HH defined
│ │ │ +
133//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
The attribute kernel adds all standard properties to the kernel.
Definition AttribKernelT.hh:73
│ │ │ -
Definition of the mesh entities (items).
Definition FinalMeshItemsT.hh:68
│ │ │ -
Triangle mesh based on the ArrayKernel.
Definition TriMesh_ArrayKernelT.hh:96
│ │ │ -
Helper class to build a PolyMesh-type.
Definition PolyMesh_ArrayKernelT.hh:79
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ -
This file defines the default traits and some convenience macros.
│ │ │ +
Definition AutoPropertyHandleT.hh:59
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -PolyMesh_ArrayKernelT.hh │ │ │ │ +AutoPropertyHandleT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,105 +47,115 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS PolyMesh_ArrayKernelT │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef OPENMESH_POLY_MESH_ARRAY_KERNEL_HH │ │ │ │ -53#define OPENMESH_POLY_MESH_ARRAY_KERNEL_HH │ │ │ │ -54 │ │ │ │ -55 │ │ │ │ -56//== INCLUDES │ │ │ │ +44#ifndef OPENMESH_AutoPropertyHandleT_HH │ │ │ │ +45#define OPENMESH_AutoPropertyHandleT_HH │ │ │ │ +46 │ │ │ │ +47//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ -57 │ │ │ │ -58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_T_r_a_i_t_s_._h_h> │ │ │ │ -62#include │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ -65 │ │ │ │ -66 │ │ │ │ -67//== NAMESPACES │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50 │ │ │ │ +51//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -68 │ │ │ │ -69 │ │ │ │ -70namespace _O_p_e_n_M_e_s_h { │ │ │ │ -71 │ │ │ │ -72template │ │ │ │ -73class TriMesh_ArrayKernelT; │ │ │ │ -74//== CLASS DEFINITION │ │ │ │ +52 │ │ │ │ +53namespace _O_p_e_n_M_e_s_h { │ │ │ │ +54 │ │ │ │ +55//== CLASS DEFINITION │ │ │ │ ========================================================= │ │ │ │ +56 │ │ │ │ +57template │ │ │ │ +_5_8class _A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T : public PropertyHandle_ │ │ │ │ +59{ │ │ │ │ +60public: │ │ │ │ +61 typedef Mesh_ Mesh; │ │ │ │ +62 typedef PropertyHandle_ PropertyHandle; │ │ │ │ +63 typedef PropertyHandle Base; │ │ │ │ +64 typedef typename PropertyHandle::Value Value; │ │ │ │ +65 typedef _A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T_<_M_e_s_h_,_ _P_r_o_p_e_r_t_y_H_a_n_d_l_e_> │ │ │ │ +66 _S_e_l_f; │ │ │ │ +67protected: │ │ │ │ +68 Mesh* m_; │ │ │ │ +69 bool own_property_;//ref counting? │ │ │ │ +70 │ │ │ │ +71public: │ │ │ │ +72 _A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T() │ │ │ │ +73 : m_(nullptr), own_property_(false) │ │ │ │ +74 {} │ │ │ │ 75 │ │ │ │ -77template │ │ │ │ -_7_8struct _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T │ │ │ │ -79{ │ │ │ │ -80 typedef _F_i_n_a_l_M_e_s_h_I_t_e_m_s_T_<_T_r_a_i_t_s_,_ _f_a_l_s_e_> _M_e_s_h_I_t_e_m_s; │ │ │ │ -81 typedef _A_t_t_r_i_b_K_e_r_n_e_l_T_<_M_e_s_h_I_t_e_m_s_,_ _P_o_l_y_C_o_n_n_e_c_t_i_v_i_t_y_> _A_t_t_r_i_b_K_e_r_n_e_l; │ │ │ │ -82 typedef _P_o_l_y_M_e_s_h_T_<_A_t_t_r_i_b_K_e_r_n_e_l_> _M_e_s_h; │ │ │ │ -83}; │ │ │ │ -84 │ │ │ │ -85 │ │ │ │ -93template │ │ │ │ -_9_4class _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -95 : public _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T::Mesh │ │ │ │ -96{ │ │ │ │ -97public: │ │ │ │ -98 _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T() {} │ │ │ │ -99 template │ │ │ │ -100 explicit _P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T( const _T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T_<_O_t_h_e_r_T_r_a_i_t_s_> & │ │ │ │ -t) │ │ │ │ +76 _A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T(const _S_e_l_f& _other) │ │ │ │ +77 : Base(_other.idx()), m_(_other.m_), own_property_(false) │ │ │ │ +78 {} │ │ │ │ +79 │ │ │ │ +80 explicit _A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T(Mesh& _m, const std::string& _pp_name = std:: │ │ │ │ +string()) │ │ │ │ +81 { add_property(_m, _pp_name); } │ │ │ │ +82 │ │ │ │ +83 _A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T(Mesh& _m, PropertyHandle _pph) │ │ │ │ +84 : Base(_pph.idx()), m_(&_m), own_property_(false) │ │ │ │ +85 {} │ │ │ │ +86 │ │ │ │ +87 _~_A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T() │ │ │ │ +88 { │ │ │ │ +89 if (own_property_) │ │ │ │ +90 { │ │ │ │ +91 m_->remove_property(*this); │ │ │ │ +92 } │ │ │ │ +93 } │ │ │ │ +94 │ │ │ │ +95 inline void add_property(Mesh& _m, const std::string& _pp_name = std::string │ │ │ │ +()) │ │ │ │ +96 { │ │ │ │ +97 assert(!is_valid()); │ │ │ │ +98 m_ = &_m; │ │ │ │ +99 own_property_ = _pp_name.empty() || !m_->get_property_handle(*this, │ │ │ │ +_pp_name); │ │ │ │ +100 if (own_property_) │ │ │ │ 101 { │ │ │ │ -102 //assign the connectivity and standard properties │ │ │ │ -103 this->assign(t, true); │ │ │ │ -104 │ │ │ │ -105 } │ │ │ │ -106}; │ │ │ │ -107 │ │ │ │ -108 │ │ │ │ -109// │ │ │ │ +102 m_->add_property(*this, _pp_name); │ │ │ │ +103 } │ │ │ │ +104 } │ │ │ │ +105 │ │ │ │ +106 inline void remove_property() │ │ │ │ +107 { │ │ │ │ +108 assert(own_property_);//only the owner can delete the property │ │ │ │ +109 m_->remove_property(*this); │ │ │ │ +110 own_property_ = false; │ │ │ │ +111 invalidate(); │ │ │ │ +112 } │ │ │ │ +113 │ │ │ │ +114 template │ │ │ │ +115 inline Value& operator [] (_Handle _hnd) │ │ │ │ +116 { return m_->property(*this, _hnd); } │ │ │ │ +117 │ │ │ │ +118 template │ │ │ │ +119 inline const Value& operator [] (_Handle _hnd) const │ │ │ │ +120 { return m_->property(*this, _hnd); } │ │ │ │ +121 │ │ │ │ +122 inline bool own_property() const │ │ │ │ +123 { return own_property_; } │ │ │ │ +124 │ │ │ │ +125 inline void free_property() │ │ │ │ +126 { own_property_ = false; } │ │ │ │ +127}; │ │ │ │ +128 │ │ │ │ +129// │ │ │ │ ============================================================================= │ │ │ │ -110} // namespace OpenMesh │ │ │ │ -111// │ │ │ │ +130} // namespace OpenMesh │ │ │ │ +131// │ │ │ │ ============================================================================= │ │ │ │ -112#endif // OPENMESH_POLY_MESH_ARRAY_KERNEL_HH │ │ │ │ -113// │ │ │ │ +132#endif // OPENMESH_AutoPropertyHandleT_HH defined │ │ │ │ +133// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_K_e_r_n_e_l_T │ │ │ │ -The attribute kernel adds all standard properties to the kernel. │ │ │ │ -DDeeffiinniittiioonn AttribKernelT.hh:73 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_i_n_a_l_M_e_s_h_I_t_e_m_s_T │ │ │ │ -Definition of the mesh entities (items). │ │ │ │ -DDeeffiinniittiioonn FinalMeshItemsT.hh:68 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Triangle mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn TriMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l___G_e_n_e_r_a_t_o_r_T │ │ │ │ -Helper class to build a PolyMesh-type. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:79 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ -Base type for a polygonal mesh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ -_T_r_a_i_t_s_._h_h │ │ │ │ -This file defines the default traits and some convenience macros. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_u_t_o_P_r_o_p_e_r_t_y_H_a_n_d_l_e_T │ │ │ │ +DDeeffiinniittiioonn AutoPropertyHandleT.hh:59 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00731_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/PolyMeshT_impl.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/PropertyCreator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
PolyMeshT_impl.hh
│ │ │ +
PropertyCreator.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,642 +136,213 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ +
42#pragma once
│ │ │
43
│ │ │ -
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS PolyMeshT - IMPLEMENTATION
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#define OPENMESH_POLYMESH_C
│ │ │ -
53
│ │ │ +
44#include <OpenMesh/Core/System/config.h>
│ │ │ +
45#include <OpenMesh/Core/Utils/HandleToPropHandle.hh>
│ │ │ +
46#include <OpenMesh/Core/Utils/PropertyManager.hh>
│ │ │ +
47#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
│ │ │ +
48#include <sstream>
│ │ │ +
49#include <stdexcept>
│ │ │ +
50#include <string>
│ │ │ +
51#include <memory>
│ │ │ +
52
│ │ │ +
53#include <OpenMesh/Core/IO/SR_store.hh>
│ │ │
54
│ │ │ -
55//== INCLUDES =================================================================
│ │ │ -
56
│ │ │ -
57#include <OpenMesh/Core/Mesh/PolyMeshT.hh>
│ │ │ -
58#include <OpenMesh/Core/Geometry/LoopSchemeMaskT.hh>
│ │ │ -
59#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ -
60#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ -
61#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ - │ │ │ -
63#include <vector>
│ │ │ -
64
│ │ │ -
65
│ │ │ -
66//== NAMESPACES ===============================================================
│ │ │ -
67
│ │ │ -
68
│ │ │ -
69namespace OpenMesh {
│ │ │ +
55
│ │ │ +
56namespace OpenMesh {
│ │ │ +
57
│ │ │ +
58#define OM_CONCAT_IMPL(a, b) a##b
│ │ │ +
59#define OM_CONCAT(a, b) OM_CONCAT_IMPL(a, b)
│ │ │ +
60
│ │ │ +
│ │ │ +
67class OPENMESHDLLEXPORT PropertyCreator
│ │ │ +
68{
│ │ │ +
69public:
│ │ │
70
│ │ │ -
71//== IMPLEMENTATION ==========================================================
│ │ │ -
72
│ │ │ -
73template <class Kernel>
│ │ │ -
│ │ │ - │ │ │ -
75{
│ │ │ -
76 assert(Kernel::has_edge_status());//this function needs edge status property
│ │ │ -
77 uint n_feature_edges = 0;
│ │ │ -
78 for (EdgeIter e_it = Kernel::edges_begin(); e_it != Kernel::edges_end(); ++e_it)
│ │ │ -
79 {
│ │ │ -
80 if (fabs(calc_dihedral_angle(*e_it)) > _angle_tresh)
│ │ │ -
81 {//note: could be optimized by comparing cos(dih_angle) vs. cos(_angle_tresh)
│ │ │ -
82 this->status(*e_it).set_feature(true);
│ │ │ -
83 n_feature_edges++;
│ │ │ -
84 }
│ │ │ -
85 else
│ │ │ -
86 {
│ │ │ -
87 this->status(*e_it).set_feature(false);
│ │ │ -
88 }
│ │ │ -
89 }
│ │ │ -
90 return n_feature_edges;
│ │ │ -
91}
│ │ │ -
│ │ │ -
92
│ │ │ -
93//-----------------------------------------------------------------------------
│ │ │ +
72 virtual std::string type_string() = 0;
│ │ │ +
73
│ │ │ +
74 virtual std::string type_id_string() = 0;
│ │ │ +
75
│ │ │ +
77 bool can_you_create(const std::string &_type_name);
│ │ │ +
78
│ │ │ +
80 virtual void create_vertex_property (BaseKernel& _mesh, const std::string& _property_name) = 0;
│ │ │ +
81
│ │ │ +
83 virtual void create_halfedge_property(BaseKernel& _mesh, const std::string& _property_name) = 0;
│ │ │ +
84
│ │ │ +
86 virtual void create_edge_property (BaseKernel& _mesh, const std::string& _property_name) = 0;
│ │ │ +
87
│ │ │ +
89 virtual void create_face_property (BaseKernel& _mesh, const std::string& _property_name) = 0;
│ │ │ +
90
│ │ │ +
92 virtual void create_mesh_property (BaseKernel& _mesh, const std::string& _property_name) = 0;
│ │ │ +
93
│ │ │
94
│ │ │ -
95template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
98{
│ │ │ -
99 return calc_face_normal_impl(_fh, typename GenProg::IF<
│ │ │ - │ │ │ -
101 PointIs3DTag,
│ │ │ -
102 PointIsNot3DTag
│ │ │ -
103 >::Result());
│ │ │ -
104}
│ │ │ +
96 template <typename HandleT>
│ │ │ +
97 void create_property(BaseKernel& _mesh, const std::string& _property_name);
│ │ │ +
98
│ │ │ +
99 virtual ~PropertyCreator() {}
│ │ │ +
100
│ │ │ +
101protected:
│ │ │ +
102 PropertyCreator() {}
│ │ │ +
103
│ │ │ +
104};
│ │ │
│ │ │
105
│ │ │ -
106template <class Kernel>
│ │ │ - │ │ │ - │ │ │ -
109{
│ │ │ -
110 assert(this->halfedge_handle(_fh).is_valid());
│ │ │ -
111 ConstFaceVertexIter fv_it(this->cfv_iter(_fh));
│ │ │ -
112
│ │ │ -
113 // Safeguard for 1-gons
│ │ │ -
114 if (!(++fv_it).is_valid()) return Normal(0, 0, 0);
│ │ │ -
115
│ │ │ -
116 // Safeguard for 2-gons
│ │ │ -
117 if (!(++fv_it).is_valid()) return Normal(0, 0, 0);
│ │ │ -
118
│ │ │ -
119 // use Newell's Method to compute the surface normal
│ │ │ -
120 Normal n(0,0,0);
│ │ │ -
121 for(fv_it = this->cfv_iter(_fh); fv_it.is_valid(); ++fv_it)
│ │ │ +
106template <> inline void PropertyCreator::create_property<VertexHandle> (BaseKernel& _mesh, const std::string& _property_name) { create_vertex_property (_mesh, _property_name); }
│ │ │ +
107template <> inline void PropertyCreator::create_property<HalfedgeHandle>(BaseKernel& _mesh, const std::string& _property_name) { create_halfedge_property(_mesh, _property_name); }
│ │ │ +
108template <> inline void PropertyCreator::create_property<EdgeHandle> (BaseKernel& _mesh, const std::string& _property_name) { create_edge_property (_mesh, _property_name); }
│ │ │ +
109template <> inline void PropertyCreator::create_property<FaceHandle> (BaseKernel& _mesh, const std::string& _property_name) { create_face_property (_mesh, _property_name); }
│ │ │ +
110template <> inline void PropertyCreator::create_property<MeshHandle> (BaseKernel& _mesh, const std::string& _property_name) { create_mesh_property (_mesh, _property_name); }
│ │ │ +
111
│ │ │ +
114template <typename PropertyCreatorT>
│ │ │ +
│ │ │ + │ │ │ +
116{
│ │ │ +
117public:
│ │ │ +
118 std::string type_id_string() override { return get_type_name<typename PropertyCreatorT::type>(); }
│ │ │ +
119
│ │ │ +
120 template <typename HandleT, typename PropT>
│ │ │ +
121 void create_prop(BaseKernel& _mesh, const std::string& _property_name)
│ │ │
122 {
│ │ │ -
123 // next vertex
│ │ │ -
124 ConstFaceVertexIter fv_itn = fv_it;
│ │ │ -
125 ++fv_itn;
│ │ │ -
126
│ │ │ -
127 if (!fv_itn.is_valid())
│ │ │ -
128 fv_itn = this->cfv_iter(_fh);
│ │ │ -
129
│ │ │ -
130 // http://www.opengl.org/wiki/Calculating_a_Surface_Normal
│ │ │ -
131 const Point a = this->point(*fv_it) - this->point(*fv_itn);
│ │ │ -
132 const Point b = this->point(*fv_it) + this->point(*fv_itn);
│ │ │ -
133
│ │ │ +
123 using PHandle = typename PropHandle<HandleT>::template type<PropT>;
│ │ │ +
124 PHandle prop;
│ │ │ +
125 if (!_mesh.get_property_handle(prop, _property_name))
│ │ │ +
126 _mesh.add_property(prop, _property_name);
│ │ │ +
127 }
│ │ │ +
128
│ │ │ +
129 void create_vertex_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop<VertexHandle , typename PropertyCreatorT::type>(_mesh, _property_name); }
│ │ │ +
130 void create_halfedge_property(BaseKernel& _mesh, const std::string& _property_name) override { create_prop<HalfedgeHandle, typename PropertyCreatorT::type>(_mesh, _property_name);}
│ │ │ +
131 void create_edge_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop<EdgeHandle , typename PropertyCreatorT::type>(_mesh, _property_name);}
│ │ │ +
132 void create_face_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop<FaceHandle , typename PropertyCreatorT::type>(_mesh, _property_name);}
│ │ │ +
133 void create_mesh_property (BaseKernel& _mesh, const std::string& _property_name) override { create_prop<MeshHandle , typename PropertyCreatorT::type>(_mesh, _property_name);}
│ │ │
134
│ │ │ -
135 // Due to traits, the value types of normals and points can be different.
│ │ │ -
136 // Therefore we cast them here.
│ │ │ -
137 n[0] += static_cast<typename vector_traits<Normal>::value_type>(a[1] * b[2]);
│ │ │ -
138 n[1] += static_cast<typename vector_traits<Normal>::value_type>(a[2] * b[0]);
│ │ │ -
139 n[2] += static_cast<typename vector_traits<Normal>::value_type>(a[0] * b[1]);
│ │ │ -
140 }
│ │ │ -
141
│ │ │ -
142 const typename vector_traits<Normal>::value_type length = norm(n);
│ │ │ -
143
│ │ │ -
144 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG
│ │ │ -
145 // vector class does not return self after component-wise
│ │ │ -
146 // self-multiplication with a scalar!!!
│ │ │ -
147 return (length != typename vector_traits<Normal>::value_type(0))
│ │ │ -
148 ? ((n *= (typename vector_traits<Normal>::value_type(1)/length)), n)
│ │ │ -
149 : Normal(0, 0, 0);
│ │ │ -
150}
│ │ │ -
151
│ │ │ -
152template <class Kernel>
│ │ │ - │ │ │ -
154PolyMeshT<Kernel>::calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const
│ │ │ -
155{
│ │ │ -
156 // Dummy fallback implementation
│ │ │ -
157 // Returns just an initialized all 0 normal
│ │ │ -
158 // This function is only used if we don't have a matching implementation
│ │ │ -
159 // for normal computation with the current vector type defined in the mesh traits
│ │ │ -
160
│ │ │ -
161 assert(false);
│ │ │ -
162
│ │ │ -
163 Normal normal;
│ │ │ -
164 vectorize(normal,Scalar(0));
│ │ │ -
165 return normal;
│ │ │ -
166}
│ │ │ -
167
│ │ │ -
168//-----------------------------------------------------------------------------
│ │ │ -
169
│ │ │ -
170template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
173calc_face_normal(const Point& _p0,
│ │ │ -
174 const Point& _p1,
│ │ │ -
175 const Point& _p2) const
│ │ │ -
176{
│ │ │ -
177 return calc_face_normal_impl(_p0, _p1, _p2, typename GenProg::IF<
│ │ │ - │ │ │ -
179 PointIs3DTag,
│ │ │ -
180 PointIsNot3DTag
│ │ │ -
181 >::Result());
│ │ │ -
182}
│ │ │ -
│ │ │ +
135 ~PropertyCreatorImpl() override {}
│ │ │ +
136protected:
│ │ │ +
137 PropertyCreatorImpl() {}
│ │ │ +
138};
│ │ │ +
│ │ │ +
139
│ │ │ +
141namespace {
│ │ │ +
142template <typename T>
│ │ │ +
143class PropertyCreatorT : public PropertyCreatorImpl<PropertyCreatorT<T>>
│ │ │ +
144{
│ │ │ +
145};
│ │ │ +
146}
│ │ │ +
147
│ │ │ +
149
│ │ │ +
150#define OM_REGISTER_PROPERTY_TYPE(ClassName) \
│ │ │ +
151namespace OpenMesh { \
│ │ │ +
152namespace { /* ensure internal linkage of class */ \
│ │ │ +
153template <> \
│ │ │ +
154class PropertyCreatorT<ClassName> : public PropertyCreatorImpl<PropertyCreatorT<ClassName>> \
│ │ │ +
155{ \
│ │ │ +
156public: \
│ │ │ +
157 using type = ClassName; \
│ │ │ +
158 std::string type_string() override { return OpenMesh::IO::binary<type>::type_identifier(); } \
│ │ │ +
159 \
│ │ │ +
160 PropertyCreatorT() \
│ │ │ +
161 { \
│ │ │ +
162 PropertyCreationManager::instance().register_property_creator(this); \
│ │ │ +
163 } \
│ │ │ +
164 ~PropertyCreatorT() override {} \
│ │ │ +
165}; \
│ │ │ +
166} \
│ │ │ +
167/* static to ensure internal linkage of object */ \
│ │ │ +
168static PropertyCreatorT<ClassName> OM_CONCAT(property_creator_registration_object_, __LINE__); \
│ │ │ +
169}
│ │ │ +
170
│ │ │ +
│ │ │ +
180class OPENMESHDLLEXPORT PropertyCreationManager
│ │ │ +
181{
│ │ │ +
182public:
│ │ │
183
│ │ │ -
184template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
187calc_normal(FaceHandle _fh) const
│ │ │ -
188{
│ │ │ -
189 return calc_face_normal(_fh);
│ │ │ -
190}
│ │ │ -
│ │ │ -
191
│ │ │ -
192template <class Kernel>
│ │ │ - │ │ │ - │ │ │ -
195calc_face_normal_impl(const Point& _p0,
│ │ │ -
196 const Point& _p1,
│ │ │ -
197 const Point& _p2,
│ │ │ -
198 PointIs3DTag) const
│ │ │ -
199{
│ │ │ -
200#if 1
│ │ │ -
201 // The OpenSG <Vector>::operator -= () does not support the type Point
│ │ │ -
202 // as rhs. Therefore use vector_cast at this point!!!
│ │ │ -
203 // Note! OpenSG distinguishes between Normal and Point!!!
│ │ │ -
204 Normal p1p0(vector_cast<Normal>(_p0)); p1p0 -= vector_cast<Normal>(_p1);
│ │ │ -
205 Normal p1p2(vector_cast<Normal>(_p2)); p1p2 -= vector_cast<Normal>(_p1);
│ │ │ -
206
│ │ │ -
207 Normal n = cross(p1p2, p1p0);
│ │ │ -
208 typename vector_traits<Normal>::value_type length = norm(n);
│ │ │ -
209
│ │ │ -
210 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG
│ │ │ -
211 // vector class does not return self after component-wise
│ │ │ -
212 // self-multiplication with a scalar!!!
│ │ │ -
213 return (length != typename vector_traits<Normal>::value_type(0))
│ │ │ -
214 ? ((n *= (typename vector_traits<Normal>::value_type(1)/length)),n)
│ │ │ -
215 : Normal(0,0,0);
│ │ │ -
216#else
│ │ │ -
217 Point p1p0 = _p0; p1p0 -= _p1;
│ │ │ -
218 Point p1p2 = _p2; p1p2 -= _p1;
│ │ │ -
219
│ │ │ -
220 Normal n = vector_cast<Normal>(cross(p1p2, p1p0));
│ │ │ -
221 typename vector_traits<Normal>::value_type length = norm(n);
│ │ │ -
222
│ │ │ -
223 return (length != 0.0) ? n *= (1.0/length) : Normal(0,0,0);
│ │ │ -
224#endif
│ │ │ -
225}
│ │ │ -
226
│ │ │ -
227template <class Kernel>
│ │ │ - │ │ │ -
229PolyMeshT<Kernel>::calc_face_normal_impl(const Point&, const Point&, const Point&, PointIsNot3DTag) const
│ │ │ -
230{
│ │ │ +
184 static PropertyCreationManager& instance();
│ │ │ +
185
│ │ │ +
186 template <typename HandleT>
│ │ │ +
187 void create_property(BaseKernel& _mesh, const std::string& _type_name, const std::string& _property_name)
│ │ │ +
188 {
│ │ │ +
189
│ │ │ +
190 auto can_create = [_type_name](OpenMesh::PropertyCreator* pc){
│ │ │ +
191 return pc->can_you_create(_type_name);
│ │ │ +
192 };
│ │ │ +
193
│ │ │ +
194 std::vector<OpenMesh::PropertyCreator*>::iterator pc_iter = std::find_if(property_creators_.begin(),
│ │ │ +
195 property_creators_.end(), can_create);
│ │ │ +
196 if (pc_iter != property_creators_.end())
│ │ │ +
197 {
│ │ │ +
198 const auto& pc = *pc_iter;
│ │ │ +
199 pc->create_property<HandleT>(_mesh, _property_name);
│ │ │ +
200 return;
│ │ │ +
201 }
│ │ │ +
202
│ │ │ +
203 omerr() << "No property creator registered that can create a property of type " << _type_name << std::endl;
│ │ │ +
204 omerr() << "You need to register your custom type using OM_REGISTER_PROPERTY_TYPE(ClassName) and declare the struct binary<ClassName>.\
│ │ │ +
205 See documentation for more details." << std::endl;
│ │ │ +
206 omerr() << "Adding property failed." << std::endl;
│ │ │ +
207 }
│ │ │ +
208
│ │ │ +
209 void register_property_creator(PropertyCreator* _property_creator)
│ │ │ +
210 {
│ │ │ +
211 for (auto pc : property_creators_)
│ │ │ +
212 if (pc->type_string() == _property_creator->type_string())
│ │ │ +
213 {
│ │ │ +
214 if (pc->type_id_string() != _property_creator->type_id_string())
│ │ │ +
215 {
│ │ │ +
216 omerr() << "And it looks like you are trying to add a different type with an already existing string identification." << std::endl;
│ │ │ +
217 omerr() << "Type id of existing type is " << pc->type_id_string() << " trying to add for " << _property_creator->type_id_string() << std::endl;
│ │ │ +
218 }
│ │ │ +
219 return;
│ │ │ +
220 }
│ │ │ +
221 property_creators_.push_back(_property_creator);
│ │ │ +
222 }
│ │ │ +
223
│ │ │ +
224private:
│ │ │ +
225
│ │ │ + │ │ │ + │ │ │ +
228
│ │ │ +
229 std::vector<PropertyCreator*> property_creators_;
│ │ │ +
230};
│ │ │ +
│ │ │
231
│ │ │ -
232 // Dummy fallback implementation
│ │ │ -
233 // Returns just an initialized all 0 normal
│ │ │ -
234 // This function is only used if we don't have a matching implementation
│ │ │ -
235 // for normal computation with the current vector type defined in the mesh traits
│ │ │ -
236
│ │ │ -
237 assert(false);
│ │ │ -
238
│ │ │ -
239 Normal normal;
│ │ │ -
240 vectorize(normal,Scalar(0));
│ │ │ -
241 return normal;
│ │ │ -
242}
│ │ │ -
243
│ │ │ -
244//-----------------------------------------------------------------------------
│ │ │ -
245
│ │ │ -
246template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ - │ │ │ -
250{
│ │ │ -
251 Point _pt;
│ │ │ -
252 vectorize(_pt, Scalar(0));
│ │ │ -
253 Scalar valence = 0.0;
│ │ │ -
254 for (ConstFaceVertexIter cfv_it = this->cfv_iter(_fh); cfv_it.is_valid(); ++cfv_it, valence += 1.0)
│ │ │ -
255 {
│ │ │ -
256 _pt += this->point(*cfv_it);
│ │ │ -
257 }
│ │ │ -
258 _pt /= valence;
│ │ │ -
259 return _pt;
│ │ │ -
260}
│ │ │ -
│ │ │ -
261
│ │ │ -
262//-----------------------------------------------------------------------------
│ │ │ -
263
│ │ │ -
264template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
267calc_centroid(FaceHandle _fh) const
│ │ │ -
268{
│ │ │ -
269 return calc_face_centroid(_fh);
│ │ │ -
270}
│ │ │ -
│ │ │ -
271
│ │ │ -
272//-----------------------------------------------------------------------------
│ │ │ -
273
│ │ │ -
274template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
277calc_centroid(EdgeHandle _eh) const
│ │ │ -
278{
│ │ │ -
279 return this->calc_edge_midpoint(_eh);
│ │ │ -
280}
│ │ │ -
│ │ │ -
281
│ │ │ -
282//-----------------------------------------------------------------------------
│ │ │ -
283
│ │ │ -
284template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ - │ │ │ -
288{
│ │ │ -
289 return this->calc_edge_midpoint(this->edge_handle(_heh));
│ │ │ -
290}
│ │ │ -
│ │ │ -
291
│ │ │ -
292//-----------------------------------------------------------------------------
│ │ │ -
293
│ │ │ -
294template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ - │ │ │ -
298{
│ │ │ -
299 return this->point(_vh);
│ │ │ -
300}
│ │ │ -
│ │ │ -
301
│ │ │ -
302//-----------------------------------------------------------------------------
│ │ │ -
303
│ │ │ -
304template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
307calc_centroid(MeshHandle /*_mh*/) const
│ │ │ -
308{
│ │ │ -
309 return this->vertices().avg([this](VertexHandle vh) { return this->point(vh); });
│ │ │ -
310}
│ │ │ -
│ │ │ -
311
│ │ │ -
312//-----------------------------------------------------------------------------
│ │ │ -
313
│ │ │ -
314template <class Kernel>
│ │ │ -
315void
│ │ │ -
│ │ │ - │ │ │ - │ │ │ -
318{
│ │ │ -
319 // Face normals are required to compute the vertex and the halfedge normals
│ │ │ -
320 if (Kernel::has_face_normals() ) {
│ │ │ -
321 update_face_normals();
│ │ │ -
322
│ │ │ -
323 if (Kernel::has_vertex_normals() ) update_vertex_normals();
│ │ │ -
324 if (Kernel::has_halfedge_normals()) update_halfedge_normals();
│ │ │ -
325 }
│ │ │ -
326}
│ │ │ -
│ │ │ -
327
│ │ │ -
328
│ │ │ -
329//-----------------------------------------------------------------------------
│ │ │ -
330
│ │ │ -
331
│ │ │ -
332template <class Kernel>
│ │ │ -
333void
│ │ │ -
│ │ │ - │ │ │ - │ │ │ -
336{
│ │ │ -
337 FaceIter f_it(Kernel::faces_sbegin()), f_end(Kernel::faces_end());
│ │ │ -
338
│ │ │ -
339 for (; f_it != f_end; ++f_it)
│ │ │ -
340 this->set_normal(*f_it, calc_face_normal(*f_it));
│ │ │ -
341}
│ │ │ -
│ │ │ -
342
│ │ │ -
343
│ │ │ -
344//-----------------------------------------------------------------------------
│ │ │ -
345
│ │ │ -
346
│ │ │ -
347template <class Kernel>
│ │ │ -
348void
│ │ │ -
│ │ │ - │ │ │ -
350update_halfedge_normals(const double _feature_angle)
│ │ │ -
351{
│ │ │ -
352 HalfedgeIter h_it(Kernel::halfedges_begin()), h_end(Kernel::halfedges_end());
│ │ │ -
353
│ │ │ -
354 for (; h_it != h_end; ++h_it)
│ │ │ -
355 this->set_normal(*h_it, calc_halfedge_normal(*h_it, _feature_angle));
│ │ │ -
356}
│ │ │ -
│ │ │ -
357
│ │ │ -
358
│ │ │ -
359//-----------------------------------------------------------------------------
│ │ │ -
360
│ │ │ -
361
│ │ │ -
362template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
365calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle) const
│ │ │ -
366{
│ │ │ -
367 if(Kernel::is_boundary(_heh))
│ │ │ -
368 return Normal(0,0,0);
│ │ │ -
369 else
│ │ │ -
370 {
│ │ │ -
371 std::vector<FaceHandle> fhs; fhs.reserve(10);
│ │ │ -
372
│ │ │ -
373 HalfedgeHandle heh = _heh;
│ │ │ -
374
│ │ │ -
375 // collect CW face-handles
│ │ │ -
376 do
│ │ │ -
377 {
│ │ │ -
378 fhs.push_back(Kernel::face_handle(heh));
│ │ │ -
379
│ │ │ -
380 heh = Kernel::next_halfedge_handle(heh);
│ │ │ -
381 heh = Kernel::opposite_halfedge_handle(heh);
│ │ │ -
382 }
│ │ │ -
383 while(heh != _heh && !Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, _feature_angle));
│ │ │ -
384
│ │ │ -
385 // collect CCW face-handles
│ │ │ -
386 if(heh != _heh && !is_estimated_feature_edge(_heh, _feature_angle))
│ │ │ -
387 {
│ │ │ -
388 heh = Kernel::opposite_halfedge_handle(_heh);
│ │ │ -
389
│ │ │ -
390 if ( !Kernel::is_boundary(heh) ) {
│ │ │ -
391 do
│ │ │ -
392 {
│ │ │ -
393
│ │ │ -
394 fhs.push_back(Kernel::face_handle(heh));
│ │ │ -
395
│ │ │ -
396 heh = Kernel::prev_halfedge_handle(heh);
│ │ │ -
397 heh = Kernel::opposite_halfedge_handle(heh);
│ │ │ -
398 }
│ │ │ -
399 while(!Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, _feature_angle));
│ │ │ -
400 }
│ │ │ -
401 }
│ │ │ -
402
│ │ │ -
403 Normal n(0,0,0);
│ │ │ -
404 for (unsigned int i = 0; i < fhs.size(); ++i)
│ │ │ -
405 n += Kernel::has_face_normals() ? Kernel::normal(fhs[i]) : calc_face_normal(fhs[i]);
│ │ │ -
406
│ │ │ -
407 return normalize(n);
│ │ │ -
408 }
│ │ │ -
409}
│ │ │ -
│ │ │ -
410
│ │ │ -
411
│ │ │ -
412//-----------------------------------------------------------------------------
│ │ │ -
413
│ │ │ -
414
│ │ │ -
415template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
418calc_normal(HalfedgeHandle _heh, const double _feature_angle) const
│ │ │ -
419{
│ │ │ -
420 return calc_halfedge_normal(_heh, _feature_angle);
│ │ │ -
421}
│ │ │ -
│ │ │ -
422
│ │ │ -
423
│ │ │ -
424//-----------------------------------------------------------------------------
│ │ │ -
425
│ │ │ -
426
│ │ │ -
427template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
430calc_normal(EdgeHandle _eh) const
│ │ │ -
431{
│ │ │ -
432 Normal n(0, 0, 0);
│ │ │ -
433 for (int i = 0; i < 2; ++i)
│ │ │ -
434 {
│ │ │ -
435 const auto heh = this->halfedge_handle(_eh, i);
│ │ │ -
436 const auto fh = this->face_handle(heh);
│ │ │ -
437 if (fh.is_valid())
│ │ │ -
438 n += calc_normal(fh);
│ │ │ -
439 }
│ │ │ -
440 const auto length = norm(n);
│ │ │ -
441 if (length != 0)
│ │ │ -
442 n /= length;
│ │ │ -
443 return n;
│ │ │ -
444}
│ │ │ -
│ │ │ -
445
│ │ │ -
446//-----------------------------------------------------------------------------
│ │ │ -
447
│ │ │ -
448
│ │ │ -
449template <class Kernel>
│ │ │ -
450bool
│ │ │ -
│ │ │ - │ │ │ -
452is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
│ │ │ -
453{
│ │ │ -
454 EdgeHandle eh = Kernel::edge_handle(_heh);
│ │ │ -
455
│ │ │ -
456 if(Kernel::has_edge_status())
│ │ │ -
457 {
│ │ │ -
458 if(Kernel::status(eh).feature())
│ │ │ -
459 return true;
│ │ │ -
460 }
│ │ │ -
461
│ │ │ -
462 if(Kernel::is_boundary(eh))
│ │ │ -
463 return false;
│ │ │ -
464
│ │ │ -
465 // compute angle between faces
│ │ │ -
466 FaceHandle fh0 = Kernel::face_handle(_heh);
│ │ │ -
467 FaceHandle fh1 = Kernel::face_handle(Kernel::opposite_halfedge_handle(_heh));
│ │ │ -
468
│ │ │ -
469 Normal fn0 = Kernel::has_face_normals() ? Kernel::normal(fh0) : calc_face_normal(fh0);
│ │ │ -
470 Normal fn1 = Kernel::has_face_normals() ? Kernel::normal(fh1) : calc_face_normal(fh1);
│ │ │ -
471
│ │ │ -
472 // dihedral angle above angle threshold
│ │ │ -
473 return ( dot(fn0,fn1) < cos(_feature_angle) );
│ │ │ -
474}
│ │ │ -
│ │ │ -
475
│ │ │ -
476
│ │ │ -
477//-----------------------------------------------------------------------------
│ │ │ -
478
│ │ │ -
479
│ │ │ -
480template <class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ - │ │ │ -
484{
│ │ │ -
485 Normal n;
│ │ │ -
486 calc_vertex_normal_fast(_vh,n);
│ │ │ -
487
│ │ │ -
488 Scalar length = norm(n);
│ │ │ -
489 if (length != 0.0) n *= (Scalar(1.0)/length);
│ │ │ -
490
│ │ │ -
491 return n;
│ │ │ -
492}
│ │ │ -
│ │ │ -
493
│ │ │ -
494//-----------------------------------------------------------------------------
│ │ │ -
495template <class Kernel>
│ │ │ -
│ │ │ - │ │ │ - │ │ │ -
498{
│ │ │ -
499 vectorize(_n, Scalar(0));
│ │ │ -
500 for (ConstVertexFaceIter vf_it = this->cvf_iter(_vh); vf_it.is_valid(); ++vf_it)
│ │ │ -
501 _n += this->normal(*vf_it);
│ │ │ -
502}
│ │ │ -
│ │ │ -
503
│ │ │ -
504//-----------------------------------------------------------------------------
│ │ │ -
505template <class Kernel>
│ │ │ -
│ │ │ - │ │ │ - │ │ │ -
508{
│ │ │ -
509 vectorize(_n, Scalar(0));
│ │ │ -
510 ConstVertexIHalfedgeIter cvih_it = this->cvih_iter(_vh);
│ │ │ -
511 if (! cvih_it.is_valid() )
│ │ │ -
512 {//don't crash on isolated vertices
│ │ │ -
513 return;
│ │ │ -
514 }
│ │ │ -
515 Normal in_he_vec;
│ │ │ -
516 calc_edge_vector(*cvih_it, in_he_vec);
│ │ │ -
517 for ( ; cvih_it.is_valid(); ++cvih_it)
│ │ │ -
518 {//calculates the sector normal defined by cvih_it and adds it to _n
│ │ │ -
519 if (this->is_boundary(*cvih_it))
│ │ │ -
520 {
│ │ │ -
521 continue;
│ │ │ -
522 }
│ │ │ -
523 HalfedgeHandle out_heh(this->next_halfedge_handle(*cvih_it));
│ │ │ -
524 Normal out_he_vec;
│ │ │ -
525 calc_edge_vector(out_heh, out_he_vec);
│ │ │ -
526 _n += cross(in_he_vec, out_he_vec);//sector area is taken into account
│ │ │ -
527 in_he_vec = out_he_vec;
│ │ │ -
528 in_he_vec *= -1;//change the orientation
│ │ │ -
529 }
│ │ │ -
530 Scalar length = norm(_n);
│ │ │ -
531 if (length != 0.0)
│ │ │ -
532 _n *= (Scalar(1.0)/length);
│ │ │ -
533}
│ │ │ -
│ │ │ -
534
│ │ │ -
535//-----------------------------------------------------------------------------
│ │ │ -
536template <class Kernel>
│ │ │ -
│ │ │ - │ │ │ - │ │ │ -
539{
│ │ │ -
540 static const LoopSchemeMaskDouble& loop_scheme_mask__ =
│ │ │ - │ │ │ -
542
│ │ │ -
543 Normal t_v(0.0,0.0,0.0), t_w(0.0,0.0,0.0);
│ │ │ -
544 unsigned int vh_val = this->valence(_vh);
│ │ │ -
545 unsigned int i = 0;
│ │ │ -
546 for (ConstVertexOHalfedgeIter cvoh_it = this->cvoh_iter(_vh); cvoh_it.is_valid(); ++cvoh_it, ++i)
│ │ │ -
547 {
│ │ │ -
548 VertexHandle r1_v( this->to_vertex_handle(*cvoh_it) );
│ │ │ -
549 t_v += (typename vector_traits<Point>::value_type)(loop_scheme_mask__.tang0_weight(vh_val, i))*this->point(r1_v);
│ │ │ -
550 t_w += (typename vector_traits<Point>::value_type)(loop_scheme_mask__.tang1_weight(vh_val, i))*this->point(r1_v);
│ │ │ -
551 }
│ │ │ -
552 _n = cross(t_w, t_v);//hack: should be cross(t_v, t_w), but then the normals are reversed?
│ │ │ -
553}
│ │ │ -
│ │ │ -
554
│ │ │ -
555//-----------------------------------------------------------------------------
│ │ │ -
556
│ │ │ -
557template<class Kernel>
│ │ │ - │ │ │ -
│ │ │ - │ │ │ -
560calc_normal(VertexHandle _vh) const
│ │ │ -
561{
│ │ │ -
562 Normal n;
│ │ │ -
563 calc_vertex_normal_correct(_vh, n);
│ │ │ -
564 return n;
│ │ │ -
565}
│ │ │ -
│ │ │ -
566
│ │ │ -
567//-----------------------------------------------------------------------------
│ │ │ -
568
│ │ │ -
569template <class Kernel>
│ │ │ -
570void
│ │ │ -
│ │ │ - │ │ │ - │ │ │ -
573{
│ │ │ -
574 VertexIter v_it(Kernel::vertices_begin()), v_end(Kernel::vertices_end());
│ │ │ -
575
│ │ │ -
576 for (; v_it!=v_end; ++v_it)
│ │ │ -
577 this->set_normal(*v_it, calc_vertex_normal(*v_it));
│ │ │ -
578}
│ │ │ -
│ │ │ -
579
│ │ │ -
580//=============================================================================
│ │ │ -
581} // namespace OpenMesh
│ │ │ -
582//=============================================================================
│ │ │ -
This file provides the streams omlog, omout, and omerr.
│ │ │ +
236template <typename HandleT>
│ │ │ +
│ │ │ +
237void create_property_from_string(BaseKernel& _mesh, const std::string& _type_name, const std::string& _property_name)
│ │ │ +
238{
│ │ │ +
239 PropertyCreationManager::instance().create_property<HandleT>(_mesh, _type_name, _property_name);
│ │ │ +
240}
│ │ │ +
│ │ │ +
241
│ │ │ +
242} /* namespace OpenMesh */
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ -
@ Normal
Add normals to mesh item (vertices/faces)
Definition Attributes.hh:82
│ │ │ -
implements cache for the weights of the original Loop scheme supported:
Definition LoopSchemeMaskT.hh:67
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Handle type for meshes to simplify some template programming.
Definition Handles.hh:149
│ │ │ -
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ -
void calc_face_centroid(FaceHandle _fh, Point &_pt) const
calculates the average of the vertices defining _fh
Definition PolyMeshT.hh:282
│ │ │ -
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ -
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ -
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition PolyMeshT.hh:177
│ │ │ -
void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const
Different methods for calculation of the normal at _vh:
Definition PolyMeshT_impl.hh:497
│ │ │ -
void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:507
│ │ │ -
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │ -
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ -
void update_face_normals()
Update normal vectors for all faces.
Definition PolyMeshT_impl.hh:335
│ │ │ -
void update_halfedge_normals(const double _feature_angle=0.8)
Update normal vectors for all halfedges.
Definition PolyMeshT_impl.hh:350
│ │ │ -
unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0))
tags an edge as a feature if its dihedral angle is larger than _angle_tresh returns the number of the...
Definition PolyMeshT_impl.hh:74
│ │ │ -
virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle=0.8) const
Calculate halfedge normal for one specific halfedge.
Definition PolyMeshT_impl.hh:365
│ │ │ -
void update_normals()
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:317
│ │ │ -
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition PolyMeshT.hh:176
│ │ │ -
Point calc_centroid(FaceHandle _fh) const
Computes and returns the average of the vertices defining _fh (same as calc_face_centroid)
Definition PolyMeshT_impl.hh:267
│ │ │ -
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:174
│ │ │ -
virtual Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh.
Definition PolyMeshT_impl.hh:97
│ │ │ -
bool is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) const
identifies feature edges w.r.t.
Definition PolyMeshT_impl.hh:452
│ │ │ -
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ -
void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const
Compute normals for all primitives.
Definition PolyMeshT_impl.hh:538
│ │ │ -
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ -
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ -
void update_vertex_normals()
Update normal vectors for all vertices.
Definition PolyMeshT_impl.hh:572
│ │ │ -
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:173
│ │ │ -
Kernel::HalfedgeIter HalfedgeIter
Scalar type.
Definition PolyMeshT.hh:144
│ │ │ -
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ -
Normal calc_normal(FaceHandle _fh) const
same as calc_face_normal
Definition PolyMeshT_impl.hh:187
│ │ │ -
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ -
Normal calc_vertex_normal(VertexHandle _vh) const
Calculate vertex normal for one specific vertex.
Definition PolyMeshT_impl.hh:483
│ │ │ -
static T & Instance()
Singleton access function.
Definition SingletonT.hh:86
│ │ │ -
Helper class providing information about a vector type.
Definition vector_traits.hh:89
│ │ │ -
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │ +
void create_property_from_string(BaseKernel &_mesh, const std::string &_type_name, const std::string &_property_name)
Create a property with type corresponding to _type_name on _mesh with name _property_name.
Definition PropertyCreator.hh:237
│ │ │ +
This class provides low-level property management like adding/removing properties and access to prope...
Definition BaseKernel.hh:98
│ │ │ +
void add_property(VPropHandleT< T > &_ph, const std::string &_name="<vprop>")
You should not use this function directly.
Definition BaseKernel.hh:141
│ │ │ +
bool get_property_handle(VPropHandleT< T > &_ph, const std::string &_name) const
You should not use this function directly.
Definition BaseKernel.hh:254
│ │ │ +
Definition Property.hh:487
│ │ │ +
Base class for property creators.
Definition PropertyCreator.hh:68
│ │ │ +
virtual void create_face_property(BaseKernel &_mesh, const std::string &_property_name)=0
Create a face property on _mesh with name _property_name.
│ │ │ +
virtual std::string type_string()=0
The string that corresponds to the type this property creator can create.
│ │ │ +
virtual void create_halfedge_property(BaseKernel &_mesh, const std::string &_property_name)=0
Create a halfedge property on _mesh with name _property_name.
│ │ │ +
void create_property(BaseKernel &_mesh, const std::string &_property_name)
Create a property for the element of type HandleT on _mesh with name _property_name.
│ │ │ +
virtual void create_mesh_property(BaseKernel &_mesh, const std::string &_property_name)=0
Create a mesh property on _mesh with name _property_name.
│ │ │ +
virtual void create_vertex_property(BaseKernel &_mesh, const std::string &_property_name)=0
Create a vertex property on _mesh with name _property_name.
│ │ │ +
virtual void create_edge_property(BaseKernel &_mesh, const std::string &_property_name)=0
Create an edge property on _mesh with name _property_name.
│ │ │ +
Helper class that contains the implementation of the create_<HandleT>_property methods.
Definition PropertyCreator.hh:116
│ │ │ +
void create_edge_property(BaseKernel &_mesh, const std::string &_property_name) override
Create an edge property on _mesh with name _property_name.
Definition PropertyCreator.hh:131
│ │ │ +
void create_face_property(BaseKernel &_mesh, const std::string &_property_name) override
Create a face property on _mesh with name _property_name.
Definition PropertyCreator.hh:132
│ │ │ +
void create_vertex_property(BaseKernel &_mesh, const std::string &_property_name) override
Create a vertex property on _mesh with name _property_name.
Definition PropertyCreator.hh:129
│ │ │ +
void create_mesh_property(BaseKernel &_mesh, const std::string &_property_name) override
Create a mesh property on _mesh with name _property_name.
Definition PropertyCreator.hh:133
│ │ │ +
void create_halfedge_property(BaseKernel &_mesh, const std::string &_property_name) override
Create a halfedge property on _mesh with name _property_name.
Definition PropertyCreator.hh:130
│ │ │ +
Class for adding properties based on strings.
Definition PropertyCreator.hh:181
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -PolyMeshT_impl.hh │ │ │ │ +PropertyCreator.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,763 +45,304 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ +42#pragma once │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45// │ │ │ │ -============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS PolyMeshT - IMPLEMENTATION │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ -============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#define OPENMESH_POLYMESH_C │ │ │ │ -53 │ │ │ │ +44#include │ │ │ │ +45#include │ │ │ │ +46#include │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50#include │ │ │ │ +51#include │ │ │ │ +52 │ │ │ │ +53#include │ │ │ │ 54 │ │ │ │ -55//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ -63#include │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -67 │ │ │ │ -68 │ │ │ │ -69namespace _O_p_e_n_M_e_s_h { │ │ │ │ +55 │ │ │ │ +56namespace _O_p_e_n_M_e_s_h { │ │ │ │ +57 │ │ │ │ +58#define OM_CONCAT_IMPL(a, b) a##b │ │ │ │ +59#define OM_CONCAT(a, b) OM_CONCAT_IMPL(a, b) │ │ │ │ +60 │ │ │ │ +_6_7class OPENMESHDLLEXPORT _P_r_o_p_e_r_t_y_C_r_e_a_t_o_r │ │ │ │ +68{ │ │ │ │ +69public: │ │ │ │ 70 │ │ │ │ -71//== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -72 │ │ │ │ -73template │ │ │ │ -_7_4uint _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s(_S_c_a_l_a_r _angle_tresh) │ │ │ │ -75{ │ │ │ │ -76 assert(Kernel::has_edge_status());//this function needs edge status property │ │ │ │ -77 uint n_feature_edges = 0; │ │ │ │ -78 for (_E_d_g_e_I_t_e_r e_it = Kernel::edges_begin(); e_it != Kernel::edges_end(); │ │ │ │ -++e_it) │ │ │ │ -79 { │ │ │ │ -80 if (fabs(calc_dihedral_angle(*e_it)) > _angle_tresh) │ │ │ │ -81 {//note: could be optimized by comparing cos(dih_angle) vs. cos │ │ │ │ -(_angle_tresh) │ │ │ │ -82 this->status(*e_it).set_feature(true); │ │ │ │ -83 n_feature_edges++; │ │ │ │ -84 } │ │ │ │ -85 else │ │ │ │ -86 { │ │ │ │ -87 this->status(*e_it).set_feature(false); │ │ │ │ -88 } │ │ │ │ -89 } │ │ │ │ -90 return n_feature_edges; │ │ │ │ -91} │ │ │ │ -92 │ │ │ │ -93//--------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ +_7_2 virtual std::string _t_y_p_e___s_t_r_i_n_g() = 0; │ │ │ │ +73 │ │ │ │ +74 virtual std::string type_id_string() = 0; │ │ │ │ +75 │ │ │ │ +77 bool can_you_create(const std::string &_type_name); │ │ │ │ +78 │ │ │ │ +_8_0 virtual void _c_r_e_a_t_e___v_e_r_t_e_x___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) = 0; │ │ │ │ +81 │ │ │ │ +_8_3 virtual void _c_r_e_a_t_e___h_a_l_f_e_d_g_e___p_r_o_p_e_r_t_y(_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) = 0; │ │ │ │ +84 │ │ │ │ +_8_6 virtual void _c_r_e_a_t_e___e_d_g_e___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) = 0; │ │ │ │ +87 │ │ │ │ +_8_9 virtual void _c_r_e_a_t_e___f_a_c_e___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) = 0; │ │ │ │ +90 │ │ │ │ +_9_2 virtual void _c_r_e_a_t_e___m_e_s_h___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) = 0; │ │ │ │ +93 │ │ │ │ 94 │ │ │ │ -95template │ │ │ │ -96typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_9_7_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ -98{ │ │ │ │ -99 return calc_face_normal_impl(_fh, typename GenProg::IF< │ │ │ │ -100 _v_e_c_t_o_r___t_r_a_i_t_s<_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t>::size_ == 3, │ │ │ │ -101 PointIs3DTag, │ │ │ │ -102 PointIsNot3DTag │ │ │ │ -103 >::Result()); │ │ │ │ -104} │ │ │ │ +96 template │ │ │ │ +_9_7 void _c_r_e_a_t_e___p_r_o_p_e_r_t_y(_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& _property_name); │ │ │ │ +98 │ │ │ │ +99 virtual _~_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r() {} │ │ │ │ +100 │ │ │ │ +101protected: │ │ │ │ +102 _P_r_o_p_e_r_t_y_C_r_e_a_t_o_r() {} │ │ │ │ +103 │ │ │ │ +104}; │ │ │ │ 105 │ │ │ │ -106template │ │ │ │ -107typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -108_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l___i_m_p_l(_F_a_c_e_H_a_n_d_l_e _fh, PointIs3DTag) const │ │ │ │ -109{ │ │ │ │ -110 assert(this->halfedge_handle(_fh).is_valid()); │ │ │ │ -111 ConstFaceVertexIter fv_it(this->cfv_iter(_fh)); │ │ │ │ -112 │ │ │ │ -113 // Safeguard for 1-gons │ │ │ │ -114 if (!(++fv_it).is_valid()) return Normal(0, 0, 0); │ │ │ │ -115 │ │ │ │ -116 // Safeguard for 2-gons │ │ │ │ -117 if (!(++fv_it).is_valid()) return Normal(0, 0, 0); │ │ │ │ -118 │ │ │ │ -119 // use Newell's Method to compute the surface normal │ │ │ │ -120 Normal n(0,0,0); │ │ │ │ -121 for(fv_it = this->cfv_iter(_fh); fv_it.is_valid(); ++fv_it) │ │ │ │ +106template <> inline void PropertyCreator::create_property │ │ │ │ +(BaseKernel& _mesh, const std::string& _property_name) { _c_r_e_a_t_e___v_e_r_t_e_x___p_r_o_p_e_r_t_y │ │ │ │ +(_mesh, _property_name); } │ │ │ │ +107template <> inline void PropertyCreator::create_property │ │ │ │ +(BaseKernel& _mesh, const std::string& _property_name) │ │ │ │ +{ _c_r_e_a_t_e___h_a_l_f_e_d_g_e___p_r_o_p_e_r_t_y(_mesh, _property_name); } │ │ │ │ +108template <> inline void PropertyCreator::create_property │ │ │ │ +(BaseKernel& _mesh, const std::string& _property_name) { _c_r_e_a_t_e___e_d_g_e___p_r_o_p_e_r_t_y │ │ │ │ +(_mesh, _property_name); } │ │ │ │ +109template <> inline void PropertyCreator::create_property │ │ │ │ +(BaseKernel& _mesh, const std::string& _property_name) { _c_r_e_a_t_e___f_a_c_e___p_r_o_p_e_r_t_y │ │ │ │ +(_mesh, _property_name); } │ │ │ │ +110template <> inline void PropertyCreator::create_property │ │ │ │ +(BaseKernel& _mesh, const std::string& _property_name) { _c_r_e_a_t_e___m_e_s_h___p_r_o_p_e_r_t_y │ │ │ │ +(_mesh, _property_name); } │ │ │ │ +111 │ │ │ │ +114template │ │ │ │ +_1_1_5class _P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l : public _P_r_o_p_e_r_t_y_C_r_e_a_t_o_r │ │ │ │ +116{ │ │ │ │ +117public: │ │ │ │ +118 std::string type_id_string() override { return get_type_name(); } │ │ │ │ +119 │ │ │ │ +120 template │ │ │ │ +121 void create_prop(_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& _property_name) │ │ │ │ 122 { │ │ │ │ -123 // next vertex │ │ │ │ -124 ConstFaceVertexIter fv_itn = fv_it; │ │ │ │ -125 ++fv_itn; │ │ │ │ -126 │ │ │ │ -127 if (!fv_itn.is_valid()) │ │ │ │ -128 fv_itn = this->cfv_iter(_fh); │ │ │ │ -129 │ │ │ │ -130 // http://www.opengl.org/wiki/Calculating_a_Surface_Normal │ │ │ │ -131 const Point a = this->point(*fv_it) - this->point(*fv_itn); │ │ │ │ -132 const Point b = this->point(*fv_it) + this->point(*fv_itn); │ │ │ │ -133 │ │ │ │ +123 using PHandle = typename _P_r_o_p_H_a_n_d_l_e_<_H_a_n_d_l_e_T_>_:_:_t_e_m_p_l_a_t_e type; │ │ │ │ +124 PHandle prop; │ │ │ │ +125 if (!_mesh._g_e_t___p_r_o_p_e_r_t_y___h_a_n_d_l_e(prop, _property_name)) │ │ │ │ +126 _mesh._a_d_d___p_r_o_p_e_r_t_y(prop, _property_name); │ │ │ │ +127 } │ │ │ │ +128 │ │ │ │ +_1_2_9 void _c_r_e_a_t_e___v_e_r_t_e_x___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) override { create_prop(_mesh, _property_name); } │ │ │ │ +_1_3_0 void _c_r_e_a_t_e___h_a_l_f_e_d_g_e___p_r_o_p_e_r_t_y(_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) override { create_prop(_mesh, _property_name);} │ │ │ │ +_1_3_1 void _c_r_e_a_t_e___e_d_g_e___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) override { create_prop(_mesh, _property_name);} │ │ │ │ +_1_3_2 void _c_r_e_a_t_e___f_a_c_e___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) override { create_prop(_mesh, _property_name);} │ │ │ │ +_1_3_3 void _c_r_e_a_t_e___m_e_s_h___p_r_o_p_e_r_t_y (_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_property_name) override { create_prop(_mesh, _property_name);} │ │ │ │ 134 │ │ │ │ -135 // Due to traits, the value types of normals and points can be different. │ │ │ │ -136 // Therefore we cast them here. │ │ │ │ -137 n[0] += static_cast_:_:_v_a_l_u_e___t_y_p_e>(a[1] * b │ │ │ │ -[2]); │ │ │ │ -138 n[1] += static_cast_:_:_v_a_l_u_e___t_y_p_e>(a[2] * b │ │ │ │ -[0]); │ │ │ │ -139 n[2] += static_cast_:_:_v_a_l_u_e___t_y_p_e>(a[0] * b │ │ │ │ -[1]); │ │ │ │ -140 } │ │ │ │ -141 │ │ │ │ -142 const typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e length = norm(n); │ │ │ │ -143 │ │ │ │ -144 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG │ │ │ │ -145 // vector class does not return self after component-wise │ │ │ │ -146 // self-multiplication with a scalar!!! │ │ │ │ -147 return (length != typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(0)) │ │ │ │ -148 ? ((n *= (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(1)/length)), n) │ │ │ │ -149 : Normal(0, 0, 0); │ │ │ │ -150} │ │ │ │ -151 │ │ │ │ -152template │ │ │ │ -153typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -154PolyMeshT::calc_face_normal_impl(FaceHandle, PointIsNot3DTag) const │ │ │ │ -155{ │ │ │ │ -156 // Dummy fallback implementation │ │ │ │ -157 // Returns just an initialized all 0 normal │ │ │ │ -158 // This function is only used if we don't have a matching implementation │ │ │ │ -159 // for normal computation with the current vector type defined in the mesh │ │ │ │ -traits │ │ │ │ -160 │ │ │ │ -161 assert(false); │ │ │ │ -162 │ │ │ │ -163 _N_o_r_m_a_l normal; │ │ │ │ -164 vectorize(normal,Scalar(0)); │ │ │ │ -165 return normal; │ │ │ │ -166} │ │ │ │ -167 │ │ │ │ -168//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -169 │ │ │ │ -170template │ │ │ │ -171typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_1_7_2_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -173_c_a_l_c___f_a_c_e___n_o_r_m_a_l(const _P_o_i_n_t& _p0, │ │ │ │ -174 const _P_o_i_n_t& _p1, │ │ │ │ -175 const _P_o_i_n_t& _p2) const │ │ │ │ -176{ │ │ │ │ -177 return calc_face_normal_impl(_p0, _p1, _p2, typename GenProg::IF< │ │ │ │ -178 _v_e_c_t_o_r___t_r_a_i_t_s<_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t>::size_ == 3, │ │ │ │ -179 PointIs3DTag, │ │ │ │ -180 PointIsNot3DTag │ │ │ │ -181 >::Result()); │ │ │ │ -182} │ │ │ │ +135 _~_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l() override {} │ │ │ │ +136protected: │ │ │ │ +137 PropertyCreatorImpl() {} │ │ │ │ +138}; │ │ │ │ +139 │ │ │ │ +141namespace { │ │ │ │ +142template │ │ │ │ +143class PropertyCreatorT : public PropertyCreatorImpl> │ │ │ │ +144{ │ │ │ │ +145}; │ │ │ │ +146} │ │ │ │ +147 │ │ │ │ +149 │ │ │ │ +150#define OM_REGISTER_PROPERTY_TYPE(ClassName) \ │ │ │ │ +151namespace OpenMesh { \ │ │ │ │ +152namespace { /* ensure internal linkage of class */ \ │ │ │ │ +153template <> \ │ │ │ │ +154class PropertyCreatorT : public │ │ │ │ +PropertyCreatorImpl> \ │ │ │ │ +155{ \ │ │ │ │ +156public: \ │ │ │ │ +157 using type = ClassName; \ │ │ │ │ +158 std::string type_string() override { return OpenMesh::IO::binary:: │ │ │ │ +type_identifier(); } \ │ │ │ │ +159 \ │ │ │ │ +160 PropertyCreatorT() \ │ │ │ │ +161 { \ │ │ │ │ +162 PropertyCreationManager::instance().register_property_creator(this); \ │ │ │ │ +163 } \ │ │ │ │ +164 ~PropertyCreatorT() override {} \ │ │ │ │ +165}; \ │ │ │ │ +166} \ │ │ │ │ +167/* static to ensure internal linkage of object */ \ │ │ │ │ +168static PropertyCreatorT OM_CONCAT │ │ │ │ +(property_creator_registration_object_, __LINE__); \ │ │ │ │ +169} │ │ │ │ +170 │ │ │ │ +_1_8_0class OPENMESHDLLEXPORT _P_r_o_p_e_r_t_y_C_r_e_a_t_i_o_n_M_a_n_a_g_e_r │ │ │ │ +181{ │ │ │ │ +182public: │ │ │ │ 183 │ │ │ │ -184template │ │ │ │ -185typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_1_8_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -187_c_a_l_c___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ -188{ │ │ │ │ -189 return calc_face_normal(_fh); │ │ │ │ -190} │ │ │ │ -191 │ │ │ │ -192template │ │ │ │ -193typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -194_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -195_c_a_l_c___f_a_c_e___n_o_r_m_a_l___i_m_p_l(const Point& _p0, │ │ │ │ -196 const Point& _p1, │ │ │ │ -197 const Point& _p2, │ │ │ │ -198 PointIs3DTag) const │ │ │ │ -199{ │ │ │ │ -200#if 1 │ │ │ │ -201 // The OpenSG ::operator -= () does not support the type Point │ │ │ │ -202 // as rhs. Therefore use vector_cast at this point!!! │ │ │ │ -203 // Note! OpenSG distinguishes between Normal and Point!!! │ │ │ │ -204 Normal p1p0(vector_cast(_p0)); p1p0 -= vector_cast(_p1); │ │ │ │ -205 Normal p1p2(vector_cast(_p2)); p1p2 -= vector_cast(_p1); │ │ │ │ -206 │ │ │ │ -207 Normal n = cross(p1p2, p1p0); │ │ │ │ -208 typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e length = norm(n); │ │ │ │ -209 │ │ │ │ -210 // The expression ((n *= (1.0/norm)),n) is used because the OpenSG │ │ │ │ -211 // vector class does not return self after component-wise │ │ │ │ -212 // self-multiplication with a scalar!!! │ │ │ │ -213 return (length != typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(0)) │ │ │ │ -214 ? ((n *= (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e(1)/length)),n) │ │ │ │ -215 : Normal(0,0,0); │ │ │ │ -216#else │ │ │ │ -217 Point p1p0 = _p0; p1p0 -= _p1; │ │ │ │ -218 Point p1p2 = _p2; p1p2 -= _p1; │ │ │ │ -219 │ │ │ │ -220 Normal n = vector_cast(cross(p1p2, p1p0)); │ │ │ │ -221 typename _v_e_c_t_o_r___t_r_a_i_t_s_<_N_o_r_m_a_l_>_:_:_v_a_l_u_e___t_y_p_e length = norm(n); │ │ │ │ -222 │ │ │ │ -223 return (length != 0.0) ? n *= (1.0/length) : Normal(0,0,0); │ │ │ │ -224#endif │ │ │ │ -225} │ │ │ │ -226 │ │ │ │ -227template │ │ │ │ -228typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -229PolyMeshT::calc_face_normal_impl(const Point&, const Point&, const │ │ │ │ -Point&, PointIsNot3DTag) const │ │ │ │ -230{ │ │ │ │ +184 static _P_r_o_p_e_r_t_y_C_r_e_a_t_i_o_n_M_a_n_a_g_e_r& instance(); │ │ │ │ +185 │ │ │ │ +186 template │ │ │ │ +187 void create_property(_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& _type_name, │ │ │ │ +const std::string& _property_name) │ │ │ │ +188 { │ │ │ │ +189 │ │ │ │ +190 auto can_create = [_type_name](_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r* pc){ │ │ │ │ +191 return pc->can_you_create(_type_name); │ │ │ │ +192 }; │ │ │ │ +193 │ │ │ │ +194 std::vector::iterator pc_iter = std::find_if │ │ │ │ +(property_creators_.begin(), │ │ │ │ +195 property_creators_.end(), can_create); │ │ │ │ +196 if (pc_iter != property_creators_.end()) │ │ │ │ +197 { │ │ │ │ +198 const auto& pc = *pc_iter; │ │ │ │ +199 pc->create_property(_mesh, _property_name); │ │ │ │ +200 return; │ │ │ │ +201 } │ │ │ │ +202 │ │ │ │ +203 omerr() << "No property creator registered that can create a property of │ │ │ │ +type " << _type_name << std::endl; │ │ │ │ +204 omerr() << "You need to register your custom type using │ │ │ │ +OM_REGISTER_PROPERTY_TYPE(ClassName) and declare the struct binary.\ │ │ │ │ +205 See documentation for more details." << std::endl; │ │ │ │ +206 omerr() << "Adding property failed." << std::endl; │ │ │ │ +207 } │ │ │ │ +208 │ │ │ │ +209 void register_property_creator(_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r* _property_creator) │ │ │ │ +210 { │ │ │ │ +211 for (auto pc : property_creators_) │ │ │ │ +212 if (pc->type_string() == _property_creator->_t_y_p_e___s_t_r_i_n_g()) │ │ │ │ +213 { │ │ │ │ +214 if (pc->type_id_string() != _property_creator->type_id_string()) │ │ │ │ +215 { │ │ │ │ +216 omerr() << "And it looks like you are trying to add a different type with │ │ │ │ +an already existing string identification." << std::endl; │ │ │ │ +217 omerr() << "Type id of existing type is " << pc->type_id_string() << " │ │ │ │ +trying to add for " << _property_creator->type_id_string() << std::endl; │ │ │ │ +218 } │ │ │ │ +219 return; │ │ │ │ +220 } │ │ │ │ +221 property_creators_.push_back(_property_creator); │ │ │ │ +222 } │ │ │ │ +223 │ │ │ │ +224private: │ │ │ │ +225 │ │ │ │ +226 _P_r_o_p_e_r_t_y_C_r_e_a_t_i_o_n_M_a_n_a_g_e_r() {} │ │ │ │ +227 _~_P_r_o_p_e_r_t_y_C_r_e_a_t_i_o_n_M_a_n_a_g_e_r() {} │ │ │ │ +228 │ │ │ │ +229 std::vector property_creators_; │ │ │ │ +230}; │ │ │ │ 231 │ │ │ │ -232 // Dummy fallback implementation │ │ │ │ -233 // Returns just an initialized all 0 normal │ │ │ │ -234 // This function is only used if we don't have a matching implementation │ │ │ │ -235 // for normal computation with the current vector type defined in the mesh │ │ │ │ -traits │ │ │ │ -236 │ │ │ │ -237 assert(false); │ │ │ │ -238 │ │ │ │ -239 Normal normal; │ │ │ │ -240 vectorize(normal,Scalar(0)); │ │ │ │ -241 return normal; │ │ │ │ -242} │ │ │ │ -243 │ │ │ │ -244//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -245 │ │ │ │ -246template │ │ │ │ -247typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ -_2_4_8_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -249_c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ -250{ │ │ │ │ -251 _P_o_i_n_t _pt; │ │ │ │ -252 vectorize(_pt, _S_c_a_l_a_r(0)); │ │ │ │ -253 _S_c_a_l_a_r valence = 0.0; │ │ │ │ -254 for (_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r cfv_it = this->cfv_iter(_fh); cfv_it.is_valid(); │ │ │ │ -++cfv_it, valence += 1.0) │ │ │ │ -255 { │ │ │ │ -256 _pt += this->point(*cfv_it); │ │ │ │ -257 } │ │ │ │ -258 _pt /= valence; │ │ │ │ -259 return _pt; │ │ │ │ -260} │ │ │ │ -261 │ │ │ │ -262//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -263 │ │ │ │ -264template │ │ │ │ -265typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ -_2_6_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -267_c_a_l_c___c_e_n_t_r_o_i_d(_F_a_c_e_H_a_n_d_l_e _fh) const │ │ │ │ -268{ │ │ │ │ -269 return calc_face_centroid(_fh); │ │ │ │ -270} │ │ │ │ -271 │ │ │ │ -272//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -273 │ │ │ │ -274template │ │ │ │ -275typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ -_2_7_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -277_c_a_l_c___c_e_n_t_r_o_i_d(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -278{ │ │ │ │ -279 return this->calc_edge_midpoint(_eh); │ │ │ │ -280} │ │ │ │ -281 │ │ │ │ -282//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -283 │ │ │ │ -284template │ │ │ │ -285typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ -_2_8_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -287_c_a_l_c___c_e_n_t_r_o_i_d(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) const │ │ │ │ -288{ │ │ │ │ -289 return this->calc_edge_midpoint(this->edge_handle(_heh)); │ │ │ │ -290} │ │ │ │ -291 │ │ │ │ -292//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -293 │ │ │ │ -294template │ │ │ │ -295typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ -_2_9_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -297_c_a_l_c___c_e_n_t_r_o_i_d(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -298{ │ │ │ │ -299 return this->point(_vh); │ │ │ │ -300} │ │ │ │ -301 │ │ │ │ -302//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -303 │ │ │ │ -304template │ │ │ │ -305typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_P_o_i_n_t │ │ │ │ -_3_0_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -307_c_a_l_c___c_e_n_t_r_o_i_d(_M_e_s_h_H_a_n_d_l_e /*_mh*/) const │ │ │ │ -308{ │ │ │ │ -309 return this->vertices().avg([this](_V_e_r_t_e_x_H_a_n_d_l_e vh) { return this->point │ │ │ │ -(vh); }); │ │ │ │ -310} │ │ │ │ -311 │ │ │ │ -312//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -313 │ │ │ │ -314template │ │ │ │ -315void │ │ │ │ -_3_1_6_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -317_u_p_d_a_t_e___n_o_r_m_a_l_s() │ │ │ │ -318{ │ │ │ │ -319 // Face normals are required to compute the vertex and the halfedge normals │ │ │ │ -320 if (Kernel::has_face_normals() ) { │ │ │ │ -321 update_face_normals(); │ │ │ │ -322 │ │ │ │ -323 if (Kernel::has_vertex_normals() ) update_vertex_normals(); │ │ │ │ -324 if (Kernel::has_halfedge_normals()) update_halfedge_normals(); │ │ │ │ -325 } │ │ │ │ -326} │ │ │ │ -327 │ │ │ │ -328 │ │ │ │ -329//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -330 │ │ │ │ -331 │ │ │ │ -332template │ │ │ │ -333void │ │ │ │ -_3_3_4_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -335_u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s() │ │ │ │ -336{ │ │ │ │ -337 _F_a_c_e_I_t_e_r f_it(Kernel::faces_sbegin()), f_end(Kernel::faces_end()); │ │ │ │ -338 │ │ │ │ -339 for (; f_it != f_end; ++f_it) │ │ │ │ -340 this->set_normal(*f_it, calc_face_normal(*f_it)); │ │ │ │ -341} │ │ │ │ -342 │ │ │ │ -343 │ │ │ │ -344//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -345 │ │ │ │ -346 │ │ │ │ -347template │ │ │ │ -348void │ │ │ │ -_3_4_9_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -350_u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s(const double _feature_angle) │ │ │ │ -351{ │ │ │ │ -352 _H_a_l_f_e_d_g_e_I_t_e_r h_it(Kernel::halfedges_begin()), h_end(Kernel::halfedges_end │ │ │ │ -()); │ │ │ │ -353 │ │ │ │ -354 for (; h_it != h_end; ++h_it) │ │ │ │ -355 this->set_normal(*h_it, calc_halfedge_normal(*h_it, _feature_angle)); │ │ │ │ -356} │ │ │ │ -357 │ │ │ │ -358 │ │ │ │ -359//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -360 │ │ │ │ -361 │ │ │ │ -362template │ │ │ │ -363typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_3_6_4_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -365_c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle) const │ │ │ │ -366{ │ │ │ │ -367 if(Kernel::is_boundary(_heh)) │ │ │ │ -368 return _N_o_r_m_a_l(0,0,0); │ │ │ │ -369 else │ │ │ │ -370 { │ │ │ │ -371 std::vector fhs; fhs.reserve(10); │ │ │ │ -372 │ │ │ │ -373 _H_a_l_f_e_d_g_e_H_a_n_d_l_e heh = _heh; │ │ │ │ -374 │ │ │ │ -375 // collect CW face-handles │ │ │ │ -376 do │ │ │ │ -377 { │ │ │ │ -378 fhs.push_back(Kernel::face_handle(heh)); │ │ │ │ -379 │ │ │ │ -380 heh = Kernel::next_halfedge_handle(heh); │ │ │ │ -381 heh = Kernel::opposite_halfedge_handle(heh); │ │ │ │ -382 } │ │ │ │ -383 while(heh != _heh && !Kernel::is_boundary(heh) && │ │ │ │ -!is_estimated_feature_edge(heh, _feature_angle)); │ │ │ │ -384 │ │ │ │ -385 // collect CCW face-handles │ │ │ │ -386 if(heh != _heh && !is_estimated_feature_edge(_heh, _feature_angle)) │ │ │ │ -387 { │ │ │ │ -388 heh = Kernel::opposite_halfedge_handle(_heh); │ │ │ │ -389 │ │ │ │ -390 if ( !Kernel::is_boundary(heh) ) { │ │ │ │ -391 do │ │ │ │ -392 { │ │ │ │ -393 │ │ │ │ -394 fhs.push_back(Kernel::face_handle(heh)); │ │ │ │ -395 │ │ │ │ -396 heh = Kernel::prev_halfedge_handle(heh); │ │ │ │ -397 heh = Kernel::opposite_halfedge_handle(heh); │ │ │ │ -398 } │ │ │ │ -399 while(!Kernel::is_boundary(heh) && !is_estimated_feature_edge(heh, │ │ │ │ -_feature_angle)); │ │ │ │ -400 } │ │ │ │ -401 } │ │ │ │ -402 │ │ │ │ -403 _N_o_r_m_a_l n(0,0,0); │ │ │ │ -404 for (unsigned int i = 0; i < fhs.size(); ++i) │ │ │ │ -405 n += Kernel::has_face_normals() ? Kernel::normal(fhs[i]) : calc_face_normal │ │ │ │ -(fhs[i]); │ │ │ │ -406 │ │ │ │ -407 return normalize(n); │ │ │ │ -408 } │ │ │ │ -409} │ │ │ │ -410 │ │ │ │ -411 │ │ │ │ -412//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -413 │ │ │ │ -414 │ │ │ │ -415template │ │ │ │ -416typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_4_1_7_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -418_c_a_l_c___n_o_r_m_a_l(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle) const │ │ │ │ -419{ │ │ │ │ -420 return calc_halfedge_normal(_heh, _feature_angle); │ │ │ │ -421} │ │ │ │ -422 │ │ │ │ -423 │ │ │ │ -424//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -425 │ │ │ │ -426 │ │ │ │ -427template │ │ │ │ -428typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_4_2_9_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -430_c_a_l_c___n_o_r_m_a_l(_E_d_g_e_H_a_n_d_l_e _eh) const │ │ │ │ -431{ │ │ │ │ -432 _N_o_r_m_a_l n(0, 0, 0); │ │ │ │ -433 for (int i = 0; i < 2; ++i) │ │ │ │ -434 { │ │ │ │ -435 const auto heh = this->halfedge_handle(_eh, i); │ │ │ │ -436 const auto fh = this->face_handle(heh); │ │ │ │ -437 if (fh.is_valid()) │ │ │ │ -438 n += calc_normal(fh); │ │ │ │ -439 } │ │ │ │ -440 const auto length = norm(n); │ │ │ │ -441 if (length != 0) │ │ │ │ -442 n /= length; │ │ │ │ -443 return n; │ │ │ │ -444} │ │ │ │ -445 │ │ │ │ -446//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -447 │ │ │ │ -448 │ │ │ │ -449template │ │ │ │ -450bool │ │ │ │ -_4_5_1_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -452_i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const double _feature_angle) │ │ │ │ -const │ │ │ │ -453{ │ │ │ │ -454 _E_d_g_e_H_a_n_d_l_e eh = Kernel::edge_handle(_heh); │ │ │ │ -455 │ │ │ │ -456 if(Kernel::has_edge_status()) │ │ │ │ -457 { │ │ │ │ -458 if(Kernel::status(eh).feature()) │ │ │ │ -459 return true; │ │ │ │ -460 } │ │ │ │ -461 │ │ │ │ -462 if(Kernel::is_boundary(eh)) │ │ │ │ -463 return false; │ │ │ │ -464 │ │ │ │ -465 // compute angle between faces │ │ │ │ -466 _F_a_c_e_H_a_n_d_l_e fh0 = Kernel::face_handle(_heh); │ │ │ │ -467 _F_a_c_e_H_a_n_d_l_e fh1 = Kernel::face_handle(Kernel::opposite_halfedge_handle │ │ │ │ -(_heh)); │ │ │ │ -468 │ │ │ │ -469 _N_o_r_m_a_l fn0 = Kernel::has_face_normals() ? Kernel::normal(fh0) : │ │ │ │ -calc_face_normal(fh0); │ │ │ │ -470 _N_o_r_m_a_l fn1 = Kernel::has_face_normals() ? Kernel::normal(fh1) : │ │ │ │ -calc_face_normal(fh1); │ │ │ │ -471 │ │ │ │ -472 // dihedral angle above angle threshold │ │ │ │ -473 return ( _d_o_t(fn0,fn1) < cos(_feature_angle) ); │ │ │ │ -474} │ │ │ │ -475 │ │ │ │ -476 │ │ │ │ -477//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -478 │ │ │ │ -479 │ │ │ │ -480template │ │ │ │ -481typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_4_8_2_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -483_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -484{ │ │ │ │ -485 _N_o_r_m_a_l n; │ │ │ │ -486 calc_vertex_normal_fast(_vh,n); │ │ │ │ -487 │ │ │ │ -488 _S_c_a_l_a_r length = norm(n); │ │ │ │ -489 if (length != 0.0) n *= (_S_c_a_l_a_r(1.0)/length); │ │ │ │ -490 │ │ │ │ -491 return n; │ │ │ │ -492} │ │ │ │ -493 │ │ │ │ -494//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -495template │ │ │ │ -_4_9_6void _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -497_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const │ │ │ │ -498{ │ │ │ │ -499 vectorize(_n, _S_c_a_l_a_r(0)); │ │ │ │ -500 for (_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r vf_it = this->cvf_iter(_vh); vf_it.is_valid(); │ │ │ │ -++vf_it) │ │ │ │ -501 _n += this->normal(*vf_it); │ │ │ │ -502} │ │ │ │ -503 │ │ │ │ -504//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -505template │ │ │ │ -_5_0_6void _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -507_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const │ │ │ │ -508{ │ │ │ │ -509 vectorize(_n, _S_c_a_l_a_r(0)); │ │ │ │ -510 _C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r cvih_it = this->cvih_iter(_vh); │ │ │ │ -511 if (! cvih_it.is_valid() ) │ │ │ │ -512 {//don't crash on isolated vertices │ │ │ │ -513 return; │ │ │ │ -514 } │ │ │ │ -515 _N_o_r_m_a_l in_he_vec; │ │ │ │ -516 calc_edge_vector(*cvih_it, in_he_vec); │ │ │ │ -517 for ( ; cvih_it.is_valid(); ++cvih_it) │ │ │ │ -518 {//calculates the sector normal defined by cvih_it and adds it to _n │ │ │ │ -519 if (this->is_boundary(*cvih_it)) │ │ │ │ -520 { │ │ │ │ -521 continue; │ │ │ │ -522 } │ │ │ │ -523 _H_a_l_f_e_d_g_e_H_a_n_d_l_e out_heh(this->next_halfedge_handle(*cvih_it)); │ │ │ │ -524 _N_o_r_m_a_l out_he_vec; │ │ │ │ -525 calc_edge_vector(out_heh, out_he_vec); │ │ │ │ -526 _n += cross(in_he_vec, out_he_vec);//sector area is taken into account │ │ │ │ -527 in_he_vec = out_he_vec; │ │ │ │ -528 in_he_vec *= -1;//change the orientation │ │ │ │ -529 } │ │ │ │ -530 _S_c_a_l_a_r length = norm(_n); │ │ │ │ -531 if (length != 0.0) │ │ │ │ -532 _n *= (_S_c_a_l_a_r(1.0)/length); │ │ │ │ -533} │ │ │ │ -534 │ │ │ │ -535//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -536template │ │ │ │ -_5_3_7void _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -538_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _N_o_r_m_a_l& _n) const │ │ │ │ -539{ │ │ │ │ -540 static const _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e& loop_scheme_mask__ = │ │ │ │ -541 _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e_S_i_n_g_l_e_t_o_n_:_:_I_n_s_t_a_n_c_e(); │ │ │ │ -542 │ │ │ │ -543 _N_o_r_m_a_l t_v(0.0,0.0,0.0), t_w(0.0,0.0,0.0); │ │ │ │ -544 unsigned int vh_val = this->valence(_vh); │ │ │ │ -545 unsigned int i = 0; │ │ │ │ -546 for (_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r cvoh_it = this->cvoh_iter(_vh); │ │ │ │ -cvoh_it.is_valid(); ++cvoh_it, ++i) │ │ │ │ -547 { │ │ │ │ -548 _V_e_r_t_e_x_H_a_n_d_l_e r1_v( this->to_vertex_handle(*cvoh_it) ); │ │ │ │ -549 t_v += (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_P_o_i_n_t_>_:_:_v_a_l_u_e___t_y_p_e) │ │ │ │ -(loop_scheme_mask__.tang0_weight(vh_val, i))*this->point(r1_v); │ │ │ │ -550 t_w += (typename _v_e_c_t_o_r___t_r_a_i_t_s_<_P_o_i_n_t_>_:_:_v_a_l_u_e___t_y_p_e) │ │ │ │ -(loop_scheme_mask__.tang1_weight(vh_val, i))*this->point(r1_v); │ │ │ │ -551 } │ │ │ │ -552 _n = cross(t_w, t_v);//hack: should be cross(t_v, t_w), but then the │ │ │ │ -normals are reversed? │ │ │ │ -553} │ │ │ │ -554 │ │ │ │ -555//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -556 │ │ │ │ -557template │ │ │ │ -558typename _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_:_N_o_r_m_a_l │ │ │ │ -_5_5_9_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -560_c_a_l_c___n_o_r_m_a_l(_V_e_r_t_e_x_H_a_n_d_l_e _vh) const │ │ │ │ -561{ │ │ │ │ -562 _N_o_r_m_a_l n; │ │ │ │ -563 calc_vertex_normal_correct(_vh, n); │ │ │ │ -564 return n; │ │ │ │ -565} │ │ │ │ -566 │ │ │ │ -567//-------------------------------------------------------------------------- │ │ │ │ ---- │ │ │ │ -568 │ │ │ │ -569template │ │ │ │ -570void │ │ │ │ -_5_7_1_P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_>_:_: │ │ │ │ -572_u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s() │ │ │ │ -573{ │ │ │ │ -574 _V_e_r_t_e_x_I_t_e_r v_it(Kernel::vertices_begin()), v_end(Kernel::vertices_end()); │ │ │ │ -575 │ │ │ │ -576 for (; v_it!=v_end; ++v_it) │ │ │ │ -577 this->set_normal(*v_it, calc_vertex_normal(*v_it)); │ │ │ │ -578} │ │ │ │ -579 │ │ │ │ -580// │ │ │ │ -============================================================================= │ │ │ │ -581} // namespace OpenMesh │ │ │ │ -582// │ │ │ │ -============================================================================= │ │ │ │ -_o_m_s_t_r_e_a_m_._h_h │ │ │ │ -This file provides the streams omlog, omout, and omerr. │ │ │ │ +236template │ │ │ │ +_2_3_7void _c_r_e_a_t_e___p_r_o_p_e_r_t_y___f_r_o_m___s_t_r_i_n_g(_B_a_s_e_K_e_r_n_e_l& _mesh, const std::string& │ │ │ │ +_type_name, const std::string& _property_name) │ │ │ │ +238{ │ │ │ │ +239 PropertyCreationManager::instance().create_property(_mesh, │ │ │ │ +_type_name, _property_name); │ │ │ │ +240} │ │ │ │ +241 │ │ │ │ +242} /* namespace OpenMesh */ │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ -osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ -Adapter for osg vector member computing a scalar product. │ │ │ │ -DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_N_o_r_m_a_l │ │ │ │ -@ Normal │ │ │ │ -Add normals to mesh item (vertices/faces) │ │ │ │ -DDeeffiinniittiioonn Attributes.hh:82 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_L_o_o_p_S_c_h_e_m_e_M_a_s_k_T │ │ │ │ -implements cache for the weights of the original Loop scheme supported: │ │ │ │ -DDeeffiinniittiioonn LoopSchemeMaskT.hh:67 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_M_e_s_h_H_a_n_d_l_e │ │ │ │ -Handle type for meshes to simplify some template programming. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:149 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ -Base type for a polygonal mesh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___c_e_n_t_r_o_i_d │ │ │ │ -void calc_face_centroid(FaceHandle _fh, Point &_pt) const │ │ │ │ -calculates the average of the vertices defining _fh │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:282 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Kernel::VertexHandle VertexHandle │ │ │ │ -Handle for referencing the corresponding item. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ -Kernel::Scalar Scalar │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::EdgeHandle EdgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstFaceVertexIter ConstFaceVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:177 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___f_a_s_t │ │ │ │ -void calc_vertex_normal_fast(VertexHandle _vh, Normal &_n) const │ │ │ │ -Different methods for calculation of the normal at _vh: │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:497 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___c_o_r_r_e_c_t │ │ │ │ -void calc_vertex_normal_correct(VertexHandle _vh, Normal &_n) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:507 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::FaceIter FaceIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ -Kernel::Normal Normal │ │ │ │ -Normal type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___f_a_c_e___n_o_r_m_a_l_s │ │ │ │ -void update_face_normals() │ │ │ │ -Update normal vectors for all faces. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:335 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___h_a_l_f_e_d_g_e___n_o_r_m_a_l_s │ │ │ │ -void update_halfedge_normals(const double _feature_angle=0.8) │ │ │ │ -Update normal vectors for all halfedges. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:350 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_f_i_n_d___f_e_a_t_u_r_e___e_d_g_e_s │ │ │ │ -unsigned int find_feature_edges(Scalar _angle_tresh=OpenMesh::deg_to_rad(44.0)) │ │ │ │ -tags an edge as a feature if its dihedral angle is larger than _angle_tresh │ │ │ │ -returns the number of the... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___h_a_l_f_e_d_g_e___n_o_r_m_a_l │ │ │ │ -virtual Normal calc_halfedge_normal(HalfedgeHandle _heh, const double │ │ │ │ -_feature_angle=0.8) const │ │ │ │ -Calculate halfedge normal for one specific halfedge. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:365 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___n_o_r_m_a_l_s │ │ │ │ -void update_normals() │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:317 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexFaceIter ConstVertexFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___c_e_n_t_r_o_i_d │ │ │ │ -Point calc_centroid(FaceHandle _fh) const │ │ │ │ -Computes and returns the average of the vertices defining _fh (same as │ │ │ │ -calc_face_centroid) │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:267 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:174 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ -virtual Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ -Calculate normal vector for face _fh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_i_s___e_s_t_i_m_a_t_e_d___f_e_a_t_u_r_e___e_d_g_e │ │ │ │ -bool is_estimated_feature_edge(HalfedgeHandle _heh, const double │ │ │ │ -_feature_angle) const │ │ │ │ -identifies feature edges w.r.t. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:452 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Kernel::FaceHandle FaceHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l___l_o_o_p │ │ │ │ -void calc_vertex_normal_loop(VertexHandle _vh, Normal &_n) const │ │ │ │ -Compute normals for all primitives. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:538 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::EdgeIter EdgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_u_p_d_a_t_e___v_e_r_t_e_x___n_o_r_m_a_l_s │ │ │ │ -void update_vertex_normals() │ │ │ │ -Update normal vectors for all vertices. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:572 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:173 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::HalfedgeIter HalfedgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:144 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ -Kernel::Point Point │ │ │ │ -Coordinate type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___n_o_r_m_a_l │ │ │ │ -Normal calc_normal(FaceHandle _fh) const │ │ │ │ -same as calc_face_normal │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:187 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::VertexIter VertexIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___v_e_r_t_e_x___n_o_r_m_a_l │ │ │ │ -Normal calc_vertex_normal(VertexHandle _vh) const │ │ │ │ -Calculate vertex normal for one specific vertex. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT_impl.hh:483 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_i_n_g_l_e_t_o_n_T_:_:_I_n_s_t_a_n_c_e │ │ │ │ -static T & Instance() │ │ │ │ -Singleton access function. │ │ │ │ -DDeeffiinniittiioonn SingletonT.hh:86 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s │ │ │ │ -Helper class providing information about a vector type. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -T::value_type value_type │ │ │ │ -Type of the scalar value. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_c_r_e_a_t_e___p_r_o_p_e_r_t_y___f_r_o_m___s_t_r_i_n_g │ │ │ │ +void create_property_from_string(BaseKernel &_mesh, const std::string │ │ │ │ +&_type_name, const std::string &_property_name) │ │ │ │ +Create a property with type corresponding to _type_name on _mesh with name │ │ │ │ +_property_name. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:237 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l │ │ │ │ +This class provides low-level property management like adding/removing │ │ │ │ +properties and access to prope... │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:98 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_a_d_d___p_r_o_p_e_r_t_y │ │ │ │ +void add_property(VPropHandleT< T > &_ph, const std::string &_name="") │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:141 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_g_e_t___p_r_o_p_e_r_t_y___h_a_n_d_l_e │ │ │ │ +bool get_property_handle(VPropHandleT< T > &_ph, const std::string &_name) │ │ │ │ +const │ │ │ │ +You should not use this function directly. │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:254 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_H_a_n_d_l_e │ │ │ │ +DDeeffiinniittiioonn Property.hh:487 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r │ │ │ │ +Base class for property creators. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:68 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e___f_a_c_e___p_r_o_p_e_r_t_y │ │ │ │ +virtual void create_face_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name)=0 │ │ │ │ +Create a face property on _mesh with name _property_name. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_t_y_p_e___s_t_r_i_n_g │ │ │ │ +virtual std::string type_string()=0 │ │ │ │ +The string that corresponds to the type this property creator can create. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e___h_a_l_f_e_d_g_e___p_r_o_p_e_r_t_y │ │ │ │ +virtual void create_halfedge_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name)=0 │ │ │ │ +Create a halfedge property on _mesh with name _property_name. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e___p_r_o_p_e_r_t_y │ │ │ │ +void create_property(BaseKernel &_mesh, const std::string &_property_name) │ │ │ │ +Create a property for the element of type HandleT on _mesh with name │ │ │ │ +_property_name. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e___m_e_s_h___p_r_o_p_e_r_t_y │ │ │ │ +virtual void create_mesh_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name)=0 │ │ │ │ +Create a mesh property on _mesh with name _property_name. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e___v_e_r_t_e_x___p_r_o_p_e_r_t_y │ │ │ │ +virtual void create_vertex_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name)=0 │ │ │ │ +Create a vertex property on _mesh with name _property_name. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_:_:_c_r_e_a_t_e___e_d_g_e___p_r_o_p_e_r_t_y │ │ │ │ +virtual void create_edge_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name)=0 │ │ │ │ +Create an edge property on _mesh with name _property_name. │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l │ │ │ │ +Helper class that contains the implementation of the create__property │ │ │ │ +methods. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:116 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l_:_:_c_r_e_a_t_e___e_d_g_e___p_r_o_p_e_r_t_y │ │ │ │ +void create_edge_property(BaseKernel &_mesh, const std::string &_property_name) │ │ │ │ +override │ │ │ │ +Create an edge property on _mesh with name _property_name. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:131 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l_:_:_c_r_e_a_t_e___f_a_c_e___p_r_o_p_e_r_t_y │ │ │ │ +void create_face_property(BaseKernel &_mesh, const std::string &_property_name) │ │ │ │ +override │ │ │ │ +Create a face property on _mesh with name _property_name. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:132 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l_:_:_c_r_e_a_t_e___v_e_r_t_e_x___p_r_o_p_e_r_t_y │ │ │ │ +void create_vertex_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name) override │ │ │ │ +Create a vertex property on _mesh with name _property_name. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:129 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l_:_:_c_r_e_a_t_e___m_e_s_h___p_r_o_p_e_r_t_y │ │ │ │ +void create_mesh_property(BaseKernel &_mesh, const std::string &_property_name) │ │ │ │ +override │ │ │ │ +Create a mesh property on _mesh with name _property_name. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:133 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_o_r_I_m_p_l_:_:_c_r_e_a_t_e___h_a_l_f_e_d_g_e___p_r_o_p_e_r_t_y │ │ │ │ +void create_halfedge_property(BaseKernel &_mesh, const std::string │ │ │ │ +&_property_name) override │ │ │ │ +Create a halfedge property on _mesh with name _property_name. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:130 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_r_o_p_e_r_t_y_C_r_e_a_t_i_o_n_M_a_n_a_g_e_r │ │ │ │ +Class for adding properties based on strings. │ │ │ │ +DDeeffiinniittiioonn PropertyCreator.hh:181 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00734_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/ArrayKernelT_impl.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/RandomNumberGenerator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
ArrayKernelT_impl.hh
│ │ │ +
RandomNumberGenerator.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,304 +136,72 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42#define OPENMESH_ARRAY_KERNEL_C
│ │ │ -
43
│ │ │ -
44//== INCLUDES =================================================================
│ │ │ -
45
│ │ │ -
46#include <OpenMesh/Core/Mesh/ArrayKernel.hh>
│ │ │ -
47
│ │ │ -
48//== NAMESPACES ===============================================================
│ │ │ +
42//=============================================================================
│ │ │ +
43//
│ │ │ +
44// Helper Functions for generating a random number between 0.0 and 1.0 with
│ │ │ +
45// a guaranteed resolution
│ │ │ +
46//
│ │ │ +
47//=============================================================================
│ │ │ +
48
│ │ │
49
│ │ │ -
50namespace OpenMesh
│ │ │ -
51{
│ │ │ +
50#ifndef OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH
│ │ │ +
51#define OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH
│ │ │
52
│ │ │ -
53//== IMPLEMENTATION ==========================================================
│ │ │ -
54
│ │ │ -
55template<typename std_API_Container_VHandlePointer,
│ │ │ -
56 typename std_API_Container_HHandlePointer,
│ │ │ -
57 typename std_API_Container_FHandlePointer>
│ │ │ -
│ │ │ -
58void ArrayKernel::garbage_collection(std_API_Container_VHandlePointer& vh_to_update,
│ │ │ -
59 std_API_Container_HHandlePointer& hh_to_update,
│ │ │ -
60 std_API_Container_FHandlePointer& fh_to_update,
│ │ │ -
61 bool _v, bool _e, bool _f)
│ │ │ -
62{
│ │ │ +
53
│ │ │ +
54//== INCLUDES =================================================================
│ │ │ +
55
│ │ │ +
56
│ │ │ +
57#include <OpenMesh/Core/System/config.h>
│ │ │ +
58#include <cstdlib>
│ │ │ +
59
│ │ │ +
60
│ │ │ +
61
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │
63
│ │ │ -
64#ifdef DEBUG
│ │ │ -
65 #ifndef OM_GARBAGE_NO_STATUS_WARNING
│ │ │ -
66 if ( !this->has_vertex_status() )
│ │ │ -
67 omerr() << "garbage_collection: No vertex status available. You can request it: mesh.request_vertex_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning." << std::endl;
│ │ │ -
68 if ( !this->has_edge_status() )
│ │ │ -
69 omerr() << "garbage_collection: No edge status available. You can request it: mesh.request_edge_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning." << std::endl;
│ │ │ -
70 if ( !this->has_face_status() )
│ │ │ -
71 omerr() << "garbage_collection: No face status available. You can request it: mesh.request_face_status() or define OM_GARBAGE_NO_STATUS_WARNING to silence this warning." << std::endl;
│ │ │ -
72 #endif
│ │ │ -
73#endif
│ │ │ -
74
│ │ │ -
75 const bool track_vhandles = ( !vh_to_update.empty() );
│ │ │ -
76 const bool track_hhandles = ( !hh_to_update.empty() );
│ │ │ -
77 const bool track_fhandles = ( !fh_to_update.empty() );
│ │ │ -
78
│ │ │ -
79 int i, i0, i1;
│ │ │ +
64
│ │ │ +
65namespace OpenMesh {
│ │ │ +
66
│ │ │ +
67
│ │ │ +
68//=============================================================================
│ │ │ +
69
│ │ │ +
70
│ │ │ +
│ │ │ +
77class OPENMESHDLLEXPORT RandomNumberGenerator
│ │ │ +
78{
│ │ │ +
79public:
│ │ │
80
│ │ │ -
81 int nV = int(n_vertices());
│ │ │ -
82 int nE = int(n_edges());
│ │ │ -
83 int nH = int(2*n_edges());
│ │ │ -
84 int nF = (int(n_faces()));
│ │ │ -
85
│ │ │ -
86 std::vector<VertexHandle> vh_map;
│ │ │ -
87 std::vector<HalfedgeHandle> hh_map;
│ │ │ -
88 std::vector<FaceHandle> fh_map;
│ │ │ +
85 explicit RandomNumberGenerator(const size_t _resolution);
│ │ │ +
86
│ │ │ +
88 double getRand() const;
│ │ │
89
│ │ │ -
90 std::map <int, int> vertex_inverse_map;
│ │ │ -
91 std::map <int, int> halfedge_inverse_map;
│ │ │ -
92 std::map <int, int> face_inverse_map;
│ │ │ +
90 double resolution() const;
│ │ │ +
91
│ │ │ +
92private:
│ │ │
93
│ │ │ -
94 // setup handle mapping:
│ │ │ -
95 vh_map.reserve(nV);
│ │ │ -
96 for (i=0; i<nV; ++i) vh_map.push_back(VertexHandle(i));
│ │ │ -
97
│ │ │ -
98 hh_map.reserve(nH);
│ │ │ -
99 for (i=0; i<nH; ++i) hh_map.push_back(HalfedgeHandle(i));
│ │ │ -
100
│ │ │ -
101 fh_map.reserve(nF);
│ │ │ -
102 for (i=0; i<nF; ++i) fh_map.push_back(FaceHandle(i));
│ │ │ -
103
│ │ │ -
104 // remove deleted vertices
│ │ │ -
105 if (_v && n_vertices() > 0 && this->has_vertex_status() )
│ │ │ -
106 {
│ │ │ -
107 i0=0; i1=nV-1;
│ │ │ -
108
│ │ │ -
109 while (1)
│ │ │ -
110 {
│ │ │ -
111 // find 1st deleted and last un-deleted
│ │ │ -
112 while (!status(VertexHandle(i0)).deleted() && i0 < i1) ++i0;
│ │ │ -
113 while ( status(VertexHandle(i1)).deleted() && i0 < i1) --i1;
│ │ │ -
114 if (i0 >= i1) break;
│ │ │ -
115
│ │ │ -
116 // If we keep track of the vertex handles for updates,
│ │ │ -
117 // we need to have the opposite direction
│ │ │ -
118 if ( track_vhandles ) {
│ │ │ -
119 vertex_inverse_map[i1] = i0;
│ │ │ -
120 vertex_inverse_map[i0] = -1;
│ │ │ -
121 }
│ │ │ -
122
│ │ │ -
123 // swap
│ │ │ -
124 std::swap(vertices_[i0], vertices_[i1]);
│ │ │ -
125 std::swap(vh_map[i0], vh_map[i1]);
│ │ │ -
126 vprops_swap(i0, i1);
│ │ │ -
127 };
│ │ │ -
128
│ │ │ -
129 vertices_.resize(status(VertexHandle(i0)).deleted() ? i0 : i0+1);
│ │ │ - │ │ │ -
131 }
│ │ │ -
132
│ │ │ -
133
│ │ │ -
134 // remove deleted edges
│ │ │ -
135 if (_e && n_edges() > 0 && this->has_edge_status() )
│ │ │ -
136 {
│ │ │ -
137 i0=0; i1=nE-1;
│ │ │ -
138
│ │ │ -
139 while (1)
│ │ │ -
140 {
│ │ │ -
141 // find 1st deleted and last un-deleted
│ │ │ -
142 while (!status(EdgeHandle(i0)).deleted() && i0 < i1) ++i0;
│ │ │ -
143 while ( status(EdgeHandle(i1)).deleted() && i0 < i1) --i1;
│ │ │ -
144 if (i0 >= i1) break;
│ │ │ -
145
│ │ │ -
146 // If we keep track of the vertex handles for updates,
│ │ │ -
147 // we need to have the opposite direction
│ │ │ -
148 if ( track_hhandles ) {
│ │ │ -
149 halfedge_inverse_map[2*i1] = 2 * i0;
│ │ │ -
150 halfedge_inverse_map[2*i0] = -1;
│ │ │ -
151
│ │ │ -
152 halfedge_inverse_map[2*i1 + 1] = 2 * i0 + 1;
│ │ │ -
153 halfedge_inverse_map[2*i0 + 1] = -1;
│ │ │ -
154 }
│ │ │ -
155
│ │ │ -
156 // swap
│ │ │ -
157 std::swap(edges_[i0], edges_[i1]);
│ │ │ -
158 std::swap(hh_map[2*i0], hh_map[2*i1]);
│ │ │ -
159 std::swap(hh_map[2*i0+1], hh_map[2*i1+1]);
│ │ │ -
160 eprops_swap(i0, i1);
│ │ │ -
161 hprops_swap(2*i0, 2*i1);
│ │ │ -
162 hprops_swap(2*i0+1, 2*i1+1);
│ │ │ -
163 };
│ │ │ -
164
│ │ │ -
165 edges_.resize(status(EdgeHandle(i0)).deleted() ? i0 : i0+1);
│ │ │ - │ │ │ - │ │ │ -
168 }
│ │ │ -
169
│ │ │ -
170
│ │ │ -
171 // remove deleted faces
│ │ │ -
172 if (_f && n_faces() > 0 && this->has_face_status() )
│ │ │ -
173 {
│ │ │ -
174 i0=0; i1=nF-1;
│ │ │ -
175
│ │ │ -
176 while (1)
│ │ │ -
177 {
│ │ │ -
178 // find 1st deleted and last un-deleted
│ │ │ -
179 while (!status(FaceHandle(i0)).deleted() && i0 < i1) ++i0;
│ │ │ -
180 while ( status(FaceHandle(i1)).deleted() && i0 < i1) --i1;
│ │ │ -
181 if (i0 >= i1) break;
│ │ │ -
182
│ │ │ -
183 // If we keep track of the face handles for updates,
│ │ │ -
184 // we need to have the opposite direction
│ │ │ -
185 if ( track_fhandles ) {
│ │ │ -
186 face_inverse_map[i1] = i0;
│ │ │ -
187 face_inverse_map[i0] = -1;
│ │ │ -
188 }
│ │ │ -
189
│ │ │ -
190 // swap
│ │ │ -
191 std::swap(faces_[i0], faces_[i1]);
│ │ │ -
192 std::swap(fh_map[i0], fh_map[i1]);
│ │ │ -
193 fprops_swap(i0, i1);
│ │ │ -
194 };
│ │ │ -
195
│ │ │ -
196 faces_.resize(status(FaceHandle(i0)).deleted() ? i0 : i0+1);
│ │ │ - │ │ │ -
198 }
│ │ │ -
199
│ │ │ -
200
│ │ │ -
201 // update handles of vertices
│ │ │ -
202 if (_e)
│ │ │ -
203 {
│ │ │ -
204 KernelVertexIter v_it(vertices_begin()), v_end(vertices_end());
│ │ │ -
205 VertexHandle vh;
│ │ │ -
206
│ │ │ -
207 for (; v_it!=v_end; ++v_it)
│ │ │ -
208 {
│ │ │ -
209 vh = handle(*v_it);
│ │ │ -
210 if (!is_isolated(vh))
│ │ │ -
211 {
│ │ │ -
212 set_halfedge_handle(vh, hh_map[halfedge_handle(vh).idx()]);
│ │ │ -
213 }
│ │ │ -
214 }
│ │ │ -
215 }
│ │ │ -
216
│ │ │ - │ │ │ -
218 // update handles of halfedges
│ │ │ -
219 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it)
│ │ │ -
220 {//in the first pass update the (half)edges vertices
│ │ │ -
221 hh = halfedge_handle(handle(*e_it), 0);
│ │ │ -
222 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]);
│ │ │ -
223 hh = halfedge_handle(handle(*e_it), 1);
│ │ │ -
224 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]);
│ │ │ -
225 }
│ │ │ -
226 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it)
│ │ │ -
227 {//in the second pass update the connectivity of the (half)edges
│ │ │ -
228 hh = halfedge_handle(handle(*e_it), 0);
│ │ │ -
229 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]);
│ │ │ -
230 if (!is_boundary(hh))
│ │ │ -
231 {
│ │ │ -
232 set_face_handle(hh, fh_map[face_handle(hh).idx()]);
│ │ │ -
233 }
│ │ │ -
234 hh = halfedge_handle(handle(*e_it), 1);
│ │ │ -
235 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]);
│ │ │ -
236 if (!is_boundary(hh))
│ │ │ -
237 {
│ │ │ -
238 set_face_handle(hh, fh_map[face_handle(hh).idx()]);
│ │ │ -
239 }
│ │ │ -
240 }
│ │ │ -
241
│ │ │ -
242 // update handles of faces
│ │ │ -
243 if (_e)
│ │ │ -
244 {
│ │ │ -
245 KernelFaceIter f_it(faces_begin()), f_end(faces_end());
│ │ │ -
246 FaceHandle fh;
│ │ │ -
247
│ │ │ -
248 for (; f_it!=f_end; ++f_it)
│ │ │ -
249 {
│ │ │ -
250 fh = handle(*f_it);
│ │ │ -
251 set_halfedge_handle(fh, hh_map[halfedge_handle(fh).idx()]);
│ │ │ -
252 }
│ │ │ -
253 }
│ │ │ -
254
│ │ │ -
255 const int vertexCount = int(vertices_.size());
│ │ │ -
256 const int halfedgeCount = int(edges_.size() * 2);
│ │ │ -
257 const int faceCount = int(faces_.size());
│ │ │ -
258
│ │ │ -
259 // Update the vertex handles in the vertex handle vector
│ │ │ -
260 typename std_API_Container_VHandlePointer::iterator v_it(vh_to_update.begin()), v_it_end(vh_to_update.end());
│ │ │ -
261 for(; v_it != v_it_end; ++v_it)
│ │ │ -
262 {
│ │ │ -
263
│ │ │ -
264 // Only changed vertices need to be considered
│ │ │ -
265 if ( (*v_it)->idx() != vh_map[(*v_it)->idx()].idx() ) {
│ │ │ -
266 *(*v_it) = VertexHandle(vertex_inverse_map[(*v_it)->idx()]);
│ │ │ -
267
│ │ │ -
268 // Vertices above the vertex count have to be already mapped, or they are invalid now!
│ │ │ -
269 } else if ( ((*v_it)->idx() >= vertexCount) && (vertex_inverse_map.find((*v_it)->idx()) == vertex_inverse_map.end()) ) {
│ │ │ -
270 (*v_it)->invalidate();
│ │ │ -
271 }
│ │ │ -
272
│ │ │ -
273 }
│ │ │ -
274
│ │ │ -
275 // Update the halfedge handles in the halfedge handle vector
│ │ │ -
276 typename std_API_Container_HHandlePointer::iterator hh_it(hh_to_update.begin()), hh_it_end(hh_to_update.end());
│ │ │ -
277 for(; hh_it != hh_it_end; ++hh_it)
│ │ │ -
278 {
│ │ │ -
279 // Only changed faces need to be considered
│ │ │ -
280 if ( (*hh_it)->idx() != hh_map[(*hh_it)->idx()].idx() ) {
│ │ │ -
281 *(*hh_it) = HalfedgeHandle(halfedge_inverse_map[(*hh_it)->idx()]);
│ │ │ -
282
│ │ │ -
283 // Vertices above the face count have to be already mapped, or they are invalid now!
│ │ │ -
284 } else if ( ((*hh_it)->idx() >= halfedgeCount) && (halfedge_inverse_map.find((*hh_it)->idx()) == halfedge_inverse_map.end()) ) {
│ │ │ -
285 (*hh_it)->invalidate();
│ │ │ -
286 }
│ │ │ -
287
│ │ │ -
288 }
│ │ │ -
289
│ │ │ -
290 // Update the face handles in the face handle vector
│ │ │ -
291 typename std_API_Container_FHandlePointer::iterator fh_it(fh_to_update.begin()), fh_it_end(fh_to_update.end());
│ │ │ -
292 for(; fh_it != fh_it_end; ++fh_it)
│ │ │ -
293 {
│ │ │ -
294
│ │ │ -
295 // Only changed faces need to be considered
│ │ │ -
296 if ( (*fh_it)->idx() != fh_map[(*fh_it)->idx()].idx() ) {
│ │ │ -
297 *(*fh_it) = FaceHandle(face_inverse_map[(*fh_it)->idx()]);
│ │ │ -
298
│ │ │ -
299 // Vertices above the face count have to be already mapped, or they are invalid now!
│ │ │ -
300 } else if ( ((*fh_it)->idx() >= faceCount) && (face_inverse_map.find((*fh_it)->idx()) == face_inverse_map.end()) ) {
│ │ │ -
301 (*fh_it)->invalidate();
│ │ │ -
302 }
│ │ │ -
303
│ │ │ -
304 }
│ │ │ -
305}
│ │ │ +
95 const size_t resolution_;
│ │ │ +
96
│ │ │ +
98 size_t iterations_;
│ │ │ +
99
│ │ │ +
101 double maxNum_;
│ │ │ +
102};
│ │ │
│ │ │ -
306
│ │ │ -
307}
│ │ │ -
308
│ │ │ +
103
│ │ │ +
104//=============================================================================
│ │ │ +
105} // namespace OpenMesh
│ │ │ +
106//=============================================================================
│ │ │ +
107#endif // OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH defined
│ │ │ +
108//=============================================================================
│ │ │ +
109
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
size_t n_vertices() const override
You should not use this function directly.
Definition ArrayKernel.hh:345
│ │ │ -
size_t n_edges() const override
You should not use this function directly.
Definition ArrayKernel.hh:347
│ │ │ -
bool is_boundary(HalfedgeHandle _heh) const
Is halfedge _heh a boundary halfedge (is its face handle invalid) ?
Definition ArrayKernel.hh:400
│ │ │ -
const StatusInfo & status(VertexHandle _vh) const
Status Query API.
Definition ArrayKernel.hh:503
│ │ │ -
size_t n_faces() const override
You should not use this function directly.
Definition ArrayKernel.hh:348
│ │ │ -
void garbage_collection(bool _v=true, bool _e=true, bool _f=true)
garbage collection
Definition ArrayKernel.cc:166
│ │ │ -
size_t n_halfedges() const override
You should not use this function directly.
Definition ArrayKernel.hh:346
│ │ │ -
void eprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:737
│ │ │ -
void vprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:719
│ │ │ -
void hprops_resize(size_t _n) const
You should not use this function directly.
Definition BaseKernel.hh:724
│ │ │ -
void hprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:728
│ │ │ -
void fprops_resize(size_t _n) const
You should not use this function directly.
Definition BaseKernel.hh:742
│ │ │ -
void eprops_resize(size_t _n) const
You should not use this function directly.
Definition BaseKernel.hh:733
│ │ │ -
void fprops_swap(unsigned int _i0, unsigned int _i1) const
You should not use this function directly.
Definition BaseKernel.hh:746
│ │ │ -
void vprops_resize(size_t _n) const
Resizes all vertex property vectors to the specified size.
Definition BaseKernel.hh:703
│ │ │ -
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ -
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ -
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
bool deleted() const
is deleted ?
Definition Status.hh:103
│ │ │ +
Generate a random number between 0.0 and 1.0 with a guaranteed resolution ( Number of possible values...
Definition RandomNumberGenerator.hh:78
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -ArrayKernelT_impl.hh │ │ │ │ +RandomNumberGenerator.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,376 +45,80 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42#define OPENMESH_ARRAY_KERNEL_C │ │ │ │ -43 │ │ │ │ -44//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -45 │ │ │ │ -46#include │ │ │ │ -47 │ │ │ │ -48//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ +42// │ │ │ │ +============================================================================= │ │ │ │ +43// │ │ │ │ +44// Helper Functions for generating a random number between 0.0 and 1.0 with │ │ │ │ +45// a guaranteed resolution │ │ │ │ +46// │ │ │ │ +47// │ │ │ │ +============================================================================= │ │ │ │ +48 │ │ │ │ 49 │ │ │ │ -50namespace _O_p_e_n_M_e_s_h │ │ │ │ -51{ │ │ │ │ +50#ifndef OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH │ │ │ │ +51#define OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH │ │ │ │ 52 │ │ │ │ -53//== IMPLEMENTATION │ │ │ │ -========================================================== │ │ │ │ -54 │ │ │ │ -55template │ │ │ │ -_5_8void _A_r_r_a_y_K_e_r_n_e_l_:_:_g_a_r_b_a_g_e___c_o_l_l_e_c_t_i_o_n(std_API_Container_VHandlePointer& │ │ │ │ -vh_to_update, │ │ │ │ -59 std_API_Container_HHandlePointer& hh_to_update, │ │ │ │ -60 std_API_Container_FHandlePointer& fh_to_update, │ │ │ │ -61 bool _v, bool _e, bool _f) │ │ │ │ -62{ │ │ │ │ +53 │ │ │ │ +54//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +55 │ │ │ │ +56 │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +61 │ │ │ │ +62//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ 63 │ │ │ │ -64#ifdef DEBUG │ │ │ │ -65 #ifndef OM_GARBAGE_NO_STATUS_WARNING │ │ │ │ -66 if ( !this->has_vertex_status() ) │ │ │ │ -67 omerr() << "garbage_collection: No vertex status available. You can request │ │ │ │ -it: mesh.request_vertex_status() or define OM_GARBAGE_NO_STATUS_WARNING to │ │ │ │ -silence this warning." << std::endl; │ │ │ │ -68 if ( !this->has_edge_status() ) │ │ │ │ -69 omerr() << "garbage_collection: No edge status available. You can request │ │ │ │ -it: mesh.request_edge_status() or define OM_GARBAGE_NO_STATUS_WARNING to │ │ │ │ -silence this warning." << std::endl; │ │ │ │ -70 if ( !this->has_face_status() ) │ │ │ │ -71 omerr() << "garbage_collection: No face status available. You can request │ │ │ │ -it: mesh.request_face_status() or define OM_GARBAGE_NO_STATUS_WARNING to │ │ │ │ -silence this warning." << std::endl; │ │ │ │ -72 #endif │ │ │ │ -73#endif │ │ │ │ -74 │ │ │ │ -75 const bool track_vhandles = ( !vh_to_update.empty() ); │ │ │ │ -76 const bool track_hhandles = ( !hh_to_update.empty() ); │ │ │ │ -77 const bool track_fhandles = ( !fh_to_update.empty() ); │ │ │ │ -78 │ │ │ │ -79 int i, i0, i1; │ │ │ │ +64 │ │ │ │ +65namespace _O_p_e_n_M_e_s_h { │ │ │ │ +66 │ │ │ │ +67 │ │ │ │ +68// │ │ │ │ +============================================================================= │ │ │ │ +69 │ │ │ │ +70 │ │ │ │ +_7_7class OPENMESHDLLEXPORT _R_a_n_d_o_m_N_u_m_b_e_r_G_e_n_e_r_a_t_o_r │ │ │ │ +78{ │ │ │ │ +79public: │ │ │ │ 80 │ │ │ │ -81 int nV = int(_n___v_e_r_t_i_c_e_s()); │ │ │ │ -82 int nE = int(_n___e_d_g_e_s()); │ │ │ │ -83 int nH = int(2*_n___e_d_g_e_s()); │ │ │ │ -84 int nF = (int(_n___f_a_c_e_s())); │ │ │ │ -85 │ │ │ │ -86 std::vector vh_map; │ │ │ │ -87 std::vector hh_map; │ │ │ │ -88 std::vector fh_map; │ │ │ │ +85 explicit _R_a_n_d_o_m_N_u_m_b_e_r_G_e_n_e_r_a_t_o_r(const size_t _resolution); │ │ │ │ +86 │ │ │ │ +88 double getRand() const; │ │ │ │ 89 │ │ │ │ -90 std::map vertex_inverse_map; │ │ │ │ -91 std::map halfedge_inverse_map; │ │ │ │ -92 std::map face_inverse_map; │ │ │ │ +90 double resolution() const; │ │ │ │ +91 │ │ │ │ +92private: │ │ │ │ 93 │ │ │ │ -94 // setup handle mapping: │ │ │ │ -95 vh_map.reserve(nV); │ │ │ │ -96 for (i=0; i 0 && this->has_vertex_status() ) │ │ │ │ -106 { │ │ │ │ -107 i0=0; i1=nV-1; │ │ │ │ -108 │ │ │ │ -109 while (1) │ │ │ │ -110 { │ │ │ │ -111 // find 1st deleted and last un-deleted │ │ │ │ -112 while (!_s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e(i0))._d_e_l_e_t_e_d() && i0 < i1) ++i0; │ │ │ │ -113 while ( _s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e(i1))._d_e_l_e_t_e_d() && i0 < i1) --i1; │ │ │ │ -114 if (i0 >= i1) break; │ │ │ │ -115 │ │ │ │ -116 // If we keep track of the vertex handles for updates, │ │ │ │ -117 // we need to have the opposite direction │ │ │ │ -118 if ( track_vhandles ) { │ │ │ │ -119 vertex_inverse_map[i1] = i0; │ │ │ │ -120 vertex_inverse_map[i0] = -1; │ │ │ │ -121 } │ │ │ │ -122 │ │ │ │ -123 // swap │ │ │ │ -124 std::swap(vertices_[i0], vertices_[i1]); │ │ │ │ -125 std::swap(vh_map[i0], vh_map[i1]); │ │ │ │ -126 _v_p_r_o_p_s___s_w_a_p(i0, i1); │ │ │ │ -127 }; │ │ │ │ -128 │ │ │ │ -129 vertices_.resize(_s_t_a_t_u_s(_V_e_r_t_e_x_H_a_n_d_l_e(i0)).deleted() ? i0 : i0+1); │ │ │ │ -130 _v_p_r_o_p_s___r_e_s_i_z_e(_n___v_e_r_t_i_c_e_s()); │ │ │ │ -131 } │ │ │ │ -132 │ │ │ │ -133 │ │ │ │ -134 // remove deleted edges │ │ │ │ -135 if (_e && _n___e_d_g_e_s() > 0 && this->has_edge_status() ) │ │ │ │ -136 { │ │ │ │ -137 i0=0; i1=nE-1; │ │ │ │ -138 │ │ │ │ -139 while (1) │ │ │ │ -140 { │ │ │ │ -141 // find 1st deleted and last un-deleted │ │ │ │ -142 while (!_s_t_a_t_u_s(_E_d_g_e_H_a_n_d_l_e(i0)).deleted() && i0 < i1) ++i0; │ │ │ │ -143 while ( _s_t_a_t_u_s(_E_d_g_e_H_a_n_d_l_e(i1)).deleted() && i0 < i1) --i1; │ │ │ │ -144 if (i0 >= i1) break; │ │ │ │ -145 │ │ │ │ -146 // If we keep track of the vertex handles for updates, │ │ │ │ -147 // we need to have the opposite direction │ │ │ │ -148 if ( track_hhandles ) { │ │ │ │ -149 halfedge_inverse_map[2*i1] = 2 * i0; │ │ │ │ -150 halfedge_inverse_map[2*i0] = -1; │ │ │ │ -151 │ │ │ │ -152 halfedge_inverse_map[2*i1 + 1] = 2 * i0 + 1; │ │ │ │ -153 halfedge_inverse_map[2*i0 + 1] = -1; │ │ │ │ -154 } │ │ │ │ -155 │ │ │ │ -156 // swap │ │ │ │ -157 std::swap(edges_[i0], edges_[i1]); │ │ │ │ -158 std::swap(hh_map[2*i0], hh_map[2*i1]); │ │ │ │ -159 std::swap(hh_map[2*i0+1], hh_map[2*i1+1]); │ │ │ │ -160 _e_p_r_o_p_s___s_w_a_p(i0, i1); │ │ │ │ -161 _h_p_r_o_p_s___s_w_a_p(2*i0, 2*i1); │ │ │ │ -162 _h_p_r_o_p_s___s_w_a_p(2*i0+1, 2*i1+1); │ │ │ │ -163 }; │ │ │ │ -164 │ │ │ │ -165 edges_.resize(_s_t_a_t_u_s(_E_d_g_e_H_a_n_d_l_e(i0)).deleted() ? i0 : i0+1); │ │ │ │ -166 _e_p_r_o_p_s___r_e_s_i_z_e(_n___e_d_g_e_s()); │ │ │ │ -167 _h_p_r_o_p_s___r_e_s_i_z_e(_n___h_a_l_f_e_d_g_e_s()); │ │ │ │ -168 } │ │ │ │ -169 │ │ │ │ -170 │ │ │ │ -171 // remove deleted faces │ │ │ │ -172 if (_f && _n___f_a_c_e_s() > 0 && this->has_face_status() ) │ │ │ │ -173 { │ │ │ │ -174 i0=0; i1=nF-1; │ │ │ │ -175 │ │ │ │ -176 while (1) │ │ │ │ -177 { │ │ │ │ -178 // find 1st deleted and last un-deleted │ │ │ │ -179 while (!_s_t_a_t_u_s(_F_a_c_e_H_a_n_d_l_e(i0)).deleted() && i0 < i1) ++i0; │ │ │ │ -180 while ( _s_t_a_t_u_s(_F_a_c_e_H_a_n_d_l_e(i1)).deleted() && i0 < i1) --i1; │ │ │ │ -181 if (i0 >= i1) break; │ │ │ │ -182 │ │ │ │ -183 // If we keep track of the face handles for updates, │ │ │ │ -184 // we need to have the opposite direction │ │ │ │ -185 if ( track_fhandles ) { │ │ │ │ -186 face_inverse_map[i1] = i0; │ │ │ │ -187 face_inverse_map[i0] = -1; │ │ │ │ -188 } │ │ │ │ -189 │ │ │ │ -190 // swap │ │ │ │ -191 std::swap(faces_[i0], faces_[i1]); │ │ │ │ -192 std::swap(fh_map[i0], fh_map[i1]); │ │ │ │ -193 _f_p_r_o_p_s___s_w_a_p(i0, i1); │ │ │ │ -194 }; │ │ │ │ -195 │ │ │ │ -196 faces_.resize(_s_t_a_t_u_s(_F_a_c_e_H_a_n_d_l_e(i0)).deleted() ? i0 : i0+1); │ │ │ │ -197 _f_p_r_o_p_s___r_e_s_i_z_e(_n___f_a_c_e_s()); │ │ │ │ -198 } │ │ │ │ -199 │ │ │ │ -200 │ │ │ │ -201 // update handles of vertices │ │ │ │ -202 if (_e) │ │ │ │ -203 { │ │ │ │ -204 KernelVertexIter v_it(vertices_begin()), v_end(vertices_end()); │ │ │ │ -205 _V_e_r_t_e_x_H_a_n_d_l_e vh; │ │ │ │ -206 │ │ │ │ -207 for (; v_it!=v_end; ++v_it) │ │ │ │ -208 { │ │ │ │ -209 vh = handle(*v_it); │ │ │ │ -210 if (!is_isolated(vh)) │ │ │ │ -211 { │ │ │ │ -212 set_halfedge_handle(vh, hh_map[halfedge_handle(vh).idx()]); │ │ │ │ -213 } │ │ │ │ -214 } │ │ │ │ -215 } │ │ │ │ -216 │ │ │ │ -217 _H_a_l_f_e_d_g_e_H_a_n_d_l_e hh; │ │ │ │ -218 // update handles of halfedges │ │ │ │ -219 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it) │ │ │ │ -220 {//in the first pass update the (half)edges vertices │ │ │ │ -221 hh = halfedge_handle(handle(*e_it), 0); │ │ │ │ -222 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]); │ │ │ │ -223 hh = halfedge_handle(handle(*e_it), 1); │ │ │ │ -224 set_vertex_handle(hh, vh_map[to_vertex_handle(hh).idx()]); │ │ │ │ -225 } │ │ │ │ -226 for (KernelEdgeIter e_it(edges_begin()); e_it != edges_end(); ++e_it) │ │ │ │ -227 {//in the second pass update the connectivity of the (half)edges │ │ │ │ -228 hh = halfedge_handle(handle(*e_it), 0); │ │ │ │ -229 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]); │ │ │ │ -230 if (!_i_s___b_o_u_n_d_a_r_y(hh)) │ │ │ │ -231 { │ │ │ │ -232 set_face_handle(hh, fh_map[face_handle(hh).idx()]); │ │ │ │ -233 } │ │ │ │ -234 hh = halfedge_handle(handle(*e_it), 1); │ │ │ │ -235 set_next_halfedge_handle(hh, hh_map[next_halfedge_handle(hh).idx()]); │ │ │ │ -236 if (!_i_s___b_o_u_n_d_a_r_y(hh)) │ │ │ │ -237 { │ │ │ │ -238 set_face_handle(hh, fh_map[face_handle(hh).idx()]); │ │ │ │ -239 } │ │ │ │ -240 } │ │ │ │ -241 │ │ │ │ -242 // update handles of faces │ │ │ │ -243 if (_e) │ │ │ │ -244 { │ │ │ │ -245 KernelFaceIter f_it(faces_begin()), f_end(faces_end()); │ │ │ │ -246 _F_a_c_e_H_a_n_d_l_e fh; │ │ │ │ -247 │ │ │ │ -248 for (; f_it!=f_end; ++f_it) │ │ │ │ -249 { │ │ │ │ -250 fh = handle(*f_it); │ │ │ │ -251 set_halfedge_handle(fh, hh_map[halfedge_handle(fh).idx()]); │ │ │ │ -252 } │ │ │ │ -253 } │ │ │ │ -254 │ │ │ │ -255 const int vertexCount = int(vertices_.size()); │ │ │ │ -256 const int halfedgeCount = int(edges_.size() * 2); │ │ │ │ -257 const int faceCount = int(faces_.size()); │ │ │ │ -258 │ │ │ │ -259 // Update the vertex handles in the vertex handle vector │ │ │ │ -260 typename std_API_Container_VHandlePointer::iterator v_it(vh_to_update.begin │ │ │ │ -()), v_it_end(vh_to_update.end()); │ │ │ │ -261 for(; v_it != v_it_end; ++v_it) │ │ │ │ -262 { │ │ │ │ -263 │ │ │ │ -264 // Only changed vertices need to be considered │ │ │ │ -265 if ( (*v_it)->idx() != vh_map[(*v_it)->idx()].idx() ) { │ │ │ │ -266 *(*v_it) = _V_e_r_t_e_x_H_a_n_d_l_e(vertex_inverse_map[(*v_it)->idx()]); │ │ │ │ -267 │ │ │ │ -268 // Vertices above the vertex count have to be already mapped, or they are │ │ │ │ -invalid now! │ │ │ │ -269 } else if ( ((*v_it)->idx() >= vertexCount) && (vertex_inverse_map.find( │ │ │ │ -(*v_it)->idx()) == vertex_inverse_map.end()) ) { │ │ │ │ -270 (*v_it)->invalidate(); │ │ │ │ -271 } │ │ │ │ -272 │ │ │ │ -273 } │ │ │ │ -274 │ │ │ │ -275 // Update the halfedge handles in the halfedge handle vector │ │ │ │ -276 typename std_API_Container_HHandlePointer::iterator hh_it │ │ │ │ -(hh_to_update.begin()), hh_it_end(hh_to_update.end()); │ │ │ │ -277 for(; hh_it != hh_it_end; ++hh_it) │ │ │ │ -278 { │ │ │ │ -279 // Only changed faces need to be considered │ │ │ │ -280 if ( (*hh_it)->idx() != hh_map[(*hh_it)->idx()].idx() ) { │ │ │ │ -281 *(*hh_it) = _H_a_l_f_e_d_g_e_H_a_n_d_l_e(halfedge_inverse_map[(*hh_it)->idx()]); │ │ │ │ -282 │ │ │ │ -283 // Vertices above the face count have to be already mapped, or they are │ │ │ │ -invalid now! │ │ │ │ -284 } else if ( ((*hh_it)->idx() >= halfedgeCount) && │ │ │ │ -(halfedge_inverse_map.find((*hh_it)->idx()) == halfedge_inverse_map.end()) ) { │ │ │ │ -285 (*hh_it)->invalidate(); │ │ │ │ -286 } │ │ │ │ -287 │ │ │ │ -288 } │ │ │ │ -289 │ │ │ │ -290 // Update the face handles in the face handle vector │ │ │ │ -291 typename std_API_Container_FHandlePointer::iterator fh_it │ │ │ │ -(fh_to_update.begin()), fh_it_end(fh_to_update.end()); │ │ │ │ -292 for(; fh_it != fh_it_end; ++fh_it) │ │ │ │ -293 { │ │ │ │ -294 │ │ │ │ -295 // Only changed faces need to be considered │ │ │ │ -296 if ( (*fh_it)->idx() != fh_map[(*fh_it)->idx()].idx() ) { │ │ │ │ -297 *(*fh_it) = _F_a_c_e_H_a_n_d_l_e(face_inverse_map[(*fh_it)->idx()]); │ │ │ │ -298 │ │ │ │ -299 // Vertices above the face count have to be already mapped, or they are │ │ │ │ -invalid now! │ │ │ │ -300 } else if ( ((*fh_it)->idx() >= faceCount) && (face_inverse_map.find( │ │ │ │ -(*fh_it)->idx()) == face_inverse_map.end()) ) { │ │ │ │ -301 (*fh_it)->invalidate(); │ │ │ │ -302 } │ │ │ │ -303 │ │ │ │ -304 } │ │ │ │ -305} │ │ │ │ -306 │ │ │ │ -307} │ │ │ │ -308 │ │ │ │ +104// │ │ │ │ +============================================================================= │ │ │ │ +105} // namespace OpenMesh │ │ │ │ +106// │ │ │ │ +============================================================================= │ │ │ │ +107#endif // OPENMESH_UTILS_RANDOMNUMBERGENERATOR_HH defined │ │ │ │ +108// │ │ │ │ +============================================================================= │ │ │ │ +109 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___v_e_r_t_i_c_e_s │ │ │ │ -size_t n_vertices() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:345 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___e_d_g_e_s │ │ │ │ -size_t n_edges() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:347 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_i_s___b_o_u_n_d_a_r_y │ │ │ │ -bool is_boundary(HalfedgeHandle _heh) const │ │ │ │ -Is halfedge _heh a boundary halfedge (is its face handle invalid) ? │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:400 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_s_t_a_t_u_s │ │ │ │ -const StatusInfo & status(VertexHandle _vh) const │ │ │ │ -Status Query API. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:503 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___f_a_c_e_s │ │ │ │ -size_t n_faces() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:348 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_g_a_r_b_a_g_e___c_o_l_l_e_c_t_i_o_n │ │ │ │ -void garbage_collection(bool _v=true, bool _e=true, bool _f=true) │ │ │ │ -garbage collection │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.cc:166 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_r_r_a_y_K_e_r_n_e_l_:_:_n___h_a_l_f_e_d_g_e_s │ │ │ │ -size_t n_halfedges() const override │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn ArrayKernel.hh:346 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_e_p_r_o_p_s___s_w_a_p │ │ │ │ -void eprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:737 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_v_p_r_o_p_s___s_w_a_p │ │ │ │ -void vprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:719 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_h_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ -void hprops_resize(size_t _n) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:724 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_h_p_r_o_p_s___s_w_a_p │ │ │ │ -void hprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:728 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_f_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ -void fprops_resize(size_t _n) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:742 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_e_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ -void eprops_resize(size_t _n) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:733 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_f_p_r_o_p_s___s_w_a_p │ │ │ │ -void fprops_swap(unsigned int _i0, unsigned int _i1) const │ │ │ │ -You should not use this function directly. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:746 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l_:_:_v_p_r_o_p_s___r_e_s_i_z_e │ │ │ │ -void vprops_resize(size_t _n) const │ │ │ │ -Resizes all vertex property vectors to the specified size. │ │ │ │ -DDeeffiinniittiioonn BaseKernel.hh:703 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Handle for a vertex entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a halfedge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Handle for a edge entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o_:_:_d_e_l_e_t_e_d │ │ │ │ -bool deleted() const │ │ │ │ -is deleted ? │ │ │ │ -DDeeffiinniittiioonn Status.hh:103 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_R_a_n_d_o_m_N_u_m_b_e_r_G_e_n_e_r_a_t_o_r │ │ │ │ +Generate a random number between 0.0 and 1.0 with a guaranteed resolution │ │ │ │ +( Number of possible values... │ │ │ │ +DDeeffiinniittiioonn RandomNumberGenerator.hh:78 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00746_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/BaseMesh.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Utils/Endian.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
BaseMesh.hh
│ │ │ +
Endian.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -141,60 +141,70 @@ │ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45//=============================================================================
│ │ │
46//
│ │ │ -
47// CLASS BaseMesh
│ │ │ +
47// Helper Functions for binary reading / writing
│ │ │
48//
│ │ │
49//=============================================================================
│ │ │
50
│ │ │
51
│ │ │ -
52#ifndef OPENMESH_BASEMESH_HH
│ │ │ -
53#define OPENMESH_BASEMESH_HH
│ │ │ +
52#ifndef OPENMESH_UTILS_ENDIAN_HH
│ │ │ +
53#define OPENMESH_UTILS_ENDIAN_HH
│ │ │
54
│ │ │
55
│ │ │
56//== INCLUDES =================================================================
│ │ │
57
│ │ │
58
│ │ │
59#include <OpenMesh/Core/System/config.h>
│ │ │ -
60#include <OpenMesh/Core/Mesh/IteratorsT.hh>
│ │ │ -
61#include <OpenMesh/Core/Mesh/CirculatorsT.hh>
│ │ │ - │ │ │ -
63#include <vector>
│ │ │ +
60
│ │ │ +
61
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │ +
63
│ │ │
64
│ │ │ -
65
│ │ │ -
66//== NAMESPACES ===============================================================
│ │ │ +
65namespace OpenMesh {
│ │ │ +
66
│ │ │
67
│ │ │ -
68
│ │ │ -
69namespace OpenMesh {
│ │ │ +
68//=============================================================================
│ │ │ +
69
│ │ │
70
│ │ │ -
71
│ │ │ -
72//== CLASS DEFINITION =========================================================
│ │ │ -
73
│ │ │ -
74
│ │ │ -
│ │ │ -
80class BaseMesh {
│ │ │ -
81public:
│ │ │ -
82 virtual ~BaseMesh(void) {;}
│ │ │ -
83};
│ │ │ +
│ │ │ +
73class OPENMESHDLLEXPORT Endian
│ │ │ +
74{
│ │ │ +
75public:
│ │ │ +
76
│ │ │ +
│ │ │ +
77 enum Type {
│ │ │ +
78 LSB = 1,
│ │ │ +
79 MSB
│ │ │ +
80 };
│ │ │
│ │ │ +
81
│ │ │ +
83 static Type local() { return local_; }
│ │ │
84
│ │ │ -
85
│ │ │ -
86//=============================================================================
│ │ │ -
87} // namespace OpenMesh
│ │ │ -
88//=============================================================================
│ │ │ -
89
│ │ │ -
90//=============================================================================
│ │ │ -
91#endif // OPENMESH_BASEMESH_HH defined
│ │ │ -
92//=============================================================================
│ │ │ -
This file provides some macros containing attribute usage.
│ │ │ +
86 static const char * as_string(Type _t);
│ │ │ +
87
│ │ │ +
88private:
│ │ │ +
89 static int one_;
│ │ │ +
90 static const Type local_;
│ │ │ +
91};
│ │ │ +
│ │ │ +
92
│ │ │ +
93//=============================================================================
│ │ │ +
94} // namespace OpenMesh
│ │ │ +
95//=============================================================================
│ │ │ +
96#endif // OPENMESH_MESHREADER_HH defined
│ │ │ +
97//=============================================================================
│ │ │ +
98
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Base class for all meshes.
Definition BaseMesh.hh:80
│ │ │ +
Determine byte order of host system.
Definition Endian.hh:74
│ │ │ +
Type
Definition Endian.hh:77
│ │ │ +
static Type local()
Return endian type of host system.
Definition Endian.hh:83
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -BaseMesh.hh │ │ │ │ +Endian.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -51,68 +51,79 @@ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45// │ │ │ │ ============================================================================= │ │ │ │ 46// │ │ │ │ -47// CLASS BaseMesh │ │ │ │ +47// Helper Functions for binary reading / writing │ │ │ │ 48// │ │ │ │ 49// │ │ │ │ ============================================================================= │ │ │ │ 50 │ │ │ │ 51 │ │ │ │ -52#ifndef OPENMESH_BASEMESH_HH │ │ │ │ -53#define OPENMESH_BASEMESH_HH │ │ │ │ +52#ifndef OPENMESH_UTILS_ENDIAN_HH │ │ │ │ +53#define OPENMESH_UTILS_ENDIAN_HH │ │ │ │ 54 │ │ │ │ 55 │ │ │ │ 56//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ 57 │ │ │ │ 58 │ │ │ │ 59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_A_t_t_r_i_b_u_t_e_s_._h_h> │ │ │ │ -63#include │ │ │ │ -64 │ │ │ │ -65 │ │ │ │ -66//== NAMESPACES │ │ │ │ +60 │ │ │ │ +61 │ │ │ │ +62//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ +63 │ │ │ │ +64 │ │ │ │ +65namespace _O_p_e_n_M_e_s_h { │ │ │ │ +66 │ │ │ │ 67 │ │ │ │ -68 │ │ │ │ -69namespace _O_p_e_n_M_e_s_h { │ │ │ │ +68// │ │ │ │ +============================================================================= │ │ │ │ +69 │ │ │ │ 70 │ │ │ │ -71 │ │ │ │ -72//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -73 │ │ │ │ -74 │ │ │ │ -_8_0class _B_a_s_e_M_e_s_h { │ │ │ │ -81public: │ │ │ │ -82 virtual _~_B_a_s_e_M_e_s_h(void) {;} │ │ │ │ -83}; │ │ │ │ +_7_3class OPENMESHDLLEXPORT _E_n_d_i_a_n │ │ │ │ +74{ │ │ │ │ +75public: │ │ │ │ +76 │ │ │ │ +_7_7 enum _T_y_p_e { │ │ │ │ +_7_8 LSB = 1, │ │ │ │ +79 MSB │ │ │ │ +_8_0 }; │ │ │ │ +81 │ │ │ │ +_8_3 static _T_y_p_e _l_o_c_a_l() { return local_; } │ │ │ │ 84 │ │ │ │ -85 │ │ │ │ -86// │ │ │ │ -============================================================================= │ │ │ │ -87} // namespace OpenMesh │ │ │ │ -88// │ │ │ │ +86 static const char * as_string(Type _t); │ │ │ │ +87 │ │ │ │ +88private: │ │ │ │ +89 static int one_; │ │ │ │ +90 static const Type local_; │ │ │ │ +91}; │ │ │ │ +92 │ │ │ │ +93// │ │ │ │ ============================================================================= │ │ │ │ -89 │ │ │ │ -90// │ │ │ │ +94} // namespace OpenMesh │ │ │ │ +95// │ │ │ │ ============================================================================= │ │ │ │ -91#endif // OPENMESH_BASEMESH_HH defined │ │ │ │ -92// │ │ │ │ +96#endif // OPENMESH_MESHREADER_HH defined │ │ │ │ +97// │ │ │ │ ============================================================================= │ │ │ │ -_A_t_t_r_i_b_u_t_e_s_._h_h │ │ │ │ -This file provides some macros containing attribute usage. │ │ │ │ +98 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_B_a_s_e_M_e_s_h │ │ │ │ -Base class for all meshes. │ │ │ │ -DDeeffiinniittiioonn BaseMesh.hh:80 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_n_d_i_a_n │ │ │ │ +Determine byte order of host system. │ │ │ │ +DDeeffiinniittiioonn Endian.hh:74 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_n_d_i_a_n_:_:_T_y_p_e │ │ │ │ +Type │ │ │ │ +DDeeffiinniittiioonn Endian.hh:77 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_n_d_i_a_n_:_:_l_o_c_a_l │ │ │ │ +static Type local() │ │ │ │ +Return endian type of host system. │ │ │ │ +DDeeffiinniittiioonn Endian.hh:83 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00752_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/TriMeshT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/QuadricT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
TriMeshT.hh
│ │ │ +
QuadricT.hh
│ │ │
│ │ │
│ │ │ -
1/* ========================================================================= *
│ │ │ +Go to the documentation of this file.
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -139,338 +139,267 @@ │ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │ -
45//=============================================================================
│ │ │ -
46//
│ │ │ -
47// CLASS TriMeshT
│ │ │ -
48//
│ │ │ -
49//=============================================================================
│ │ │ -
50
│ │ │ -
51
│ │ │ -
52#ifndef OPENMESH_TRIMESH_HH
│ │ │ -
53#define OPENMESH_TRIMESH_HH
│ │ │ -
54
│ │ │ +
45
│ │ │ +
50//=============================================================================
│ │ │ +
51//
│ │ │ +
52// CLASS QuadricT
│ │ │ +
53//
│ │ │ +
54//=============================================================================
│ │ │
55
│ │ │ -
56//== INCLUDES =================================================================
│ │ │ -
57
│ │ │ +
56#ifndef OPENMESH_GEOMETRY_QUADRIC_HH
│ │ │ +
57#define OPENMESH_GEOMETRY_QUADRIC_HH
│ │ │
58
│ │ │ -
59#include <OpenMesh/Core/System/config.h>
│ │ │ -
60#include <OpenMesh/Core/Mesh/PolyMeshT.hh>
│ │ │ -
61#include <OpenMesh/Core/Mesh/Tags.hh>
│ │ │ -
62#include <vector>
│ │ │ -
63
│ │ │ -
64
│ │ │ -
65//== NAMESPACES ===============================================================
│ │ │ -
66
│ │ │ +
59
│ │ │ +
60//== INCLUDES =================================================================
│ │ │ +
61
│ │ │ +
62#include "Config.hh"
│ │ │ +
63#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ +
64#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ +
65
│ │ │ +
66//== NAMESPACE ================================================================
│ │ │
67
│ │ │ -
68namespace OpenMesh {
│ │ │ -
69
│ │ │ +
68namespace OpenMesh { //BEGIN_NS_OPENMESH
│ │ │ +
69namespace Geometry { //BEGIN_NS_GEOMETRY
│ │ │
70
│ │ │ -
71//== CLASS DEFINITION =========================================================
│ │ │ -
72
│ │ │ +
71
│ │ │ +
72//== CLASS DEFINITION =========================================================
│ │ │
73
│ │ │ -
90template <class Kernel>
│ │ │ -
│ │ │ -
91class TriMeshT : public PolyMeshT<Kernel>
│ │ │ -
92{
│ │ │ -
93
│ │ │ -
94public:
│ │ │ -
95
│ │ │ -
96
│ │ │ -
97 // self
│ │ │ -
98 typedef TriMeshT<Kernel> This;
│ │ │ - │ │ │ -
100
│ │ │ -
102
│ │ │ -
103 static constexpr bool is_polymesh() { return false; }
│ │ │ -
104 static constexpr bool is_trimesh() { return true; }
│ │ │ -
105 using ConnectivityTag = TriConnectivityTag;
│ │ │ -
106 enum { IsPolyMesh = 0 };
│ │ │ -
107 enum { IsTriMesh = 1 };
│ │ │ -
109
│ │ │ -
110 //--- items ---
│ │ │ -
111
│ │ │ -
112 typedef typename PolyMesh::Scalar Scalar;
│ │ │ -
113 typedef typename PolyMesh::Point Point;
│ │ │ -
114 typedef typename PolyMesh::Normal Normal;
│ │ │ -
115 typedef typename PolyMesh::Color Color;
│ │ │ -
116 typedef typename PolyMesh::TexCoord1D TexCoord1D;
│ │ │ -
117 typedef typename PolyMesh::TexCoord2D TexCoord2D;
│ │ │ -
118 typedef typename PolyMesh::TexCoord3D TexCoord3D;
│ │ │ -
119 typedef typename PolyMesh::Vertex Vertex;
│ │ │ -
120 typedef typename PolyMesh::Halfedge Halfedge;
│ │ │ -
121 typedef typename PolyMesh::Edge Edge;
│ │ │ -
122 typedef typename PolyMesh::Face Face;
│ │ │ -
123
│ │ │ -
124
│ │ │ -
125 //--- handles ---
│ │ │ -
126
│ │ │ -
127 typedef typename PolyMesh::VertexHandle VertexHandle;
│ │ │ -
128 typedef typename PolyMesh::HalfedgeHandle HalfedgeHandle;
│ │ │ -
129 typedef typename PolyMesh::EdgeHandle EdgeHandle;
│ │ │ -
130 typedef typename PolyMesh::FaceHandle FaceHandle;
│ │ │ -
131
│ │ │ -
132
│ │ │ -
133 //--- iterators ---
│ │ │ -
134
│ │ │ -
135 typedef typename PolyMesh::VertexIter VertexIter;
│ │ │ -
136 typedef typename PolyMesh::ConstVertexIter ConstVertexIter;
│ │ │ -
137 typedef typename PolyMesh::EdgeIter EdgeIter;
│ │ │ -
138 typedef typename PolyMesh::ConstEdgeIter ConstEdgeIter;
│ │ │ -
139 typedef typename PolyMesh::FaceIter FaceIter;
│ │ │ -
140 typedef typename PolyMesh::ConstFaceIter ConstFaceIter;
│ │ │ -
141
│ │ │ -
142
│ │ │ -
143
│ │ │ -
144 //--- circulators ---
│ │ │ -
145
│ │ │ -
146 typedef typename PolyMesh::VertexVertexIter VertexVertexIter;
│ │ │ -
147 typedef typename PolyMesh::VertexOHalfedgeIter VertexOHalfedgeIter;
│ │ │ -
148 typedef typename PolyMesh::VertexIHalfedgeIter VertexIHalfedgeIter;
│ │ │ -
149 typedef typename PolyMesh::VertexEdgeIter VertexEdgeIter;
│ │ │ -
150 typedef typename PolyMesh::VertexFaceIter VertexFaceIter;
│ │ │ -
151 typedef typename PolyMesh::FaceVertexIter FaceVertexIter;
│ │ │ -
152 typedef typename PolyMesh::FaceHalfedgeIter FaceHalfedgeIter;
│ │ │ -
153 typedef typename PolyMesh::FaceEdgeIter FaceEdgeIter;
│ │ │ -
154 typedef typename PolyMesh::FaceFaceIter FaceFaceIter;
│ │ │ -
155 typedef typename PolyMesh::ConstVertexVertexIter ConstVertexVertexIter;
│ │ │ -
156 typedef typename PolyMesh::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter;
│ │ │ -
157 typedef typename PolyMesh::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter;
│ │ │ -
158 typedef typename PolyMesh::ConstVertexEdgeIter ConstVertexEdgeIter;
│ │ │ -
159 typedef typename PolyMesh::ConstVertexFaceIter ConstVertexFaceIter;
│ │ │ -
160 typedef typename PolyMesh::ConstFaceVertexIter ConstFaceVertexIter;
│ │ │ -
161 typedef typename PolyMesh::ConstFaceHalfedgeIter ConstFaceHalfedgeIter;
│ │ │ -
162 typedef typename PolyMesh::ConstFaceEdgeIter ConstFaceEdgeIter;
│ │ │ -
163 typedef typename PolyMesh::ConstFaceFaceIter ConstFaceFaceIter;
│ │ │ +
74
│ │ │ +
81template <class Scalar>
│ │ │ +
│ │ │ + │ │ │ +
83{
│ │ │ +
84public:
│ │ │ +
85 typedef Scalar value_type;
│ │ │ +
86 typedef QuadricT<Scalar> type;
│ │ │ +
87 typedef QuadricT<Scalar> Self;
│ │ │ +
88 // typedef VectorInterface<Scalar, VecStorage3<Scalar> > Vec3;
│ │ │ +
89 // typedef VectorInterface<Scalar, VecStorage4<Scalar> > Vec4;
│ │ │ +
90 //typedef Vector3Elem Vec3;
│ │ │ +
91 //typedef Vector4Elem Vec4;
│ │ │ +
92
│ │ │ +
│ │ │ +
94 QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d,
│ │ │ +
95 Scalar _e, Scalar _f, Scalar _g,
│ │ │ +
96 Scalar _h, Scalar _i,
│ │ │ +
97 Scalar _j)
│ │ │ +
98 : a_(_a), b_(_b), c_(_c), d_(_d),
│ │ │ +
99 e_(_e), f_(_f), g_(_g),
│ │ │ +
100 h_(_h), i_(_i),
│ │ │ +
101 j_(_j)
│ │ │ +
102 {
│ │ │ +
103 }
│ │ │ +
│ │ │ +
104
│ │ │ +
105
│ │ │ +
│ │ │ +
107 QuadricT( Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0 )
│ │ │ +
108 : a_(_a*_a), b_(_a*_b), c_(_a*_c), d_(_a*_d),
│ │ │ +
109 e_(_b*_b), f_(_b*_c), g_(_b*_d),
│ │ │ +
110 h_(_c*_c), i_(_c*_d),
│ │ │ +
111 j_(_d*_d)
│ │ │ +
112 {}
│ │ │ +
│ │ │ +
113
│ │ │ +
114 template <class _Point>
│ │ │ +
115 explicit QuadricT(const _Point& _pt)
│ │ │ +
116 {
│ │ │ +
117 set_distance_to_point(_pt);
│ │ │ +
118 }
│ │ │ +
119
│ │ │ +
120 template <class _Normal, class _Point>
│ │ │ +
121 QuadricT(const _Normal& _n, const _Point& _p)
│ │ │ +
122 {
│ │ │ +
123 set_distance_to_plane(_n,_p);
│ │ │ +
124 }
│ │ │ +
125
│ │ │ +
126 //set operator
│ │ │ +
127 void set(Scalar _a, Scalar _b, Scalar _c, Scalar _d,
│ │ │ +
128 Scalar _e, Scalar _f, Scalar _g,
│ │ │ +
129 Scalar _h, Scalar _i,
│ │ │ +
130 Scalar _j)
│ │ │ +
131 {
│ │ │ +
132 a_ = _a; b_ = _b; c_ = _c; d_ = _d;
│ │ │ +
133 e_ = _e; f_ = _f; g_ = _g;
│ │ │ +
134 h_ = _h; i_ = _i;
│ │ │ +
135 j_ = _j;
│ │ │ +
136 }
│ │ │ +
137
│ │ │ +
138 //sets the quadric representing the squared distance to _pt
│ │ │ +
139 template <class _Point>
│ │ │ +
140 void set_distance_to_point(const _Point& _pt)
│ │ │ +
141 {
│ │ │ +
142 set(1, 0, 0, -_pt[0],
│ │ │ +
143 1, 0, -_pt[1],
│ │ │ +
144 1, -_pt[2],
│ │ │ +
145 dot(_pt,_pt));
│ │ │ +
146 }
│ │ │ +
147
│ │ │ +
148 //sets the quadric representing the squared distance to the plane [_a,_b,_c,_d]
│ │ │ +
149 void set_distance_to_plane(Scalar _a, Scalar _b, Scalar _c, Scalar _d)
│ │ │ +
150 {
│ │ │ +
151 a_ = _a*_a; b_ = _a*_b; c_ = _a*_c; d_ = _a*_d;
│ │ │ +
152 e_ = _b*_b; f_ = _b*_c; g_ = _b*_d;
│ │ │ +
153 h_ = _c*_c; i_ = _c*_d;
│ │ │ +
154 j_ = _d*_d;
│ │ │ +
155 }
│ │ │ +
156
│ │ │ +
157 //sets the quadric representing the squared distance to the plane
│ │ │ +
158 //determined by the normal _n and the point _p
│ │ │ +
159 template <class _Normal, class _Point>
│ │ │ +
160 void set_distance_to_plane(const _Normal& _n, const _Point& _p)
│ │ │ +
161 {
│ │ │ +
162 set_distance_to_plane(_n[0], _n[1], _n[2], -dot(_n,_p));
│ │ │ +
163 }
│ │ │
164
│ │ │ -
165 // --- constructor/destructor
│ │ │ -
166
│ │ │ - │ │ │ -
169 explicit TriMeshT(PolyMesh rhs) : PolyMesh((rhs.triangulate(), rhs))
│ │ │ +
166 void clear() { a_ = b_ = c_ = d_ = e_ = f_ = g_ = h_ = i_ = j_ = 0.0; }
│ │ │ +
167
│ │ │ +
│ │ │ + │ │ │
170 {
│ │ │ -
171 }
│ │ │ -
172
│ │ │ -
174 virtual ~TriMeshT() {}
│ │ │ -
175
│ │ │ -
176 //--- halfedge collapse / vertex split ---
│ │ │ -
177
│ │ │ -
│ │ │ -
218 inline HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1,
│ │ │ -
219 VertexHandle _vl, VertexHandle _vr)
│ │ │ -
220 { return PolyMesh::vertex_split(this->add_vertex(_v0_point), _v1, _vl, _vr); }
│ │ │ -
│ │ │ -
221
│ │ │ -
│ │ │ -
262 inline HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1,
│ │ │ -
263 VertexHandle _vl, VertexHandle _vr)
│ │ │ -
264 { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); }
│ │ │ -
│ │ │ -
265
│ │ │ -
│ │ │ -
275 inline SmartVertexHandle split(EdgeHandle _eh, const Point& _p)
│ │ │ -
276 {
│ │ │ -
277 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ -
278 const SmartVertexHandle vh = this->add_vertex(_p); Kernel::split(_eh, vh); return vh;
│ │ │ -
279 }
│ │ │ +
171 a_ += _q.a_; b_ += _q.b_; c_ += _q.c_; d_ += _q.d_;
│ │ │ +
172 e_ += _q.e_; f_ += _q.f_; g_ += _q.g_;
│ │ │ +
173 h_ += _q.h_; i_ += _q.i_;
│ │ │ +
174 j_ += _q.j_;
│ │ │ +
175 return *this;
│ │ │ +
176 }
│ │ │
│ │ │ +
177
│ │ │ +
178 QuadricT<Scalar> operator+(const QuadricT<Scalar>& _other ) const
│ │ │ +
179 {
│ │ │ +
180 QuadricT<Scalar> result = *this;
│ │ │ +
181 return result += _other;
│ │ │ +
182 }
│ │ │ +
183
│ │ │ +
184
│ │ │ +
│ │ │ + │ │ │ +
187 {
│ │ │ +
188 a_ *= _s; b_ *= _s; c_ *= _s; d_ *= _s;
│ │ │ +
189 e_ *= _s; f_ *= _s; g_ *= _s;
│ │ │ +
190 h_ *= _s; i_ *= _s;
│ │ │ +
191 j_ *= _s;
│ │ │ +
192 return *this;
│ │ │ +
193 }
│ │ │ +
│ │ │ +
194
│ │ │ +
195 QuadricT<Scalar> operator*(Scalar _s) const
│ │ │ +
196 {
│ │ │ +
197 QuadricT<Scalar> result = *this;
│ │ │ +
198 return result *= _s;
│ │ │ +
199 }
│ │ │ +
200
│ │ │ +
202 template <class _Vec4>
│ │ │ +
│ │ │ +
203 _Vec4 operator*(const _Vec4& _v) const
│ │ │ +
204 {
│ │ │ +
205 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]);
│ │ │ +
206 return _Vec4(x*a_ + y*b_ + z*c_ + w*d_,
│ │ │ +
207 x*b_ + y*e_ + z*f_ + w*g_,
│ │ │ +
208 x*c_ + y*f_ + z*h_ + w*i_,
│ │ │ +
209 x*d_ + y*g_ + z*i_ + w*j_);
│ │ │ +
210 }
│ │ │ +
│ │ │ +
211
│ │ │ +
213 template <class _Vec>
│ │ │ +
│ │ │ +
214 Scalar operator()(const _Vec& _v) const
│ │ │ +
215 {
│ │ │ +
216 return evaluate(_v, GenProg::Int2Type<vector_traits<_Vec>::size_>());
│ │ │ +
217 }
│ │ │ +
│ │ │ +
218
│ │ │ +
219 Scalar a() const { return a_; }
│ │ │ +
220 Scalar b() const { return b_; }
│ │ │ +
221 Scalar c() const { return c_; }
│ │ │ +
222 Scalar d() const { return d_; }
│ │ │ +
223 Scalar e() const { return e_; }
│ │ │ +
224 Scalar f() const { return f_; }
│ │ │ +
225 Scalar g() const { return g_; }
│ │ │ +
226 Scalar h() const { return h_; }
│ │ │ +
227 Scalar i() const { return i_; }
│ │ │ +
228 Scalar j() const { return j_; }
│ │ │ +
229
│ │ │ +
230 Scalar xx() const { return a_; }
│ │ │ +
231 Scalar xy() const { return b_; }
│ │ │ +
232 Scalar xz() const { return c_; }
│ │ │ +
233 Scalar xw() const { return d_; }
│ │ │ +
234 Scalar yy() const { return e_; }
│ │ │ +
235 Scalar yz() const { return f_; }
│ │ │ +
236 Scalar yw() const { return g_; }
│ │ │ +
237 Scalar zz() const { return h_; }
│ │ │ +
238 Scalar zw() const { return i_; }
│ │ │ +
239 Scalar ww() const { return j_; }
│ │ │ +
240
│ │ │ +
241protected:
│ │ │ +
242
│ │ │ +
244 template <class _Vec3>
│ │ │ +
│ │ │ +
245 Scalar evaluate(const _Vec3& _v, GenProg::Int2Type<3>/*_dimension*/) const
│ │ │ +
246 {
│ │ │ +
247 Scalar x(_v[0]), y(_v[1]), z(_v[2]);
│ │ │ +
248 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x
│ │ │ +
249 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y
│ │ │ +
250 + h_*z*z + 2.0*i_*z
│ │ │ +
251 + j_;
│ │ │ +
252 }
│ │ │ +
│ │ │ +
253
│ │ │ +
255 template <class _Vec4>
│ │ │ +
│ │ │ +
256 Scalar evaluate(const _Vec4& _v, GenProg::Int2Type<4>/*_dimension*/) const
│ │ │ +
257 {
│ │ │ +
258 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]);
│ │ │ +
259 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x*w
│ │ │ +
260 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y*w
│ │ │ +
261 + h_*z*z + 2.0*i_*z*w
│ │ │ +
262 + j_*w*w;
│ │ │ +
263 }
│ │ │ +
│ │ │ +
264
│ │ │ +
265private:
│ │ │ +
266
│ │ │ +
267 Scalar a_, b_, c_, d_,
│ │ │ +
268 e_, f_, g_,
│ │ │ +
269 h_, i_,
│ │ │ +
270 j_;
│ │ │ +
271};
│ │ │ +
│ │ │ +
272
│ │ │ +
273
│ │ │ + │ │ │ +
276
│ │ │ + │ │ │ +
279
│ │ │
280
│ │ │ -
│ │ │ -
289 inline SmartVertexHandle split_copy(EdgeHandle _eh, const Point& _p)
│ │ │ -
290 {
│ │ │ -
291 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ -
292 const SmartVertexHandle vh = this->add_vertex(_p); Kernel::split_copy(_eh, vh); return vh;
│ │ │ -
293 }
│ │ │ -
│ │ │ -
294
│ │ │ -
│ │ │ -
302 inline void split(EdgeHandle _eh, VertexHandle _vh)
│ │ │ -
303 {
│ │ │ -
304 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ -
305 Kernel::split(_eh, _vh);
│ │ │ -
306 }
│ │ │ -
│ │ │ -
307
│ │ │ -
│ │ │ -
315 inline void split_copy(EdgeHandle _eh, VertexHandle _vh)
│ │ │ -
316 {
│ │ │ -
317 //Do not call PolyMeshT function below as this does the wrong operation
│ │ │ -
318 Kernel::split_copy(_eh, _vh);
│ │ │ -
319 }
│ │ │ -
│ │ │ -
320
│ │ │ -
│ │ │ -
330 inline SmartVertexHandle split(FaceHandle _fh, const Point& _p)
│ │ │ -
331 { const SmartVertexHandle vh = this->add_vertex(_p); PolyMesh::split(_fh, vh); return vh; }
│ │ │ -
│ │ │ -
332
│ │ │ -
│ │ │ -
342 inline SmartVertexHandle split_copy(FaceHandle _fh, const Point& _p)
│ │ │ -
343 { const SmartVertexHandle vh = this->add_vertex(_p); PolyMesh::split_copy(_fh, vh); return vh; }
│ │ │ -
│ │ │ -
344
│ │ │ -
345
│ │ │ -
│ │ │ -
350 inline void split(FaceHandle _fh)
│ │ │ -
351 {
│ │ │ -
352 // Collect halfedges of face
│ │ │ -
353 HalfedgeHandle he0 = this->halfedge_handle(_fh);
│ │ │ -
354 HalfedgeHandle he1 = this->next_halfedge_handle(he0);
│ │ │ -
355 HalfedgeHandle he2 = this->next_halfedge_handle(he1);
│ │ │ -
356
│ │ │ -
357 EdgeHandle eh0 = this->edge_handle(he0);
│ │ │ -
358 EdgeHandle eh1 = this->edge_handle(he1);
│ │ │ -
359 EdgeHandle eh2 = this->edge_handle(he2);
│ │ │ -
360
│ │ │ -
361 // Collect points of face
│ │ │ -
362 VertexHandle p0 = this->to_vertex_handle(he0);
│ │ │ -
363 VertexHandle p1 = this->to_vertex_handle(he1);
│ │ │ -
364 VertexHandle p2 = this->to_vertex_handle(he2);
│ │ │ -
365
│ │ │ -
366 // Calculate midpoint coordinates
│ │ │ -
367 const Point new0 = (this->point(p0) + this->point(p2)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
│ │ │ -
368 const Point new1 = (this->point(p0) + this->point(p1)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
│ │ │ -
369 const Point new2 = (this->point(p1) + this->point(p2)) * static_cast<typename vector_traits<Point>::value_type >(0.5);
│ │ │ -
370
│ │ │ -
371 // Add vertices at midpoint coordinates
│ │ │ -
372 VertexHandle v0 = this->add_vertex(new0);
│ │ │ -
373 VertexHandle v1 = this->add_vertex(new1);
│ │ │ -
374 VertexHandle v2 = this->add_vertex(new2);
│ │ │ -
375
│ │ │ -
376 const bool split0 = !this->is_boundary(eh0);
│ │ │ -
377 const bool split1 = !this->is_boundary(eh1);
│ │ │ -
378 const bool split2 = !this->is_boundary(eh2);
│ │ │ -
379
│ │ │ -
380 // delete original face
│ │ │ -
381 this->delete_face(_fh);
│ │ │ -
382
│ │ │ -
383 // split boundary edges of deleted face ( if not boundary )
│ │ │ -
384 if ( split0 ) {
│ │ │ -
385 this->split(eh0,v0);
│ │ │ -
386 }
│ │ │ -
387
│ │ │ -
388 if ( split1 ) {
│ │ │ -
389 this->split(eh1,v1);
│ │ │ -
390 }
│ │ │ -
391
│ │ │ -
392 if ( split2 ) {
│ │ │ -
393 this->split(eh2,v2);
│ │ │ -
394 }
│ │ │ -
395
│ │ │ -
396 // Retriangulate
│ │ │ -
397 this->add_face(v0 , p0, v1);
│ │ │ -
398 this->add_face(p2, v0 , v2);
│ │ │ -
399 this->add_face(v2,v1,p1);
│ │ │ -
400 this->add_face(v2 , v0, v1);
│ │ │ -
401 }
│ │ │ -
│ │ │ -
402
│ │ │ -
│ │ │ -
410 inline void split(FaceHandle _fh, VertexHandle _vh)
│ │ │ -
411 { PolyMesh::split(_fh, _vh); }
│ │ │ -
│ │ │ -
412
│ │ │ -
│ │ │ -
420 inline void split_copy(FaceHandle _fh, VertexHandle _vh)
│ │ │ -
421 { PolyMesh::split_copy(_fh, _vh); }
│ │ │ -
│ │ │ -
422
│ │ │ -
│ │ │ -
427 Scalar calc_face_area(FaceHandle _fh) const
│ │ │ -
428 {
│ │ │ -
429 const HalfedgeHandle heh = this->halfedge_handle(_fh);
│ │ │ -
430 return this->calc_sector_area(heh);
│ │ │ -
431 }
│ │ │ -
│ │ │ -
432
│ │ │ -
436
│ │ │ -
438 Normal calc_face_normal(FaceHandle _fh) const;
│ │ │ -
439
│ │ │ -
441};
│ │ │ -
│ │ │ -
442
│ │ │ -
443
│ │ │ -
444//=============================================================================
│ │ │ -
445} // namespace OpenMesh
│ │ │ -
446//=============================================================================
│ │ │ -
447#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C)
│ │ │ -
448#define OPENMESH_TRIMESH_TEMPLATES
│ │ │ -
449#include "TriMeshT_impl.hh"
│ │ │ -
450#endif
│ │ │ -
451//=============================================================================
│ │ │ -
452#endif // OPENMESH_TRIMESH_HH defined
│ │ │ -
453//=============================================================================
│ │ │ +
281//=============================================================================
│ │ │ +
282} // END_NS_GEOMETRY
│ │ │ +
283} // END_NS_OPENMESH
│ │ │ +
284//============================================================================
│ │ │ +
285#endif // OPENMESH_GEOMETRY_HH defined
│ │ │ +
286//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Handle for a face entity.
Definition Handles.hh:142
│ │ │ -
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ -
Base type for a polygonal mesh.
Definition PolyMeshT.hh:91
│ │ │ -
Kernel::Vertex Vertex
Vertex type.
Definition PolyMeshT.hh:124
│ │ │ -
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition PolyMeshT.hh:169
│ │ │ -
Kernel::ConstFaceIter ConstFaceIter
Scalar type.
Definition PolyMeshT.hh:151
│ │ │ -
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ -
Kernel::Scalar Scalar
Scalar type.
Definition PolyMeshT.hh:110
│ │ │ -
Kernel::ConstVertexVertexIter ConstVertexVertexIter
Circulator.
Definition PolyMeshT.hh:172
│ │ │ -
Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:178
│ │ │ -
Kernel::EdgeHandle EdgeHandle
Scalar type.
Definition PolyMeshT.hh:138
│ │ │ -
Kernel::VertexFaceIter VertexFaceIter
Circulator.
Definition PolyMeshT.hh:166
│ │ │ -
Kernel::ConstFaceVertexIter ConstFaceVertexIter
Circulator.
Definition PolyMeshT.hh:177
│ │ │ -
Kernel::Halfedge Halfedge
Halfedge type.
Definition PolyMeshT.hh:126
│ │ │ -
Kernel::FaceIter FaceIter
Scalar type.
Definition PolyMeshT.hh:146
│ │ │ -
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ -
Kernel::FaceVertexIter FaceVertexIter
Circulator.
Definition PolyMeshT.hh:167
│ │ │ -
Kernel::VertexIHalfedgeIter VertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:164
│ │ │ -
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition PolyMeshT.hh:120
│ │ │ -
Scalar calc_sector_area(HalfedgeHandle _in_heh) const
calculates the area of the face sector defined by the angle <(_in_heh,next_halfedge(_in_heh)) NOTE: s...
Definition PolyMeshT.hh:524
│ │ │ -
Kernel::ConstFaceEdgeIter ConstFaceEdgeIter
Circulator.
Definition PolyMeshT.hh:179
│ │ │ -
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition PolyMeshT.hh:122
│ │ │ -
Kernel::ConstVertexFaceIter ConstVertexFaceIter
Circulator.
Definition PolyMeshT.hh:176
│ │ │ -
Kernel::VertexOHalfedgeIter VertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:163
│ │ │ -
Kernel::VertexEdgeIter VertexEdgeIter
Circulator.
Definition PolyMeshT.hh:165
│ │ │ -
Kernel::Face Face
Face type.
Definition PolyMeshT.hh:130
│ │ │ -
Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter
Circulator.
Definition PolyMeshT.hh:174
│ │ │ -
Kernel::FaceFaceIter FaceFaceIter
Circulator.
Definition PolyMeshT.hh:170
│ │ │ -
Kernel::ConstVertexEdgeIter ConstVertexEdgeIter
Circulator.
Definition PolyMeshT.hh:175
│ │ │ -
SmartVertexHandle add_vertex(const Point _p)
Alias for new_vertex(const Point&).
Definition PolyMeshT.hh:238
│ │ │ -
Kernel::Edge Edge
Edge type.
Definition PolyMeshT.hh:128
│ │ │ -
Kernel::FaceHandle FaceHandle
Scalar type.
Definition PolyMeshT.hh:139
│ │ │ -
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ -
Kernel::EdgeIter EdgeIter
Scalar type.
Definition PolyMeshT.hh:145
│ │ │ -
Kernel::ConstEdgeIter ConstEdgeIter
Scalar type.
Definition PolyMeshT.hh:150
│ │ │ -
Kernel::ConstVertexIter ConstVertexIter
Scalar type.
Definition PolyMeshT.hh:148
│ │ │ -
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition PolyMeshT.hh:173
│ │ │ -
Kernel::VertexVertexIter VertexVertexIter
Circulator.
Definition PolyMeshT.hh:162
│ │ │ -
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:168
│ │ │ -
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ -
Kernel::ConstFaceFaceIter ConstFaceFaceIter
Circulator.
Definition PolyMeshT.hh:180
│ │ │ -
void split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-n split)
Definition PolyMeshT.hh:589
│ │ │ -
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │ -
Kernel::TexCoord1D TexCoord1D
TexCoord1D type.
Definition PolyMeshT.hh:118
│ │ │ -
Kernel::VertexIter VertexIter
Scalar type.
Definition PolyMeshT.hh:143
│ │ │ -
Smart version of VertexHandle contains a pointer to the corresponding mesh and allows easier access t...
Definition SmartHandles.hh:110
│ │ │ -
Base type for a triangle mesh.
Definition TriMeshT.hh:92
│ │ │ -
void split(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:302
│ │ │ -
void split(FaceHandle _fh)
Face split (= 1-to-4) split, splits edges at midpoints and adds 4 new faces in the interior).
Definition TriMeshT.hh:350
│ │ │ -
TriMeshT()
Default constructor.
Definition TriMeshT.hh:168
│ │ │ -
void split(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:410
│ │ │ -
Normal calc_face_normal(FaceHandle _fh) const
Calculate normal vector for face _fh (specialized for TriMesh).
Definition TriMeshT_impl.hh:74
│ │ │ -
SmartVertexHandle split(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:275
│ │ │ -
HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
Definition TriMeshT.hh:218
│ │ │ -
static constexpr bool is_polymesh()
Determine whether this is a PolyMeshT or TriMeshT (This function does not check the per face vertex c...
Definition TriMeshT.hh:103
│ │ │ -
Scalar calc_face_area(FaceHandle _fh) const
Calculates the area of a face.
Definition TriMeshT.hh:427
│ │ │ -
SmartVertexHandle split(FaceHandle _fh, const Point &_p)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:330
│ │ │ -
virtual ~TriMeshT()
Destructor.
Definition TriMeshT.hh:174
│ │ │ -
void split_copy(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:420
│ │ │ -
SmartVertexHandle split_copy(FaceHandle _fh, const Point &_p)
Face split (= 1-to-3 split, calls corresponding PolyMeshT function).
Definition TriMeshT.hh:342
│ │ │ -
HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1, VertexHandle _vl, VertexHandle _vr)
Vertex Split: inverse operation to collapse().
Definition TriMeshT.hh:262
│ │ │ -
void split_copy(EdgeHandle _eh, VertexHandle _vh)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:315
│ │ │ -
SmartVertexHandle split_copy(EdgeHandle _eh, const Point &_p)
Edge split (= 2-to-4 split)
Definition TriMeshT.hh:289
│ │ │ -
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │ +
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ +
/class QuadricT Geometry/QuadricT.hh
Definition QuadricT.hh:83
│ │ │ +
_Vec4 operator*(const _Vec4 &_v) const
multiply 4D vector from right: Q*v
Definition QuadricT.hh:203
│ │ │ +
void clear()
set all entries to zero
Definition QuadricT.hh:166
│ │ │ +
Scalar evaluate(const _Vec4 &_v, GenProg::Int2Type< 4 >) const
evaluate quadric Q at 4D vector v: v*Q*v
Definition QuadricT.hh:256
│ │ │ +
QuadricT< Scalar > & operator+=(const QuadricT< Scalar > &_q)
add quadrics
Definition QuadricT.hh:169
│ │ │ +
Scalar evaluate(const _Vec3 &_v, GenProg::Int2Type< 3 >) const
evaluate quadric Q at 3D vector v: v*Q*v
Definition QuadricT.hh:245
│ │ │ +
QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d, Scalar _e, Scalar _f, Scalar _g, Scalar _h, Scalar _i, Scalar _j)
construct with upper triangle of symmetrix 4x4 matrix
Definition QuadricT.hh:94
│ │ │ +
QuadricT< Scalar > & operator*=(Scalar _s)
multiply by scalar
Definition QuadricT.hh:186
│ │ │ +
Scalar operator()(const _Vec &_v) const
evaluate quadric Q at (3D or 4D) vector v: v*Q*v
Definition QuadricT.hh:214
│ │ │ +
QuadricT(Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0)
constructor from given plane equation: ax+by+cz+d_=0
Definition QuadricT.hh:107
│ │ │ +
Helper class providing information about a vector type.
Definition vector_traits.hh:89
│ │ │ + │ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,13 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -TriMeshT.hh │ │ │ │ +QuadricT.hh │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -48,523 +49,292 @@ │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ -45// │ │ │ │ +45 │ │ │ │ +50// │ │ │ │ ============================================================================= │ │ │ │ -46// │ │ │ │ -47// CLASS TriMeshT │ │ │ │ -48// │ │ │ │ -49// │ │ │ │ +51// │ │ │ │ +52// CLASS QuadricT │ │ │ │ +53// │ │ │ │ +54// │ │ │ │ ============================================================================= │ │ │ │ -50 │ │ │ │ -51 │ │ │ │ -52#ifndef OPENMESH_TRIMESH_HH │ │ │ │ -53#define OPENMESH_TRIMESH_HH │ │ │ │ -54 │ │ │ │ 55 │ │ │ │ -56//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -57 │ │ │ │ +56#ifndef OPENMESH_GEOMETRY_QUADRIC_HH │ │ │ │ +57#define OPENMESH_GEOMETRY_QUADRIC_HH │ │ │ │ 58 │ │ │ │ -59#include │ │ │ │ -60#include │ │ │ │ -61#include │ │ │ │ -62#include │ │ │ │ -63 │ │ │ │ -64 │ │ │ │ -65//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -66 │ │ │ │ +59 │ │ │ │ +60//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +61 │ │ │ │ +62#include "_C_o_n_f_i_g_._h_h" │ │ │ │ +63#include │ │ │ │ +64#include │ │ │ │ +65 │ │ │ │ +66//== NAMESPACE │ │ │ │ +================================================================ │ │ │ │ 67 │ │ │ │ -68namespace _O_p_e_n_M_e_s_h { │ │ │ │ -69 │ │ │ │ +68namespace _O_p_e_n_M_e_s_h { //BEGIN_NS_OPENMESH │ │ │ │ +69namespace Geometry { //BEGIN_NS_GEOMETRY │ │ │ │ 70 │ │ │ │ -71//== CLASS DEFINITION │ │ │ │ +71 │ │ │ │ +72//== CLASS DEFINITION │ │ │ │ ========================================================= │ │ │ │ -72 │ │ │ │ 73 │ │ │ │ -90template │ │ │ │ -_9_1class _T_r_i_M_e_s_h_T : public _P_o_l_y_M_e_s_h_T │ │ │ │ -92{ │ │ │ │ -93 │ │ │ │ -94public: │ │ │ │ -95 │ │ │ │ -96 │ │ │ │ -97 // self │ │ │ │ -98 typedef _T_r_i_M_e_s_h_T_<_K_e_r_n_e_l_> _T_h_i_s; │ │ │ │ -99 typedef _P_o_l_y_M_e_s_h_T_<_K_e_r_n_e_l_> _P_o_l_y_M_e_s_h; │ │ │ │ -100 │ │ │ │ -102 │ │ │ │ -_1_0_3 static constexpr bool _i_s___p_o_l_y_m_e_s_h() { return false; } │ │ │ │ -104 static constexpr bool is_trimesh() { return true; } │ │ │ │ -105 using ConnectivityTag = TriConnectivityTag; │ │ │ │ -106 enum { IsPolyMesh = 0 }; │ │ │ │ -107 enum { IsTriMesh = 1 }; │ │ │ │ -109 │ │ │ │ -110 //--- items --- │ │ │ │ -111 │ │ │ │ -112 typedef typename _P_o_l_y_M_e_s_h_:_:_S_c_a_l_a_r Scalar; │ │ │ │ -113 typedef typename _P_o_l_y_M_e_s_h_:_:_P_o_i_n_t Point; │ │ │ │ -114 typedef typename _P_o_l_y_M_e_s_h_:_:_N_o_r_m_a_l Normal; │ │ │ │ -115 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_l_o_r Color; │ │ │ │ -116 typedef typename _P_o_l_y_M_e_s_h_:_:_T_e_x_C_o_o_r_d_1_D TexCoord1D; │ │ │ │ -117 typedef typename _P_o_l_y_M_e_s_h_:_:_T_e_x_C_o_o_r_d_2_D TexCoord2D; │ │ │ │ -118 typedef typename _P_o_l_y_M_e_s_h_:_:_T_e_x_C_o_o_r_d_3_D TexCoord3D; │ │ │ │ -119 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x Vertex; │ │ │ │ -120 typedef typename _P_o_l_y_M_e_s_h_:_:_H_a_l_f_e_d_g_e Halfedge; │ │ │ │ -121 typedef typename _P_o_l_y_M_e_s_h_:_:_E_d_g_e Edge; │ │ │ │ -122 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e Face; │ │ │ │ -123 │ │ │ │ -124 │ │ │ │ -125 //--- handles --- │ │ │ │ -126 │ │ │ │ -127 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e VertexHandle; │ │ │ │ -128 typedef typename _P_o_l_y_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e HalfedgeHandle; │ │ │ │ -129 typedef typename _P_o_l_y_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e EdgeHandle; │ │ │ │ -130 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e FaceHandle; │ │ │ │ -131 │ │ │ │ -132 │ │ │ │ -133 //--- iterators --- │ │ │ │ -134 │ │ │ │ -135 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_I_t_e_r VertexIter; │ │ │ │ -136 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r ConstVertexIter; │ │ │ │ -137 typedef typename _P_o_l_y_M_e_s_h_:_:_E_d_g_e_I_t_e_r EdgeIter; │ │ │ │ -138 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r ConstEdgeIter; │ │ │ │ -139 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_I_t_e_r FaceIter; │ │ │ │ -140 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r ConstFaceIter; │ │ │ │ -141 │ │ │ │ -142 │ │ │ │ -143 │ │ │ │ -144 //--- circulators --- │ │ │ │ -145 │ │ │ │ -146 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r VertexVertexIter; │ │ │ │ -147 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r VertexOHalfedgeIter; │ │ │ │ -148 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r VertexIHalfedgeIter; │ │ │ │ -149 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r VertexEdgeIter; │ │ │ │ -150 typedef typename _P_o_l_y_M_e_s_h_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r VertexFaceIter; │ │ │ │ -151 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r FaceVertexIter; │ │ │ │ -152 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r FaceHalfedgeIter; │ │ │ │ -153 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_E_d_g_e_I_t_e_r FaceEdgeIter; │ │ │ │ -154 typedef typename _P_o_l_y_M_e_s_h_:_:_F_a_c_e_F_a_c_e_I_t_e_r FaceFaceIter; │ │ │ │ -155 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r ConstVertexVertexIter; │ │ │ │ -156 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -ConstVertexOHalfedgeIter; │ │ │ │ -157 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -ConstVertexIHalfedgeIter; │ │ │ │ -158 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r ConstVertexEdgeIter; │ │ │ │ -159 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r ConstVertexFaceIter; │ │ │ │ -160 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r ConstFaceVertexIter; │ │ │ │ -161 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r ConstFaceHalfedgeIter; │ │ │ │ -162 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r ConstFaceEdgeIter; │ │ │ │ -163 typedef typename _P_o_l_y_M_e_s_h_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r ConstFaceFaceIter; │ │ │ │ +74 │ │ │ │ +81template │ │ │ │ +_8_2class _Q_u_a_d_r_i_c_T │ │ │ │ +83{ │ │ │ │ +84public: │ │ │ │ +85 typedef Scalar value_type; │ │ │ │ +86 typedef _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> _t_y_p_e; │ │ │ │ +87 typedef _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> _S_e_l_f; │ │ │ │ +88 // typedef VectorInterface > Vec3; │ │ │ │ +89 // typedef VectorInterface > Vec4; │ │ │ │ +90 //typedef Vector3Elem Vec3; │ │ │ │ +91 //typedef Vector4Elem Vec4; │ │ │ │ +92 │ │ │ │ +_9_4 _Q_u_a_d_r_i_c_T(Scalar _a, Scalar _b, Scalar _c, Scalar _d, │ │ │ │ +95 Scalar _e, Scalar _f, Scalar _g, │ │ │ │ +96 Scalar _h, Scalar _i, │ │ │ │ +97 Scalar _j) │ │ │ │ +98 : a_(_a), b_(_b), c_(_c), d_(_d), │ │ │ │ +99 e_(_e), f_(_f), g_(_g), │ │ │ │ +100 h_(_h), i_(_i), │ │ │ │ +101 j_(_j) │ │ │ │ +102 { │ │ │ │ +103 } │ │ │ │ +104 │ │ │ │ +105 │ │ │ │ +_1_0_7 _Q_u_a_d_r_i_c_T( Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0 ) │ │ │ │ +108 : a_(_a*_a), b_(_a*_b), c_(_a*_c), d_(_a*_d), │ │ │ │ +109 e_(_b*_b), f_(_b*_c), g_(_b*_d), │ │ │ │ +110 h_(_c*_c), i_(_c*_d), │ │ │ │ +111 j_(_d*_d) │ │ │ │ +112 {} │ │ │ │ +113 │ │ │ │ +114 template │ │ │ │ +115 explicit _Q_u_a_d_r_i_c_T(const _Point& _pt) │ │ │ │ +116 { │ │ │ │ +117 set_distance_to_point(_pt); │ │ │ │ +118 } │ │ │ │ +119 │ │ │ │ +120 template │ │ │ │ +121 QuadricT(const _Normal& _n, const _Point& _p) │ │ │ │ +122 { │ │ │ │ +123 set_distance_to_plane(_n,_p); │ │ │ │ +124 } │ │ │ │ +125 │ │ │ │ +126 //set operator │ │ │ │ +127 void set(Scalar _a, Scalar _b, Scalar _c, Scalar _d, │ │ │ │ +128 Scalar _e, Scalar _f, Scalar _g, │ │ │ │ +129 Scalar _h, Scalar _i, │ │ │ │ +130 Scalar _j) │ │ │ │ +131 { │ │ │ │ +132 a_ = _a; b_ = _b; c_ = _c; d_ = _d; │ │ │ │ +133 e_ = _e; f_ = _f; g_ = _g; │ │ │ │ +134 h_ = _h; i_ = _i; │ │ │ │ +135 j_ = _j; │ │ │ │ +136 } │ │ │ │ +137 │ │ │ │ +138 //sets the quadric representing the squared distance to _pt │ │ │ │ +139 template │ │ │ │ +140 void set_distance_to_point(const _Point& _pt) │ │ │ │ +141 { │ │ │ │ +142 set(1, 0, 0, -_pt[0], │ │ │ │ +143 1, 0, -_pt[1], │ │ │ │ +144 1, -_pt[2], │ │ │ │ +145 _d_o_t(_pt,_pt)); │ │ │ │ +146 } │ │ │ │ +147 │ │ │ │ +148 //sets the quadric representing the squared distance to the plane │ │ │ │ +[_a,_b,_c,_d] │ │ │ │ +149 void set_distance_to_plane(Scalar _a, Scalar _b, Scalar _c, Scalar _d) │ │ │ │ +150 { │ │ │ │ +151 a_ = _a*_a; b_ = _a*_b; c_ = _a*_c; d_ = _a*_d; │ │ │ │ +152 e_ = _b*_b; f_ = _b*_c; g_ = _b*_d; │ │ │ │ +153 h_ = _c*_c; i_ = _c*_d; │ │ │ │ +154 j_ = _d*_d; │ │ │ │ +155 } │ │ │ │ +156 │ │ │ │ +157 //sets the quadric representing the squared distance to the plane │ │ │ │ +158 //determined by the normal _n and the point _p │ │ │ │ +159 template │ │ │ │ +160 void set_distance_to_plane(const _Normal& _n, const _Point& _p) │ │ │ │ +161 { │ │ │ │ +162 set_distance_to_plane(_n[0], _n[1], _n[2], -_d_o_t(_n,_p)); │ │ │ │ +163 } │ │ │ │ 164 │ │ │ │ -165 // --- constructor/destructor │ │ │ │ -166 │ │ │ │ -_1_6_8 _T_r_i_M_e_s_h_T() : _P_o_l_y_M_e_s_h() {} │ │ │ │ -169 explicit _T_r_i_M_e_s_h_T(_P_o_l_y_M_e_s_h rhs) : _P_o_l_y_M_e_s_h((rhs.triangulate(), rhs)) │ │ │ │ +_1_6_6 void _c_l_e_a_r() { a_ = b_ = c_ = d_ = e_ = f_ = g_ = h_ = i_ = j_ = 0.0; } │ │ │ │ +167 │ │ │ │ +_1_6_9 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _o_p_e_r_a_t_o_r_+_=( const _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _q ) │ │ │ │ 170 { │ │ │ │ -171 } │ │ │ │ -172 │ │ │ │ -_1_7_4 virtual _~_T_r_i_M_e_s_h_T() {} │ │ │ │ -175 │ │ │ │ -176 //--- halfedge collapse / vertex split --- │ │ │ │ +171 a_ += _q.a_; b_ += _q.b_; c_ += _q.c_; d_ += _q.d_; │ │ │ │ +172 e_ += _q.e_; f_ += _q.f_; g_ += _q.g_; │ │ │ │ +173 h_ += _q.h_; i_ += _q.i_; │ │ │ │ +174 j_ += _q.j_; │ │ │ │ +175 return *this; │ │ │ │ +176 } │ │ │ │ 177 │ │ │ │ -_2_1_8 inline HalfedgeHandle _v_e_r_t_e_x___s_p_l_i_t(Point _v0_point, VertexHandle _v1, │ │ │ │ -219 VertexHandle _vl, VertexHandle _vr) │ │ │ │ -220 { return PolyMesh::vertex_split(this->_a_d_d___v_e_r_t_e_x(_v0_point), _v1, _vl, │ │ │ │ -_vr); } │ │ │ │ -221 │ │ │ │ -_2_6_2 inline HalfedgeHandle _v_e_r_t_e_x___s_p_l_i_t(VertexHandle _v0, VertexHandle _v1, │ │ │ │ -263 VertexHandle _vl, VertexHandle _vr) │ │ │ │ -264 { return PolyMesh::vertex_split(_v0, _v1, _vl, _vr); } │ │ │ │ -265 │ │ │ │ -_2_7_5 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t(EdgeHandle _eh, const Point& _p) │ │ │ │ -276 { │ │ │ │ -277 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ -278 const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); Kernel::split(_eh, vh); │ │ │ │ -return vh; │ │ │ │ -279 } │ │ │ │ +178 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> operator+(const _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _other ) const │ │ │ │ +179 { │ │ │ │ +180 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> result = *this; │ │ │ │ +181 return result += _other; │ │ │ │ +182 } │ │ │ │ +183 │ │ │ │ +184 │ │ │ │ +_1_8_6 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _o_p_e_r_a_t_o_r_*_=( Scalar _s) │ │ │ │ +187 { │ │ │ │ +188 a_ *= _s; b_ *= _s; c_ *= _s; d_ *= _s; │ │ │ │ +189 e_ *= _s; f_ *= _s; g_ *= _s; │ │ │ │ +190 h_ *= _s; i_ *= _s; │ │ │ │ +191 j_ *= _s; │ │ │ │ +192 return *this; │ │ │ │ +193 } │ │ │ │ +194 │ │ │ │ +195 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> operator*(Scalar _s) const │ │ │ │ +196 { │ │ │ │ +197 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> result = *this; │ │ │ │ +198 return result *= _s; │ │ │ │ +199 } │ │ │ │ +200 │ │ │ │ +202 template │ │ │ │ +_2_0_3 _Vec4 _o_p_e_r_a_t_o_r_*(const _Vec4& _v) const │ │ │ │ +204 { │ │ │ │ +205 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]); │ │ │ │ +206 return _Vec4(x*a_ + y*b_ + z*c_ + w*d_, │ │ │ │ +207 x*b_ + y*e_ + z*f_ + w*g_, │ │ │ │ +208 x*c_ + y*f_ + z*h_ + w*i_, │ │ │ │ +209 x*d_ + y*g_ + z*i_ + w*j_); │ │ │ │ +210 } │ │ │ │ +211 │ │ │ │ +213 template │ │ │ │ +_2_1_4 Scalar _o_p_e_r_a_t_o_r_(_)(const _Vec& _v) const │ │ │ │ +215 { │ │ │ │ +216 return _e_v_a_l_u_a_t_e(_v, GenProg::Int2Type<_v_e_c_t_o_r___t_r_a_i_t_s_<___V_e_c_>_:_:_s_i_z_e__>()); │ │ │ │ +217 } │ │ │ │ +218 │ │ │ │ +219 Scalar a() const { return a_; } │ │ │ │ +220 Scalar b() const { return b_; } │ │ │ │ +221 Scalar c() const { return c_; } │ │ │ │ +222 Scalar d() const { return d_; } │ │ │ │ +223 Scalar e() const { return e_; } │ │ │ │ +224 Scalar f() const { return f_; } │ │ │ │ +225 Scalar g() const { return g_; } │ │ │ │ +226 Scalar h() const { return h_; } │ │ │ │ +227 Scalar i() const { return i_; } │ │ │ │ +228 Scalar j() const { return j_; } │ │ │ │ +229 │ │ │ │ +230 Scalar xx() const { return a_; } │ │ │ │ +231 Scalar xy() const { return b_; } │ │ │ │ +232 Scalar xz() const { return c_; } │ │ │ │ +233 Scalar xw() const { return d_; } │ │ │ │ +234 Scalar yy() const { return e_; } │ │ │ │ +235 Scalar yz() const { return f_; } │ │ │ │ +236 Scalar yw() const { return g_; } │ │ │ │ +237 Scalar zz() const { return h_; } │ │ │ │ +238 Scalar zw() const { return i_; } │ │ │ │ +239 Scalar ww() const { return j_; } │ │ │ │ +240 │ │ │ │ +241protected: │ │ │ │ +242 │ │ │ │ +244 template │ │ │ │ +_2_4_5 Scalar _e_v_a_l_u_a_t_e(const _Vec3& _v, GenProg::Int2Type<3>/*_dimension*/) const │ │ │ │ +246 { │ │ │ │ +247 Scalar x(_v[0]), y(_v[1]), z(_v[2]); │ │ │ │ +248 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x │ │ │ │ +249 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y │ │ │ │ +250 + h_*z*z + 2.0*i_*z │ │ │ │ +251 + j_; │ │ │ │ +252 } │ │ │ │ +253 │ │ │ │ +255 template │ │ │ │ +_2_5_6 Scalar _e_v_a_l_u_a_t_e(const _Vec4& _v, GenProg::Int2Type<4>/*_dimension*/) const │ │ │ │ +257 { │ │ │ │ +258 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]); │ │ │ │ +259 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x*w │ │ │ │ +260 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y*w │ │ │ │ +261 + h_*z*z + 2.0*i_*z*w │ │ │ │ +262 + j_*w*w; │ │ │ │ +263 } │ │ │ │ +264 │ │ │ │ +265private: │ │ │ │ +266 │ │ │ │ +267 Scalar a_, b_, c_, d_, │ │ │ │ +268 e_, f_, g_, │ │ │ │ +269 h_, i_, │ │ │ │ +270 j_; │ │ │ │ +271}; │ │ │ │ +272 │ │ │ │ +273 │ │ │ │ +_2_7_5typedef _Q_u_a_d_r_i_c_T_<_f_l_o_a_t_> _Q_u_a_d_r_i_c_f; │ │ │ │ +276 │ │ │ │ +_2_7_8typedef _Q_u_a_d_r_i_c_T_<_d_o_u_b_l_e_> _Q_u_a_d_r_i_c_d; │ │ │ │ +279 │ │ │ │ 280 │ │ │ │ -_2_8_9 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t___c_o_p_y(EdgeHandle _eh, const Point& _p) │ │ │ │ -290 { │ │ │ │ -291 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ -292 const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); Kernel::split_copy(_eh, │ │ │ │ -vh); return vh; │ │ │ │ -293 } │ │ │ │ -294 │ │ │ │ -_3_0_2 inline void _s_p_l_i_t(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -303 { │ │ │ │ -304 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ -305 Kernel::split(_eh, _vh); │ │ │ │ -306 } │ │ │ │ -307 │ │ │ │ -_3_1_5 inline void _s_p_l_i_t___c_o_p_y(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -316 { │ │ │ │ -317 //Do not call PolyMeshT function below as this does the wrong operation │ │ │ │ -318 Kernel::split_copy(_eh, _vh); │ │ │ │ -319 } │ │ │ │ -320 │ │ │ │ -_3_3_0 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t(FaceHandle _fh, const Point& _p) │ │ │ │ -331 { const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); _P_o_l_y_M_e_s_h_:_:_s_p_l_i_t(_fh, │ │ │ │ -vh); return vh; } │ │ │ │ -332 │ │ │ │ -_3_4_2 inline _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e _s_p_l_i_t___c_o_p_y(FaceHandle _fh, const Point& _p) │ │ │ │ -343 { const _S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e vh = this->_a_d_d___v_e_r_t_e_x(_p); PolyMesh::split_copy │ │ │ │ -(_fh, vh); return vh; } │ │ │ │ -344 │ │ │ │ -345 │ │ │ │ -_3_5_0 inline void _s_p_l_i_t(FaceHandle _fh) │ │ │ │ -351 { │ │ │ │ -352 // Collect halfedges of face │ │ │ │ -353 HalfedgeHandle he0 = this->halfedge_handle(_fh); │ │ │ │ -354 HalfedgeHandle he1 = this->next_halfedge_handle(he0); │ │ │ │ -355 HalfedgeHandle he2 = this->next_halfedge_handle(he1); │ │ │ │ -356 │ │ │ │ -357 EdgeHandle eh0 = this->edge_handle(he0); │ │ │ │ -358 EdgeHandle eh1 = this->edge_handle(he1); │ │ │ │ -359 EdgeHandle eh2 = this->edge_handle(he2); │ │ │ │ -360 │ │ │ │ -361 // Collect points of face │ │ │ │ -362 VertexHandle p0 = this->to_vertex_handle(he0); │ │ │ │ -363 VertexHandle p1 = this->to_vertex_handle(he1); │ │ │ │ -364 VertexHandle p2 = this->to_vertex_handle(he2); │ │ │ │ -365 │ │ │ │ -366 // Calculate midpoint coordinates │ │ │ │ -367 const Point new0 = (this->point(p0) + this->point(p2)) * │ │ │ │ -static_cast_:_:_v_a_l_u_e___t_y_p_e >(0.5); │ │ │ │ -368 const Point new1 = (this->point(p0) + this->point(p1)) * │ │ │ │ -static_cast_:_:_v_a_l_u_e___t_y_p_e >(0.5); │ │ │ │ -369 const Point new2 = (this->point(p1) + this->point(p2)) * │ │ │ │ -static_cast_:_:_v_a_l_u_e___t_y_p_e >(0.5); │ │ │ │ -370 │ │ │ │ -371 // Add vertices at midpoint coordinates │ │ │ │ -372 VertexHandle v0 = this->_a_d_d___v_e_r_t_e_x(new0); │ │ │ │ -373 VertexHandle v1 = this->_a_d_d___v_e_r_t_e_x(new1); │ │ │ │ -374 VertexHandle v2 = this->_a_d_d___v_e_r_t_e_x(new2); │ │ │ │ -375 │ │ │ │ -376 const bool split0 = !this->is_boundary(eh0); │ │ │ │ -377 const bool split1 = !this->is_boundary(eh1); │ │ │ │ -378 const bool split2 = !this->is_boundary(eh2); │ │ │ │ -379 │ │ │ │ -380 // delete original face │ │ │ │ -381 this->delete_face(_fh); │ │ │ │ -382 │ │ │ │ -383 // split boundary edges of deleted face ( if not boundary ) │ │ │ │ -384 if ( split0 ) { │ │ │ │ -385 this->_s_p_l_i_t(eh0,v0); │ │ │ │ -386 } │ │ │ │ -387 │ │ │ │ -388 if ( split1 ) { │ │ │ │ -389 this->_s_p_l_i_t(eh1,v1); │ │ │ │ -390 } │ │ │ │ -391 │ │ │ │ -392 if ( split2 ) { │ │ │ │ -393 this->_s_p_l_i_t(eh2,v2); │ │ │ │ -394 } │ │ │ │ -395 │ │ │ │ -396 // Retriangulate │ │ │ │ -397 this->add_face(v0 , p0, v1); │ │ │ │ -398 this->add_face(p2, v0 , v2); │ │ │ │ -399 this->add_face(v2,v1,p1); │ │ │ │ -400 this->add_face(v2 , v0, v1); │ │ │ │ -401 } │ │ │ │ -402 │ │ │ │ -_4_1_0 inline void _s_p_l_i_t(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -411 { _P_o_l_y_M_e_s_h_:_:_s_p_l_i_t(_fh, _vh); } │ │ │ │ -412 │ │ │ │ -_4_2_0 inline void _s_p_l_i_t___c_o_p_y(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -421 { PolyMesh::split_copy(_fh, _vh); } │ │ │ │ -422 │ │ │ │ -_4_2_7 Scalar _c_a_l_c___f_a_c_e___a_r_e_a(FaceHandle _fh) const │ │ │ │ -428 { │ │ │ │ -429 const HalfedgeHandle heh = this->halfedge_handle(_fh); │ │ │ │ -430 return this->_c_a_l_c___s_e_c_t_o_r___a_r_e_a(heh); │ │ │ │ -431 } │ │ │ │ -432 │ │ │ │ -436 │ │ │ │ -438 Normal _c_a_l_c___f_a_c_e___n_o_r_m_a_l(_F_a_c_e_H_a_n_d_l_e _fh) const; │ │ │ │ -439 │ │ │ │ -441}; │ │ │ │ -442 │ │ │ │ -443 │ │ │ │ -444// │ │ │ │ -============================================================================= │ │ │ │ -445} // namespace OpenMesh │ │ │ │ -446// │ │ │ │ -============================================================================= │ │ │ │ -447#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_TRIMESH_C) │ │ │ │ -448#define OPENMESH_TRIMESH_TEMPLATES │ │ │ │ -449#include "TriMeshT_impl.hh" │ │ │ │ -450#endif │ │ │ │ -451// │ │ │ │ +281// │ │ │ │ ============================================================================= │ │ │ │ -452#endif // OPENMESH_TRIMESH_HH defined │ │ │ │ -453// │ │ │ │ +282} // END_NS_GEOMETRY │ │ │ │ +283} // END_NS_OPENMESH │ │ │ │ +284// │ │ │ │ +============================================================================ │ │ │ │ +285#endif // OPENMESH_GEOMETRY_HH defined │ │ │ │ +286// │ │ │ │ ============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Handle for a face entity. │ │ │ │ -DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ -Polygonal mesh based on the ArrayKernel. │ │ │ │ -DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T │ │ │ │ -Base type for a polygonal mesh. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:91 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x │ │ │ │ -Kernel::Vertex Vertex │ │ │ │ -Vertex type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:124 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::FaceEdgeIter FaceEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:169 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceIter ConstFaceIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:151 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Kernel::VertexHandle VertexHandle │ │ │ │ -Handle for referencing the corresponding item. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_S_c_a_l_a_r │ │ │ │ -Kernel::Scalar Scalar │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstVertexVertexIter ConstVertexVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:172 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceHalfedgeIter ConstFaceHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:178 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::EdgeHandle EdgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:138 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::VertexFaceIter VertexFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:166 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstFaceVertexIter ConstFaceVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:177 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e │ │ │ │ -Kernel::Halfedge Halfedge │ │ │ │ -Halfedge type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:126 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::FaceIter FaceIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:146 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ -Kernel::Normal Normal │ │ │ │ -Normal type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::FaceVertexIter FaceVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:167 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::VertexIHalfedgeIter VertexIHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:164 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ -Kernel::TexCoord2D TexCoord2D │ │ │ │ -TexCoord2D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:120 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_c_a_l_c___s_e_c_t_o_r___a_r_e_a │ │ │ │ -Scalar calc_sector_area(HalfedgeHandle _in_heh) const │ │ │ │ -calculates the area of the face sector defined by the angle < │ │ │ │ -(_in_heh,next_halfedge(_in_heh)) NOTE: s... │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:524 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceEdgeIter ConstFaceEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:179 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ -Kernel::TexCoord3D TexCoord3D │ │ │ │ -TexCoord3D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:122 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexFaceIter ConstVertexFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::VertexOHalfedgeIter VertexOHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:163 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::VertexEdgeIter VertexEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:165 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e │ │ │ │ -Kernel::Face Face │ │ │ │ -Face type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:130 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexIHalfedgeIter ConstVertexIHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:174 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::FaceFaceIter FaceFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:170 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexEdgeIter ConstVertexEdgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:175 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ -SmartVertexHandle add_vertex(const Point _p) │ │ │ │ -Alias for new_vertex(const Point&). │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:238 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e │ │ │ │ -Kernel::Edge Edge │ │ │ │ -Edge type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:128 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ -Kernel::FaceHandle FaceHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:139 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ -Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::EdgeIter EdgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:145 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_E_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstEdgeIter ConstEdgeIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:150 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::ConstVertexIter ConstVertexIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:148 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_V_e_r_t_e_x_O_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:173 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::VertexVertexIter VertexVertexIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:162 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ -Kernel::FaceHalfedgeIter FaceHalfedgeIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:168 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ -Kernel::Point Point │ │ │ │ -Coordinate type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_n_s_t_F_a_c_e_F_a_c_e_I_t_e_r │ │ │ │ -Kernel::ConstFaceFaceIter ConstFaceFaceIter │ │ │ │ -Circulator. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:180 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(FaceHandle _fh, const Point &_p) │ │ │ │ -Face split (= 1-to-n split) │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:589 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ -Kernel::Color Color │ │ │ │ -Color type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_1_D │ │ │ │ -Kernel::TexCoord1D TexCoord1D │ │ │ │ -TexCoord1D type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:118 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_I_t_e_r │ │ │ │ -Kernel::VertexIter VertexIter │ │ │ │ -Scalar type. │ │ │ │ -DDeeffiinniittiioonn PolyMeshT.hh:143 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_m_a_r_t_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ -Smart version of VertexHandle contains a pointer to the corresponding mesh and │ │ │ │ -allows easier access t... │ │ │ │ -DDeeffiinniittiioonn SmartHandles.hh:110 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T │ │ │ │ -Base type for a triangle mesh. │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:92 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -Edge split (= 2-to-4 split) │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:302 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(FaceHandle _fh) │ │ │ │ -Face split (= 1-to-4) split, splits edges at midpoints and adds 4 new faces in │ │ │ │ -the interior). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:350 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_T_r_i_M_e_s_h_T │ │ │ │ -TriMeshT() │ │ │ │ -Default constructor. │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:168 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -void split(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:410 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___n_o_r_m_a_l │ │ │ │ -Normal calc_face_normal(FaceHandle _fh) const │ │ │ │ -Calculate normal vector for face _fh (specialized for TriMesh). │ │ │ │ -DDeeffiinniittiioonn TriMeshT_impl.hh:74 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -SmartVertexHandle split(EdgeHandle _eh, const Point &_p) │ │ │ │ -Edge split (= 2-to-4 split) │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:275 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_v_e_r_t_e_x___s_p_l_i_t │ │ │ │ -HalfedgeHandle vertex_split(Point _v0_point, VertexHandle _v1, VertexHandle │ │ │ │ -_vl, VertexHandle _vr) │ │ │ │ -Vertex Split: inverse operation to collapse(). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:218 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_i_s___p_o_l_y_m_e_s_h │ │ │ │ -static constexpr bool is_polymesh() │ │ │ │ -Determine whether this is a PolyMeshT or TriMeshT (This function does not check │ │ │ │ -the per face vertex c... │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:103 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_c_a_l_c___f_a_c_e___a_r_e_a │ │ │ │ -Scalar calc_face_area(FaceHandle _fh) const │ │ │ │ -Calculates the area of a face. │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:427 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t │ │ │ │ -SmartVertexHandle split(FaceHandle _fh, const Point &_p) │ │ │ │ -Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:330 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_~_T_r_i_M_e_s_h_T │ │ │ │ -virtual ~TriMeshT() │ │ │ │ -Destructor. │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:174 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ -void split_copy(FaceHandle _fh, VertexHandle _vh) │ │ │ │ -Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:420 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ -SmartVertexHandle split_copy(FaceHandle _fh, const Point &_p) │ │ │ │ -Face split (= 1-to-3 split, calls corresponding PolyMeshT function). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:342 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_v_e_r_t_e_x___s_p_l_i_t │ │ │ │ -HalfedgeHandle vertex_split(VertexHandle _v0, VertexHandle _v1, VertexHandle │ │ │ │ -_vl, VertexHandle _vr) │ │ │ │ -Vertex Split: inverse operation to collapse(). │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:262 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ -void split_copy(EdgeHandle _eh, VertexHandle _vh) │ │ │ │ -Edge split (= 2-to-4 split) │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:315 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_T_r_i_M_e_s_h_T_:_:_s_p_l_i_t___c_o_p_y │ │ │ │ -SmartVertexHandle split_copy(EdgeHandle _eh, const Point &_p) │ │ │ │ -Edge split (= 2-to-4 split) │ │ │ │ -DDeeffiinniittiioonn TriMeshT.hh:289 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -T::value_type value_type │ │ │ │ -Type of the scalar value. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ +osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ +Adapter for osg vector member computing a scalar product. │ │ │ │ +DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T │ │ │ │ +/class QuadricT Geometry/QuadricT.hh │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:83 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +_Vec4 operator*(const _Vec4 &_v) const │ │ │ │ +multiply 4D vector from right: Q*v │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:203 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_c_l_e_a_r │ │ │ │ +void clear() │ │ │ │ +set all entries to zero │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:166 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_e_v_a_l_u_a_t_e │ │ │ │ +Scalar evaluate(const _Vec4 &_v, GenProg::Int2Type< 4 >) const │ │ │ │ +evaluate quadric Q at 4D vector v: v*Q*v │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:256 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ +QuadricT< Scalar > & operator+=(const QuadricT< Scalar > &_q) │ │ │ │ +add quadrics │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_e_v_a_l_u_a_t_e │ │ │ │ +Scalar evaluate(const _Vec3 &_v, GenProg::Int2Type< 3 >) const │ │ │ │ +evaluate quadric Q at 3D vector v: v*Q*v │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:245 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_Q_u_a_d_r_i_c_T │ │ │ │ +QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d, Scalar _e, Scalar _f, │ │ │ │ +Scalar _g, Scalar _h, Scalar _i, Scalar _j) │ │ │ │ +construct with upper triangle of symmetrix 4x4 matrix │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ +QuadricT< Scalar > & operator*=(Scalar _s) │ │ │ │ +multiply by scalar │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:186 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ +Scalar operator()(const _Vec &_v) const │ │ │ │ +evaluate quadric Q at (3D or 4D) vector v: v*Q*v │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:214 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_Q_u_a_d_r_i_c_T │ │ │ │ +QuadricT(Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0) │ │ │ │ +constructor from given plane equation: ax+by+cz+d_=0 │ │ │ │ +DDeeffiinniittiioonn QuadricT.hh:107 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s │ │ │ │ +Helper class providing information about a vector type. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:89 │ │ │ │ +_C_o_n_f_i_g_._h_h │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00755_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Mesh/Casts.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/NormalConeT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
Casts.hh
│ │ │ +
NormalConeT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -137,45 +137,93 @@ │ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │ -
43
│ │ │ -
44#ifndef OPENMESH_CASTS_HH
│ │ │ -
45#define OPENMESH_CASTS_HH
│ │ │ -
46//== INCLUDES =================================================================
│ │ │ -
47
│ │ │ -
48#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
│ │ │ -
49#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
│ │ │ -
50
│ │ │ -
51//== NAMESPACES ===============================================================
│ │ │ -
52namespace OpenMesh
│ │ │ -
53{
│ │ │ -
54
│ │ │ -
55template <class Traits>
│ │ │ -
56inline TriMesh_ArrayKernelT<Traits>& TRIMESH_CAST(PolyMesh_ArrayKernelT<Traits>& _poly_mesh)
│ │ │ -
57{ return reinterpret_cast< TriMesh_ArrayKernelT<Traits>& >(_poly_mesh); }
│ │ │ -
58
│ │ │ -
59template <class Traits>
│ │ │ -
60inline const TriMesh_ArrayKernelT<Traits>& TRIMESH_CAST(const PolyMesh_ArrayKernelT<Traits>& _poly_mesh)
│ │ │ -
61{ return reinterpret_cast< const TriMesh_ArrayKernelT<Traits>& >(_poly_mesh); }
│ │ │ +
43//=============================================================================
│ │ │ +
44//
│ │ │ +
45// CLASS NormalCone
│ │ │ +
46//
│ │ │ +
47//=============================================================================
│ │ │ +
48
│ │ │ +
49
│ │ │ +
50#ifndef OPENMESH_NORMALCONE_HH
│ │ │ +
51#define OPENMESH_NORMALCONE_HH
│ │ │ +
52
│ │ │ +
53
│ │ │ +
54//== INCLUDES =================================================================
│ │ │ +
55
│ │ │ +
56
│ │ │ +
57#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ +
58#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ +
59
│ │ │ +
60
│ │ │ +
61//== NAMESPACES ===============================================================
│ │ │
62
│ │ │ -
63template <class Traits>
│ │ │ -
64inline PolyMesh_ArrayKernelT<Traits>& POLYMESH_CAST(TriMesh_ArrayKernelT<Traits>& _tri_mesh)
│ │ │ -
65{ return reinterpret_cast< PolyMesh_ArrayKernelT<Traits>& >(_tri_mesh); }
│ │ │ +
63
│ │ │ +
64namespace OpenMesh {
│ │ │ +
65
│ │ │
66
│ │ │ -
67template <class Traits>
│ │ │ -
68inline const PolyMesh_ArrayKernelT<Traits>& POLYMESH_CAST(const TriMesh_ArrayKernelT<Traits>& _tri_mesh)
│ │ │ -
69{ return reinterpret_cast< const PolyMesh_ArrayKernelT<Traits>& >(_tri_mesh); }
│ │ │ -
70
│ │ │ -
71};
│ │ │ -
72#endif//OPENMESH_CASTS_HH
│ │ │ +
67//== CLASS DEFINITION =========================================================
│ │ │ +
68
│ │ │ +
69
│ │ │ +
76template <typename Vector>
│ │ │ +
│ │ │ + │ │ │ +
78{
│ │ │ +
79public:
│ │ │ +
80
│ │ │ +
81 // typedefs
│ │ │ +
82 typedef typename vector_traits<Vector>::value_type Scalar;
│ │ │ +
83 typedef Vector Vec3;
│ │ │ +
84
│ │ │ +
85
│ │ │ +
87 NormalConeT() : angle_(0.0) {}
│ │ │ +
88
│ │ │ +
90 explicit NormalConeT(const Vec3& _center_normal, Scalar _angle=0.0);
│ │ │ +
91
│ │ │ +
93 Scalar max_angle(const Vec3&) const;
│ │ │ +
94
│ │ │ +
96 Scalar max_angle(const NormalConeT&) const;
│ │ │ +
97
│ │ │ +
99 void merge(const NormalConeT&);
│ │ │ +
100
│ │ │ +
102 const Vec3& center_normal() const { return center_normal_; }
│ │ │ +
103
│ │ │ +
105 inline Scalar angle() const { return angle_; }
│ │ │ +
106
│ │ │ +
107private:
│ │ │ +
108
│ │ │ +
109 Vec3 center_normal_;
│ │ │ +
110 Scalar angle_;
│ │ │ +
111};
│ │ │ +
│ │ │ +
112
│ │ │ +
113
│ │ │ +
114//=============================================================================
│ │ │ +
115} // namespace OpenMesh
│ │ │ +
116//=============================================================================
│ │ │ +
117#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C)
│ │ │ +
118#define OPENMESH_NORMALCONE_TEMPLATES
│ │ │ +
119#include "NormalConeT_impl.hh"
│ │ │ +
120#endif
│ │ │ +
121//=============================================================================
│ │ │ +
122#endif // OPENMESH_NORMALCONE_HH defined
│ │ │ +
123//=============================================================================
│ │ │ +
124
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
/class NormalCone NormalCone.hh <OpenMesh/Core/Geometry/NormalConeT.hh>
Definition NormalConeT.hh:78
│ │ │ +
void merge(const NormalConeT &)
merge _cone; this instance will then enclose both former cones
Definition NormalConeT_impl.hh:118
│ │ │ +
Scalar max_angle(const Vec3 &) const
return max. distance (radians) unit vector to cone (distant side)
Definition NormalConeT_impl.hh:87
│ │ │ +
Scalar angle() const
returns size of cone (radius in radians)
Definition NormalConeT.hh:105
│ │ │ +
const Vec3 & center_normal() const
returns center normal
Definition NormalConeT.hh:102
│ │ │ +
NormalConeT()
default constructor (not initialized)
Definition NormalConeT.hh:87
│ │ │ +
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -Casts.hh │ │ │ │ +NormalConeT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -46,52 +46,119 @@ │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ -43 │ │ │ │ -44#ifndef OPENMESH_CASTS_HH │ │ │ │ -45#define OPENMESH_CASTS_HH │ │ │ │ -46//== INCLUDES │ │ │ │ +43// │ │ │ │ +============================================================================= │ │ │ │ +44// │ │ │ │ +45// CLASS NormalCone │ │ │ │ +46// │ │ │ │ +47// │ │ │ │ +============================================================================= │ │ │ │ +48 │ │ │ │ +49 │ │ │ │ +50#ifndef OPENMESH_NORMALCONE_HH │ │ │ │ +51#define OPENMESH_NORMALCONE_HH │ │ │ │ +52 │ │ │ │ +53 │ │ │ │ +54//== INCLUDES │ │ │ │ ================================================================= │ │ │ │ -47 │ │ │ │ -48#include │ │ │ │ -49#include │ │ │ │ -50 │ │ │ │ -51//== NAMESPACES │ │ │ │ +55 │ │ │ │ +56 │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +61//== NAMESPACES │ │ │ │ =============================================================== │ │ │ │ -52namespace _O_p_e_n_M_e_s_h │ │ │ │ -53{ │ │ │ │ -54 │ │ │ │ -55template │ │ │ │ -56inline TriMesh_ArrayKernelT& TRIMESH_CAST │ │ │ │ -(PolyMesh_ArrayKernelT& _poly_mesh) │ │ │ │ -57{ return reinterpret_cast< TriMesh_ArrayKernelT& >(_poly_mesh); } │ │ │ │ -58 │ │ │ │ -59template │ │ │ │ -60inline const TriMesh_ArrayKernelT& TRIMESH_CAST(const │ │ │ │ -PolyMesh_ArrayKernelT& _poly_mesh) │ │ │ │ -61{ return reinterpret_cast< const TriMesh_ArrayKernelT& >(_poly_mesh); │ │ │ │ -} │ │ │ │ 62 │ │ │ │ -63template │ │ │ │ -64inline PolyMesh_ArrayKernelT& POLYMESH_CAST │ │ │ │ -(TriMesh_ArrayKernelT& _tri_mesh) │ │ │ │ -65{ return reinterpret_cast< PolyMesh_ArrayKernelT& >(_tri_mesh); } │ │ │ │ +63 │ │ │ │ +64namespace _O_p_e_n_M_e_s_h { │ │ │ │ +65 │ │ │ │ 66 │ │ │ │ -67template │ │ │ │ -68inline const PolyMesh_ArrayKernelT& POLYMESH_CAST(const │ │ │ │ -TriMesh_ArrayKernelT& _tri_mesh) │ │ │ │ -69{ return reinterpret_cast< const PolyMesh_ArrayKernelT& >(_tri_mesh); │ │ │ │ -} │ │ │ │ -70 │ │ │ │ -71}; │ │ │ │ -72#endif//OPENMESH_CASTS_HH │ │ │ │ +67//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +76template │ │ │ │ +_7_7class _N_o_r_m_a_l_C_o_n_e_T │ │ │ │ +78{ │ │ │ │ +79public: │ │ │ │ +80 │ │ │ │ +81 // typedefs │ │ │ │ +82 typedef typename _v_e_c_t_o_r___t_r_a_i_t_s_<_V_e_c_t_o_r_>_:_:_v_a_l_u_e___t_y_p_e Scalar; │ │ │ │ +83 typedef Vector Vec3; │ │ │ │ +84 │ │ │ │ +85 │ │ │ │ +_8_7 _N_o_r_m_a_l_C_o_n_e_T() : angle_(0.0) {} │ │ │ │ +88 │ │ │ │ +90 explicit _N_o_r_m_a_l_C_o_n_e_T(const Vec3& _center_normal, Scalar _angle=0.0); │ │ │ │ +91 │ │ │ │ +93 Scalar _m_a_x___a_n_g_l_e(const Vec3&) const; │ │ │ │ +94 │ │ │ │ +96 Scalar _m_a_x___a_n_g_l_e(const _N_o_r_m_a_l_C_o_n_e_T&) const; │ │ │ │ +97 │ │ │ │ +99 void _m_e_r_g_e(const _N_o_r_m_a_l_C_o_n_e_T&); │ │ │ │ +100 │ │ │ │ +_1_0_2 const Vec3& _c_e_n_t_e_r___n_o_r_m_a_l() const { return center_normal_; } │ │ │ │ +103 │ │ │ │ +_1_0_5 inline Scalar _a_n_g_l_e() const { return angle_; } │ │ │ │ +106 │ │ │ │ +107private: │ │ │ │ +108 │ │ │ │ +109 Vec3 center_normal_; │ │ │ │ +110 Scalar angle_; │ │ │ │ +111}; │ │ │ │ +112 │ │ │ │ +113 │ │ │ │ +114// │ │ │ │ +============================================================================= │ │ │ │ +115} // namespace OpenMesh │ │ │ │ +116// │ │ │ │ +============================================================================= │ │ │ │ +117#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C) │ │ │ │ +118#define OPENMESH_NORMALCONE_TEMPLATES │ │ │ │ +119#include "NormalConeT_impl.hh" │ │ │ │ +120#endif │ │ │ │ +121// │ │ │ │ +============================================================================= │ │ │ │ +122#endif // OPENMESH_NORMALCONE_HH defined │ │ │ │ +123// │ │ │ │ +============================================================================= │ │ │ │ +124 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T │ │ │ │ +/class NormalCone NormalCone.hh │ │ │ │ +DDeeffiinniittiioonn NormalConeT.hh:78 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_m_e_r_g_e │ │ │ │ +void merge(const NormalConeT &) │ │ │ │ +merge _cone; this instance will then enclose both former cones │ │ │ │ +DDeeffiinniittiioonn NormalConeT_impl.hh:118 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_m_a_x___a_n_g_l_e │ │ │ │ +Scalar max_angle(const Vec3 &) const │ │ │ │ +return max. distance (radians) unit vector to cone (distant side) │ │ │ │ +DDeeffiinniittiioonn NormalConeT_impl.hh:87 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_a_n_g_l_e │ │ │ │ +Scalar angle() const │ │ │ │ +returns size of cone (radius in radians) │ │ │ │ +DDeeffiinniittiioonn NormalConeT.hh:105 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_c_e_n_t_e_r___n_o_r_m_a_l │ │ │ │ +const Vec3 & center_normal() const │ │ │ │ +returns center normal │ │ │ │ +DDeeffiinniittiioonn NormalConeT.hh:102 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_N_o_r_m_a_l_C_o_n_e_T │ │ │ │ +NormalConeT() │ │ │ │ +default constructor (not initialized) │ │ │ │ +DDeeffiinniittiioonn NormalConeT.hh:87 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +T::value_type value_type │ │ │ │ +Type of the scalar value. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00764_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/QuadricT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/VectorT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,18 +92,18 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
QuadricT.hh
│ │ │ +
VectorT.hh
│ │ │
│ │ │
│ │ │ -Go to the documentation of this file.
1/* ========================================================================= *
│ │ │ +
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │
6 * All rights reserved. *
│ │ │
7 * www.openmesh.org *
│ │ │
8 * *
│ │ │ @@ -140,266 +140,392 @@ │ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │
45
│ │ │ +
46//=============================================================================
│ │ │ +
47//
│ │ │ +
48// CLASS VectorT
│ │ │ +
49//
│ │ │
50//=============================================================================
│ │ │ -
51//
│ │ │ -
52// CLASS QuadricT
│ │ │ -
53//
│ │ │ -
54//=============================================================================
│ │ │ -
55
│ │ │ -
56#ifndef OPENMESH_GEOMETRY_QUADRIC_HH
│ │ │ -
57#define OPENMESH_GEOMETRY_QUADRIC_HH
│ │ │ -
58
│ │ │ -
59
│ │ │ -
60//== INCLUDES =================================================================
│ │ │ -
61
│ │ │ -
62#include "Config.hh"
│ │ │ -
63#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ -
64#include <OpenMesh/Core/Utils/GenProg.hh>
│ │ │ +
51
│ │ │ +
52// Don't parse this header file with doxygen since
│ │ │ +
53// for some reason (obviously due to a bug in doxygen,
│ │ │ +
54// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)
│ │ │ +
55// macro expansion and preprocessor defines
│ │ │ +
56// don't work properly.
│ │ │ +
57
│ │ │ +
58#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
│ │ │ +
59#include "Vector11T.hh"
│ │ │ +
60#else
│ │ │ +
61#ifndef DOXYGEN
│ │ │ +
62
│ │ │ +
63#ifndef OPENMESH_VECTOR_HH
│ │ │ +
64#define OPENMESH_VECTOR_HH
│ │ │
65
│ │ │ -
66//== NAMESPACE ================================================================
│ │ │ -
67
│ │ │ -
68namespace OpenMesh { //BEGIN_NS_OPENMESH
│ │ │ -
69namespace Geometry { //BEGIN_NS_GEOMETRY
│ │ │ -
70
│ │ │ -
71
│ │ │ -
72//== CLASS DEFINITION =========================================================
│ │ │ -
73
│ │ │ +
66
│ │ │ +
67//== INCLUDES =================================================================
│ │ │ +
68
│ │ │ +
69#include <OpenMesh/Core/System/config.h>
│ │ │ +
70#include <ostream>
│ │ │ +
71#include <cmath>
│ │ │ +
72#include <cassert>
│ │ │ +
73#include <cstring>
│ │ │
74
│ │ │ -
81template <class Scalar>
│ │ │ -
│ │ │ - │ │ │ -
83{
│ │ │ -
84public:
│ │ │ -
85 typedef Scalar value_type;
│ │ │ -
86 typedef QuadricT<Scalar> type;
│ │ │ -
87 typedef QuadricT<Scalar> Self;
│ │ │ -
88 // typedef VectorInterface<Scalar, VecStorage3<Scalar> > Vec3;
│ │ │ -
89 // typedef VectorInterface<Scalar, VecStorage4<Scalar> > Vec4;
│ │ │ -
90 //typedef Vector3Elem Vec3;
│ │ │ -
91 //typedef Vector4Elem Vec4;
│ │ │ -
92
│ │ │ -
│ │ │ -
94 QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d,
│ │ │ -
95 Scalar _e, Scalar _f, Scalar _g,
│ │ │ -
96 Scalar _h, Scalar _i,
│ │ │ -
97 Scalar _j)
│ │ │ -
98 : a_(_a), b_(_b), c_(_c), d_(_d),
│ │ │ -
99 e_(_e), f_(_f), g_(_g),
│ │ │ -
100 h_(_h), i_(_i),
│ │ │ -
101 j_(_j)
│ │ │ -
102 {
│ │ │ -
103 }
│ │ │ -
│ │ │ +
75#if defined(__GNUC__) && defined(__SSE__)
│ │ │ +
76#include <xmmintrin.h>
│ │ │ +
77#endif
│ │ │ +
78
│ │ │ +
79//== NAMESPACES ===============================================================
│ │ │ +
80
│ │ │ +
81
│ │ │ +
82namespace OpenMesh {
│ │ │ +
83
│ │ │ +
84
│ │ │ +
85//== CLASS DEFINITION =========================================================
│ │ │ +
86
│ │ │ +
87
│ │ │ +
97template<typename Scalar, int N> class VectorDataT {
│ │ │ +
98 public:
│ │ │ +
99 Scalar values_[N];
│ │ │ +
100};
│ │ │ +
101
│ │ │ +
102
│ │ │ +
103#if defined(__GNUC__) && defined(__SSE__)
│ │ │
104
│ │ │ -
105
│ │ │ -
│ │ │ -
107 QuadricT( Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0 )
│ │ │ -
108 : a_(_a*_a), b_(_a*_b), c_(_a*_c), d_(_a*_d),
│ │ │ -
109 e_(_b*_b), f_(_b*_c), g_(_b*_d),
│ │ │ -
110 h_(_c*_c), i_(_c*_d),
│ │ │ -
111 j_(_d*_d)
│ │ │ -
112 {}
│ │ │ -
│ │ │ +
106template<> class VectorDataT<float, 4> {
│ │ │ +
107 public:
│ │ │ +
108 union {
│ │ │ +
109 __m128 m128;
│ │ │ +
110 float values_[4];
│ │ │ +
111 };
│ │ │ +
112};
│ │ │
113
│ │ │ -
114 template <class _Point>
│ │ │ -
115 explicit QuadricT(const _Point& _pt)
│ │ │ -
116 {
│ │ │ -
117 set_distance_to_point(_pt);
│ │ │ -
118 }
│ │ │ -
119
│ │ │ -
120 template <class _Normal, class _Point>
│ │ │ -
121 QuadricT(const _Normal& _n, const _Point& _p)
│ │ │ -
122 {
│ │ │ -
123 set_distance_to_plane(_n,_p);
│ │ │ -
124 }
│ │ │ -
125
│ │ │ -
126 //set operator
│ │ │ -
127 void set(Scalar _a, Scalar _b, Scalar _c, Scalar _d,
│ │ │ -
128 Scalar _e, Scalar _f, Scalar _g,
│ │ │ -
129 Scalar _h, Scalar _i,
│ │ │ -
130 Scalar _j)
│ │ │ -
131 {
│ │ │ -
132 a_ = _a; b_ = _b; c_ = _c; d_ = _d;
│ │ │ -
133 e_ = _e; f_ = _f; g_ = _g;
│ │ │ -
134 h_ = _h; i_ = _i;
│ │ │ -
135 j_ = _j;
│ │ │ -
136 }
│ │ │ -
137
│ │ │ -
138 //sets the quadric representing the squared distance to _pt
│ │ │ -
139 template <class _Point>
│ │ │ -
140 void set_distance_to_point(const _Point& _pt)
│ │ │ -
141 {
│ │ │ -
142 set(1, 0, 0, -_pt[0],
│ │ │ -
143 1, 0, -_pt[1],
│ │ │ -
144 1, -_pt[2],
│ │ │ -
145 dot(_pt,_pt));
│ │ │ -
146 }
│ │ │ +
114#endif
│ │ │ +
115
│ │ │ +
116
│ │ │ +
117
│ │ │ +
118
│ │ │ +
119//== CLASS DEFINITION =========================================================
│ │ │ +
120
│ │ │ +
121
│ │ │ +
122#define DIM N
│ │ │ +
123#define TEMPLATE_HEADER template <typename Scalar, int N>
│ │ │ +
124#define CLASSNAME VectorT
│ │ │ +
125#define DERIVED VectorDataT<Scalar,N>
│ │ │ +
126#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
│ │ │ +
127
│ │ │ +
133#include "VectorT_inc.hh"
│ │ │ +
134
│ │ │ +
135#undef DIM
│ │ │ +
136#undef TEMPLATE_HEADER
│ │ │ +
137#undef CLASSNAME
│ │ │ +
138#undef DERIVED
│ │ │ +
139#undef unroll
│ │ │ +
140
│ │ │ +
141
│ │ │ +
142
│ │ │ +
143
│ │ │ +
144//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
│ │ │ +
145#if OM_PARTIAL_SPECIALIZATION
│ │ │ +
146
│ │ │
147
│ │ │ -
148 //sets the quadric representing the squared distance to the plane [_a,_b,_c,_d]
│ │ │ -
149 void set_distance_to_plane(Scalar _a, Scalar _b, Scalar _c, Scalar _d)
│ │ │ -
150 {
│ │ │ -
151 a_ = _a*_a; b_ = _a*_b; c_ = _a*_c; d_ = _a*_d;
│ │ │ -
152 e_ = _b*_b; f_ = _b*_c; g_ = _b*_d;
│ │ │ -
153 h_ = _c*_c; i_ = _c*_d;
│ │ │ -
154 j_ = _d*_d;
│ │ │ -
155 }
│ │ │ -
156
│ │ │ -
157 //sets the quadric representing the squared distance to the plane
│ │ │ -
158 //determined by the normal _n and the point _p
│ │ │ -
159 template <class _Normal, class _Point>
│ │ │ -
160 void set_distance_to_plane(const _Normal& _n, const _Point& _p)
│ │ │ -
161 {
│ │ │ -
162 set_distance_to_plane(_n[0], _n[1], _n[2], -dot(_n,_p));
│ │ │ -
163 }
│ │ │ -
164
│ │ │ -
166 void clear() { a_ = b_ = c_ = d_ = e_ = f_ = g_ = h_ = i_ = j_ = 0.0; }
│ │ │ -
167
│ │ │ -
│ │ │ - │ │ │ -
170 {
│ │ │ -
171 a_ += _q.a_; b_ += _q.b_; c_ += _q.c_; d_ += _q.d_;
│ │ │ -
172 e_ += _q.e_; f_ += _q.f_; g_ += _q.g_;
│ │ │ -
173 h_ += _q.h_; i_ += _q.i_;
│ │ │ -
174 j_ += _q.j_;
│ │ │ -
175 return *this;
│ │ │ -
176 }
│ │ │ -
│ │ │ -
177
│ │ │ -
178 QuadricT<Scalar> operator+(const QuadricT<Scalar>& _other ) const
│ │ │ -
179 {
│ │ │ -
180 QuadricT<Scalar> result = *this;
│ │ │ -
181 return result += _other;
│ │ │ -
182 }
│ │ │ -
183
│ │ │ -
184
│ │ │ -
│ │ │ - │ │ │ -
187 {
│ │ │ -
188 a_ *= _s; b_ *= _s; c_ *= _s; d_ *= _s;
│ │ │ -
189 e_ *= _s; f_ *= _s; g_ *= _s;
│ │ │ -
190 h_ *= _s; i_ *= _s;
│ │ │ -
191 j_ *= _s;
│ │ │ -
192 return *this;
│ │ │ -
193 }
│ │ │ -
│ │ │ +
148#define TEMPLATE_HEADER template <typename Scalar>
│ │ │ +
149#define CLASSNAME VectorT<Scalar,DIM>
│ │ │ +
150#define DERIVED VectorDataT<Scalar,DIM>
│ │ │ +
151
│ │ │ +
152
│ │ │ +
153#define DIM 2
│ │ │ +
154#define unroll(expr) expr(0) expr(1)
│ │ │ +
155#define unroll_comb(expr, op) expr(0) op expr(1)
│ │ │ +
156#define unroll_csv(expr) expr(0), expr(1)
│ │ │ +
157#include "VectorT_inc.hh"
│ │ │ +
158#undef DIM
│ │ │ +
159#undef unroll
│ │ │ +
160#undef unroll_comb
│ │ │ +
161#undef unroll_csv
│ │ │ +
162
│ │ │ +
163
│ │ │ +
164#define DIM 3
│ │ │ +
165#define unroll(expr) expr(0) expr(1) expr(2)
│ │ │ +
166#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
│ │ │ +
167#define unroll_csv(expr) expr(0), expr(1), expr(2)
│ │ │ +
168#include "VectorT_inc.hh"
│ │ │ +
169#undef DIM
│ │ │ +
170#undef unroll
│ │ │ +
171#undef unroll_comb
│ │ │ +
172#undef unroll_csv
│ │ │ +
173
│ │ │ +
174
│ │ │ +
175#define DIM 4
│ │ │ +
176#define unroll(expr) expr(0) expr(1) expr(2) expr(3)
│ │ │ +
177#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
│ │ │ +
178#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
│ │ │ +
179#include "VectorT_inc.hh"
│ │ │ +
180#undef DIM
│ │ │ +
181#undef unroll
│ │ │ +
182#undef unroll_comb
│ │ │ +
183#undef unroll_csv
│ │ │ +
184
│ │ │ +
185#define DIM 5
│ │ │ +
186#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
│ │ │ +
187#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
│ │ │ +
188#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
│ │ │ +
189#include "VectorT_inc.hh"
│ │ │ +
190#undef DIM
│ │ │ +
191#undef unroll
│ │ │ +
192#undef unroll_comb
│ │ │ +
193#undef unroll_csv
│ │ │
194
│ │ │ -
195 QuadricT<Scalar> operator*(Scalar _s) const
│ │ │ -
196 {
│ │ │ -
197 QuadricT<Scalar> result = *this;
│ │ │ -
198 return result *= _s;
│ │ │ -
199 }
│ │ │ -
200
│ │ │ -
202 template <class _Vec4>
│ │ │ -
│ │ │ -
203 _Vec4 operator*(const _Vec4& _v) const
│ │ │ -
204 {
│ │ │ -
205 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]);
│ │ │ -
206 return _Vec4(x*a_ + y*b_ + z*c_ + w*d_,
│ │ │ -
207 x*b_ + y*e_ + z*f_ + w*g_,
│ │ │ -
208 x*c_ + y*f_ + z*h_ + w*i_,
│ │ │ -
209 x*d_ + y*g_ + z*i_ + w*j_);
│ │ │ -
210 }
│ │ │ -
│ │ │ +
195#define DIM 6
│ │ │ +
196#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
│ │ │ +
197#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
│ │ │ +
198#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
│ │ │ +
199#include "VectorT_inc.hh"
│ │ │ +
200#undef DIM
│ │ │ +
201#undef unroll
│ │ │ +
202#undef unroll_comb
│ │ │ +
203#undef unroll_csv
│ │ │ +
204
│ │ │ +
205
│ │ │ +
206#undef TEMPLATE_HEADER
│ │ │ +
207#undef CLASSNAME
│ │ │ +
208#undef DERIVED
│ │ │ +
209
│ │ │ +
210
│ │ │
211
│ │ │ -
213 template <class _Vec>
│ │ │ -
│ │ │ -
214 Scalar operator()(const _Vec& _v) const
│ │ │ -
215 {
│ │ │ -
216 return evaluate(_v, GenProg::Int2Type<vector_traits<_Vec>::size_>());
│ │ │ -
217 }
│ │ │ -
│ │ │ -
218
│ │ │ -
219 Scalar a() const { return a_; }
│ │ │ -
220 Scalar b() const { return b_; }
│ │ │ -
221 Scalar c() const { return c_; }
│ │ │ -
222 Scalar d() const { return d_; }
│ │ │ -
223 Scalar e() const { return e_; }
│ │ │ -
224 Scalar f() const { return f_; }
│ │ │ -
225 Scalar g() const { return g_; }
│ │ │ -
226 Scalar h() const { return h_; }
│ │ │ -
227 Scalar i() const { return i_; }
│ │ │ -
228 Scalar j() const { return j_; }
│ │ │ -
229
│ │ │ -
230 Scalar xx() const { return a_; }
│ │ │ -
231 Scalar xy() const { return b_; }
│ │ │ -
232 Scalar xz() const { return c_; }
│ │ │ -
233 Scalar xw() const { return d_; }
│ │ │ -
234 Scalar yy() const { return e_; }
│ │ │ -
235 Scalar yz() const { return f_; }
│ │ │ -
236 Scalar yw() const { return g_; }
│ │ │ -
237 Scalar zz() const { return h_; }
│ │ │ -
238 Scalar zw() const { return i_; }
│ │ │ -
239 Scalar ww() const { return j_; }
│ │ │ +
212
│ │ │ +
213//== FULL TEMPLATE SPECIALIZATIONS ============================================
│ │ │ +
214#else
│ │ │ +
215
│ │ │ +
217template<>
│ │ │ +
218inline VectorT<float,3>
│ │ │ + │ │ │ +
220{
│ │ │ +
221 return
│ │ │ +
222 VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
│ │ │ +
223 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
│ │ │ +
224 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
│ │ │ +
225}
│ │ │ +
226
│ │ │ +
227
│ │ │ +
229template<>
│ │ │ + │ │ │ + │ │ │ +
232{
│ │ │ +
233 return
│ │ │ +
234 VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
│ │ │ +
235 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
│ │ │ +
236 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
│ │ │ +
237}
│ │ │ +
238
│ │ │ +
239#endif
│ │ │
240
│ │ │ -
241protected:
│ │ │ +
241
│ │ │
242
│ │ │ -
244 template <class _Vec3>
│ │ │ -
│ │ │ -
245 Scalar evaluate(const _Vec3& _v, GenProg::Int2Type<3>/*_dimension*/) const
│ │ │ -
246 {
│ │ │ -
247 Scalar x(_v[0]), y(_v[1]), z(_v[2]);
│ │ │ -
248 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x
│ │ │ -
249 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y
│ │ │ -
250 + h_*z*z + 2.0*i_*z
│ │ │ -
251 + j_;
│ │ │ -
252 }
│ │ │ -
│ │ │ +
243//== GLOBAL FUNCTIONS =========================================================
│ │ │ +
244
│ │ │ +
245
│ │ │ +
248template<typename Scalar1, typename Scalar2,int N>
│ │ │ +
249inline VectorT<Scalar1,N> operator*(Scalar2 _s, const VectorT<Scalar1,N>& _v) {
│ │ │ +
250 return _v*_s;
│ │ │ +
251}
│ │ │ +
252
│ │ │
253
│ │ │ -
255 template <class _Vec4>
│ │ │ -
│ │ │ -
256 Scalar evaluate(const _Vec4& _v, GenProg::Int2Type<4>/*_dimension*/) const
│ │ │ -
257 {
│ │ │ -
258 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]);
│ │ │ -
259 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x*w
│ │ │ -
260 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y*w
│ │ │ -
261 + h_*z*z + 2.0*i_*z*w
│ │ │ -
262 + j_*w*w;
│ │ │ -
263 }
│ │ │ -
│ │ │ -
264
│ │ │ -
265private:
│ │ │ -
266
│ │ │ -
267 Scalar a_, b_, c_, d_,
│ │ │ -
268 e_, f_, g_,
│ │ │ -
269 h_, i_,
│ │ │ -
270 j_;
│ │ │ -
271};
│ │ │ -
│ │ │ -
272
│ │ │ -
273
│ │ │ - │ │ │ -
276
│ │ │ - │ │ │ +
256template<typename Scalar, int N>
│ │ │ +
257inline Scalar
│ │ │ +
258dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
│ │ │ +
259 return (_v1 | _v2);
│ │ │ +
260}
│ │ │ +
261
│ │ │ +
262
│ │ │ +
265template<typename Scalar, int N>
│ │ │ +
266inline VectorT<Scalar,N>
│ │ │ +
267cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
│ │ │ +
268 return (_v1 % _v2);
│ │ │ +
269}
│ │ │ +
270
│ │ │ +
271
│ │ │ +
274template<typename Scalar, int DIM>
│ │ │ +
275Scalar norm(const VectorT<Scalar, DIM>& _v) {
│ │ │ +
276 return _v.norm();
│ │ │ +
277}
│ │ │ +
278
│ │ │
279
│ │ │ -
280
│ │ │ -
281//=============================================================================
│ │ │ -
282} // END_NS_GEOMETRY
│ │ │ -
283} // END_NS_OPENMESH
│ │ │ -
284//============================================================================
│ │ │ -
285#endif // OPENMESH_GEOMETRY_HH defined
│ │ │ -
286//=============================================================================
│ │ │ +
282template<typename Scalar, int DIM>
│ │ │ +
283Scalar sqrnorm(const VectorT<Scalar, DIM>& _v) {
│ │ │ +
284 return _v.sqrnorm();
│ │ │ +
285}
│ │ │ +
286
│ │ │ +
287
│ │ │ +
290template<typename Scalar, int DIM, typename OtherScalar>
│ │ │ +
291VectorT<Scalar, DIM>& vectorize(VectorT<Scalar, DIM>& _v, OtherScalar const& _val) {
│ │ │ +
292 return _v.vectorize(_val);
│ │ │ +
293}
│ │ │ +
294
│ │ │ +
295
│ │ │ +
298template<typename Scalar, int DIM>
│ │ │ + │ │ │ +
300 return _v.normalize();
│ │ │ +
301}
│ │ │ +
302
│ │ │ +
303
│ │ │ +
306template<typename Scalar, int DIM>
│ │ │ + │ │ │ +
308 return _v1.maximize(_v2);
│ │ │ +
309}
│ │ │ +
310
│ │ │ +
311
│ │ │ +
314template<typename Scalar, int DIM>
│ │ │ + │ │ │ +
316 return _v1.minimize(_v2);
│ │ │ +
317}
│ │ │ +
318
│ │ │ +
319
│ │ │ +
322template<typename Scalar, int DIM>
│ │ │ + │ │ │ +
324 return VectorT<Scalar, DIM>(_v1).maximize(_v2);
│ │ │ +
325}
│ │ │ +
326
│ │ │ +
327
│ │ │ +
330template<typename Scalar, int DIM>
│ │ │ + │ │ │ +
332 return VectorT<Scalar, DIM>(_v1).minimize(_v2);
│ │ │ +
333}
│ │ │ +
334
│ │ │ +
335
│ │ │ +
336//== TYPEDEFS =================================================================
│ │ │ +
337
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
351typedef VectorT<float,1> Vec1f;
│ │ │ + │ │ │ +
354
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
368typedef VectorT<float,2> Vec2f;
│ │ │ + │ │ │ +
371
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
385typedef VectorT<float,3> Vec3f;
│ │ │ + │ │ │ +
389typedef VectorT<bool,3> Vec3b;
│ │ │ +
390
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
404typedef VectorT<float,4> Vec4f;
│ │ │ + │ │ │ +
407
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
424
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
438typedef VectorT<float,6> Vec6f;
│ │ │ + │ │ │ +
441
│ │ │ +
442
│ │ │ +
443//=============================================================================
│ │ │ +
444} // namespace OpenMesh
│ │ │ +
445//=============================================================================
│ │ │ +
446
│ │ │ +
447
│ │ │ +
448#endif // OPENMESH_VECTOR_HH defined
│ │ │ +
449//=============================================================================
│ │ │ +
450#endif // DOXYGEN
│ │ │ +
451#endif // C++11
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
VectorT< signed char, 3 > Vec3c
3-byte signed vector
Definition Vector11T.hh:839
│ │ │ +
VectorT< double, 3 > Vec3d
3-double vector
Definition Vector11T.hh:853
│ │ │ +
VectorT< signed int, 1 > Vec1i
1-int signed vector
Definition Vector11T.hh:813
│ │ │ +
VectorT< unsigned char, 5 > Vec5uc
5-byte unsigned vector
Definition Vector11T.hh:877
│ │ │ +
VectorT< unsigned int, 2 > Vec2ui
2-int unsigned vector
Definition Vector11T.hh:832
│ │ │
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ -
/class QuadricT Geometry/QuadricT.hh
Definition QuadricT.hh:83
│ │ │ -
_Vec4 operator*(const _Vec4 &_v) const
multiply 4D vector from right: Q*v
Definition QuadricT.hh:203
│ │ │ -
void clear()
set all entries to zero
Definition QuadricT.hh:166
│ │ │ -
Scalar evaluate(const _Vec4 &_v, GenProg::Int2Type< 4 >) const
evaluate quadric Q at 4D vector v: v*Q*v
Definition QuadricT.hh:256
│ │ │ -
QuadricT< Scalar > & operator+=(const QuadricT< Scalar > &_q)
add quadrics
Definition QuadricT.hh:169
│ │ │ -
Scalar evaluate(const _Vec3 &_v, GenProg::Int2Type< 3 >) const
evaluate quadric Q at 3D vector v: v*Q*v
Definition QuadricT.hh:245
│ │ │ -
QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d, Scalar _e, Scalar _f, Scalar _g, Scalar _h, Scalar _i, Scalar _j)
construct with upper triangle of symmetrix 4x4 matrix
Definition QuadricT.hh:94
│ │ │ -
QuadricT< Scalar > & operator*=(Scalar _s)
multiply by scalar
Definition QuadricT.hh:186
│ │ │ -
Scalar operator()(const _Vec &_v) const
evaluate quadric Q at (3D or 4D) vector v: v*Q*v
Definition QuadricT.hh:214
│ │ │ -
QuadricT(Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0)
constructor from given plane equation: ax+by+cz+d_=0
Definition QuadricT.hh:107
│ │ │ -
Helper class providing information about a vector type.
Definition vector_traits.hh:89
│ │ │ - │ │ │ +
VectorT< double, 1 > Vec1d
1-double vector
Definition Vector11T.hh:819
│ │ │ +
VectorT< double, 4 > Vec4d
4-double vector
Definition Vector11T.hh:872
│ │ │ +
VectorT< float, 2 > Vec2f
2-float vector
Definition Vector11T.hh:834
│ │ │ +
VectorT< signed short int, 3 > Vec3s
3-short signed vector
Definition Vector11T.hh:843
│ │ │ +
VectorT< double, 2 > Vec2d
2-double vector
Definition Vector11T.hh:836
│ │ │ +
VectorT< signed int, 5 > Vec5i
5-int signed vector
Definition Vector11T.hh:883
│ │ │ +
VectorT< signed char, 4 > Vec4c
4-byte signed vector
Definition Vector11T.hh:858
│ │ │ +
VectorT< signed char, 5 > Vec5c
5-byte signed vector
Definition Vector11T.hh:875
│ │ │ +
VectorT< unsigned int, 5 > Vec5ui
5-int unsigned vector
Definition Vector11T.hh:885
│ │ │ +
VectorT< signed short int, 5 > Vec5s
5-short signed vector
Definition Vector11T.hh:879
│ │ │ +
VectorT< unsigned int, 4 > Vec4ui
4-int unsigned vector
Definition Vector11T.hh:868
│ │ │ +
VectorT< unsigned short int, 3 > Vec3us
3-short unsigned vector
Definition Vector11T.hh:845
│ │ │ +
VectorT< unsigned char, 3 > Vec3uc
3-byte unsigned vector
Definition Vector11T.hh:841
│ │ │ +
VectorT< signed short int, 2 > Vec2s
2-short signed vector
Definition Vector11T.hh:826
│ │ │ +
VectorT< signed int, 2 > Vec2i
2-int signed vector
Definition Vector11T.hh:830
│ │ │ +
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition Vector11T.hh:693
│ │ │ +
VectorT< signed char, 2 > Vec2c
2-byte signed vector
Definition Vector11T.hh:822
│ │ │ +
VectorT< unsigned short int, 2 > Vec2us
2-short unsigned vector
Definition Vector11T.hh:828
│ │ │ +
VectorT< signed char, 6 > Vec6c
6-byte signed vector
Definition Vector11T.hh:892
│ │ │ +
VectorT< signed int, 6 > Vec6i
6-int signed vector
Definition Vector11T.hh:900
│ │ │ +
VectorT< signed int, 4 > Vec4i
4-int signed vector
Definition Vector11T.hh:866
│ │ │ +
VectorT< signed short int, 4 > Vec4s
4-short signed vector
Definition Vector11T.hh:862
│ │ │ +
VectorT< unsigned char, 6 > Vec6uc
6-byte unsigned vector
Definition Vector11T.hh:894
│ │ │ +
VectorT< float, 6 > Vec6f
6-float vector
Definition Vector11T.hh:904
│ │ │ +
VectorT< float, 5 > Vec5f
5-float vector
Definition Vector11T.hh:887
│ │ │ +
VectorT< unsigned char, 2 > Vec2uc
2-byte unsigned vector
Definition Vector11T.hh:824
│ │ │ +
VectorT< unsigned int, 6 > Vec6ui
6-int unsigned vector
Definition Vector11T.hh:902
│ │ │ +
VectorT< float, 4 > Vec4f
4-float vector
Definition Vector11T.hh:870
│ │ │ +
VectorT< unsigned char, 1 > Vec1uc
1-byte unsigned vector
Definition Vector11T.hh:807
│ │ │ +
VectorT< unsigned char, 4 > Vec4uc
4-byte unsigned vector
Definition Vector11T.hh:860
│ │ │ +
VectorT< unsigned short int, 1 > Vec1us
1-short unsigned vector
Definition Vector11T.hh:811
│ │ │ +
VectorT< float, 1 > Vec1f
1-float vector
Definition Vector11T.hh:817
│ │ │ +
VectorT< double, 6 > Vec6d
6-double vector
Definition Vector11T.hh:906
│ │ │ +
VectorT< signed short int, 1 > Vec1s
1-short signed vector
Definition Vector11T.hh:809
│ │ │ +
VectorT< bool, 3 > Vec3b
3-bool vector
Definition Vector11T.hh:855
│ │ │ +
VectorT< unsigned int, 1 > Vec1ui
1-int unsigned vector
Definition Vector11T.hh:815
│ │ │ +
VectorT< signed char, 1 > Vec1c
1-byte signed vector
Definition Vector11T.hh:805
│ │ │ +
VectorT< double, 5 > Vec5d
5-double vector
Definition Vector11T.hh:889
│ │ │ +
VectorT< unsigned short int, 4 > Vec4us
4-short unsigned vector
Definition Vector11T.hh:864
│ │ │ +
VectorT< unsigned int, 3 > Vec3ui
3-int unsigned vector
Definition Vector11T.hh:849
│ │ │ +
VectorT< unsigned short int, 6 > Vec6us
6-short unsigned vector
Definition Vector11T.hh:898
│ │ │ +
VectorT< unsigned short int, 5 > Vec5us
5-short unsigned vector
Definition Vector11T.hh:881
│ │ │ +
VectorT< float, 3 > Vec3f
3-float vector
Definition Vector11T.hh:851
│ │ │ +
VectorT< signed short int, 6 > Vec6s
6-short signed vector
Definition Vector11T.hh:896
│ │ │ +
VectorT< signed int, 3 > Vec3i
3-int signed vector
Definition Vector11T.hh:847
│ │ │ +
auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), DIM > >::type
cross product: only defined for Vec3* as specialization
Definition Vector11T.hh:375
│ │ │ +
Definition VectorT_inc.hh:68
│ │ │ +
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition VectorT_inc.hh:564
│ │ │ +
Scalar norm() const
compute euclidean norm
Definition VectorT_inc.hh:410
│ │ │ +
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition VectorT_inc.hh:605
│ │ │ +
Scalar sqrnorm() const
compute squared euclidean norm
Definition VectorT_inc.hh:414
│ │ │ +
vector_type & normalize()
normalize vector, return normalized vector
Definition VectorT_inc.hh:432
│ │ │ +
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition VectorT_inc.hh:547
│ │ │
│ │ │
│ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,13 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -QuadricT.hh │ │ │ │ -_G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ +VectorT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -50,291 +49,592 @@ │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ 45 │ │ │ │ -50// │ │ │ │ +46// │ │ │ │ ============================================================================= │ │ │ │ -51// │ │ │ │ -52// CLASS QuadricT │ │ │ │ -53// │ │ │ │ -54// │ │ │ │ +47// │ │ │ │ +48// CLASS VectorT │ │ │ │ +49// │ │ │ │ +50// │ │ │ │ ============================================================================= │ │ │ │ -55 │ │ │ │ -56#ifndef OPENMESH_GEOMETRY_QUADRIC_HH │ │ │ │ -57#define OPENMESH_GEOMETRY_QUADRIC_HH │ │ │ │ -58 │ │ │ │ -59 │ │ │ │ -60//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -61 │ │ │ │ -62#include "_C_o_n_f_i_g_._h_h" │ │ │ │ -63#include │ │ │ │ -64#include │ │ │ │ +51 │ │ │ │ +52// Don't parse this header file with doxygen since │ │ │ │ +53// for some reason (obviously due to a bug in doxygen, │ │ │ │ +54// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182) │ │ │ │ +55// macro expansion and preprocessor defines │ │ │ │ +56// don't work properly. │ │ │ │ +57 │ │ │ │ +58#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || │ │ │ │ +defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) │ │ │ │ +59#include "Vector11T.hh" │ │ │ │ +60#else │ │ │ │ +61#ifndef DOXYGEN │ │ │ │ +62 │ │ │ │ +63#ifndef OPENMESH_VECTOR_HH │ │ │ │ +64#define OPENMESH_VECTOR_HH │ │ │ │ 65 │ │ │ │ -66//== NAMESPACE │ │ │ │ -================================================================ │ │ │ │ -67 │ │ │ │ -68namespace _O_p_e_n_M_e_s_h { //BEGIN_NS_OPENMESH │ │ │ │ -69namespace Geometry { //BEGIN_NS_GEOMETRY │ │ │ │ -70 │ │ │ │ -71 │ │ │ │ -72//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -73 │ │ │ │ +66 │ │ │ │ +67//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +68 │ │ │ │ +69#include │ │ │ │ +70#include │ │ │ │ +71#include │ │ │ │ +72#include │ │ │ │ +73#include │ │ │ │ 74 │ │ │ │ -81template │ │ │ │ -_8_2class _Q_u_a_d_r_i_c_T │ │ │ │ -83{ │ │ │ │ -84public: │ │ │ │ -85 typedef Scalar value_type; │ │ │ │ -86 typedef _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> _t_y_p_e; │ │ │ │ -87 typedef _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> _S_e_l_f; │ │ │ │ -88 // typedef VectorInterface > Vec3; │ │ │ │ -89 // typedef VectorInterface > Vec4; │ │ │ │ -90 //typedef Vector3Elem Vec3; │ │ │ │ -91 //typedef Vector4Elem Vec4; │ │ │ │ -92 │ │ │ │ -_9_4 _Q_u_a_d_r_i_c_T(Scalar _a, Scalar _b, Scalar _c, Scalar _d, │ │ │ │ -95 Scalar _e, Scalar _f, Scalar _g, │ │ │ │ -96 Scalar _h, Scalar _i, │ │ │ │ -97 Scalar _j) │ │ │ │ -98 : a_(_a), b_(_b), c_(_c), d_(_d), │ │ │ │ -99 e_(_e), f_(_f), g_(_g), │ │ │ │ -100 h_(_h), i_(_i), │ │ │ │ -101 j_(_j) │ │ │ │ -102 { │ │ │ │ -103 } │ │ │ │ +75#if defined(__GNUC__) && defined(__SSE__) │ │ │ │ +76#include │ │ │ │ +77#endif │ │ │ │ +78 │ │ │ │ +79//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +80 │ │ │ │ +81 │ │ │ │ +82namespace _O_p_e_n_M_e_s_h { │ │ │ │ +83 │ │ │ │ +84 │ │ │ │ +85//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +86 │ │ │ │ +87 │ │ │ │ +97template class VectorDataT { │ │ │ │ +98 public: │ │ │ │ +99 Scalar values_[N]; │ │ │ │ +100}; │ │ │ │ +101 │ │ │ │ +102 │ │ │ │ +103#if defined(__GNUC__) && defined(__SSE__) │ │ │ │ 104 │ │ │ │ -105 │ │ │ │ -_1_0_7 _Q_u_a_d_r_i_c_T( Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0 ) │ │ │ │ -108 : a_(_a*_a), b_(_a*_b), c_(_a*_c), d_(_a*_d), │ │ │ │ -109 e_(_b*_b), f_(_b*_c), g_(_b*_d), │ │ │ │ -110 h_(_c*_c), i_(_c*_d), │ │ │ │ -111 j_(_d*_d) │ │ │ │ -112 {} │ │ │ │ +106template<> class VectorDataT { │ │ │ │ +107 public: │ │ │ │ +108 union { │ │ │ │ +109 __m128 m128; │ │ │ │ +110 float values_[4]; │ │ │ │ +111 }; │ │ │ │ +112}; │ │ │ │ 113 │ │ │ │ -114 template │ │ │ │ -115 explicit _Q_u_a_d_r_i_c_T(const _Point& _pt) │ │ │ │ -116 { │ │ │ │ -117 set_distance_to_point(_pt); │ │ │ │ -118 } │ │ │ │ -119 │ │ │ │ -120 template │ │ │ │ -121 QuadricT(const _Normal& _n, const _Point& _p) │ │ │ │ -122 { │ │ │ │ -123 set_distance_to_plane(_n,_p); │ │ │ │ -124 } │ │ │ │ -125 │ │ │ │ -126 //set operator │ │ │ │ -127 void set(Scalar _a, Scalar _b, Scalar _c, Scalar _d, │ │ │ │ -128 Scalar _e, Scalar _f, Scalar _g, │ │ │ │ -129 Scalar _h, Scalar _i, │ │ │ │ -130 Scalar _j) │ │ │ │ -131 { │ │ │ │ -132 a_ = _a; b_ = _b; c_ = _c; d_ = _d; │ │ │ │ -133 e_ = _e; f_ = _f; g_ = _g; │ │ │ │ -134 h_ = _h; i_ = _i; │ │ │ │ -135 j_ = _j; │ │ │ │ -136 } │ │ │ │ -137 │ │ │ │ -138 //sets the quadric representing the squared distance to _pt │ │ │ │ -139 template │ │ │ │ -140 void set_distance_to_point(const _Point& _pt) │ │ │ │ -141 { │ │ │ │ -142 set(1, 0, 0, -_pt[0], │ │ │ │ -143 1, 0, -_pt[1], │ │ │ │ -144 1, -_pt[2], │ │ │ │ -145 _d_o_t(_pt,_pt)); │ │ │ │ -146 } │ │ │ │ +114#endif │ │ │ │ +115 │ │ │ │ +116 │ │ │ │ +117 │ │ │ │ +118 │ │ │ │ +119//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +120 │ │ │ │ +121 │ │ │ │ +122#define DIM N │ │ │ │ +123#define TEMPLATE_HEADER template │ │ │ │ +124#define CLASSNAME VectorT │ │ │ │ +125#define DERIVED VectorDataT │ │ │ │ +126#define unroll(expr) for (int i=0; i │ │ │ │ -160 void set_distance_to_plane(const _Normal& _n, const _Point& _p) │ │ │ │ -161 { │ │ │ │ -162 set_distance_to_plane(_n[0], _n[1], _n[2], -_d_o_t(_n,_p)); │ │ │ │ -163 } │ │ │ │ -164 │ │ │ │ -_1_6_6 void _c_l_e_a_r() { a_ = b_ = c_ = d_ = e_ = f_ = g_ = h_ = i_ = j_ = 0.0; } │ │ │ │ -167 │ │ │ │ -_1_6_9 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _o_p_e_r_a_t_o_r_+_=( const _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _q ) │ │ │ │ -170 { │ │ │ │ -171 a_ += _q.a_; b_ += _q.b_; c_ += _q.c_; d_ += _q.d_; │ │ │ │ -172 e_ += _q.e_; f_ += _q.f_; g_ += _q.g_; │ │ │ │ -173 h_ += _q.h_; i_ += _q.i_; │ │ │ │ -174 j_ += _q.j_; │ │ │ │ -175 return *this; │ │ │ │ -176 } │ │ │ │ -177 │ │ │ │ -178 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> operator+(const _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _other ) const │ │ │ │ -179 { │ │ │ │ -180 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> result = *this; │ │ │ │ -181 return result += _other; │ │ │ │ -182 } │ │ │ │ -183 │ │ │ │ +148#define TEMPLATE_HEADER template │ │ │ │ +149#define CLASSNAME VectorT │ │ │ │ +150#define DERIVED VectorDataT │ │ │ │ +151 │ │ │ │ +152 │ │ │ │ +153#define DIM 2 │ │ │ │ +154#define unroll(expr) expr(0) expr(1) │ │ │ │ +155#define unroll_comb(expr, op) expr(0) op expr(1) │ │ │ │ +156#define unroll_csv(expr) expr(0), expr(1) │ │ │ │ +157#include "VectorT_inc.hh" │ │ │ │ +158#undef DIM │ │ │ │ +159#undef unroll │ │ │ │ +160#undef unroll_comb │ │ │ │ +161#undef unroll_csv │ │ │ │ +162 │ │ │ │ +163 │ │ │ │ +164#define DIM 3 │ │ │ │ +165#define unroll(expr) expr(0) expr(1) expr(2) │ │ │ │ +166#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) │ │ │ │ +167#define unroll_csv(expr) expr(0), expr(1), expr(2) │ │ │ │ +168#include "VectorT_inc.hh" │ │ │ │ +169#undef DIM │ │ │ │ +170#undef unroll │ │ │ │ +171#undef unroll_comb │ │ │ │ +172#undef unroll_csv │ │ │ │ +173 │ │ │ │ +174 │ │ │ │ +175#define DIM 4 │ │ │ │ +176#define unroll(expr) expr(0) expr(1) expr(2) expr(3) │ │ │ │ +177#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) │ │ │ │ +178#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3) │ │ │ │ +179#include "VectorT_inc.hh" │ │ │ │ +180#undef DIM │ │ │ │ +181#undef unroll │ │ │ │ +182#undef unroll_comb │ │ │ │ +183#undef unroll_csv │ │ │ │ 184 │ │ │ │ -_1_8_6 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_>& _o_p_e_r_a_t_o_r_*_=( Scalar _s) │ │ │ │ -187 { │ │ │ │ -188 a_ *= _s; b_ *= _s; c_ *= _s; d_ *= _s; │ │ │ │ -189 e_ *= _s; f_ *= _s; g_ *= _s; │ │ │ │ -190 h_ *= _s; i_ *= _s; │ │ │ │ -191 j_ *= _s; │ │ │ │ -192 return *this; │ │ │ │ -193 } │ │ │ │ +185#define DIM 5 │ │ │ │ +186#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) │ │ │ │ +187#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op │ │ │ │ +expr(4) │ │ │ │ +188#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4) │ │ │ │ +189#include "VectorT_inc.hh" │ │ │ │ +190#undef DIM │ │ │ │ +191#undef unroll │ │ │ │ +192#undef unroll_comb │ │ │ │ +193#undef unroll_csv │ │ │ │ 194 │ │ │ │ -195 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> operator*(Scalar _s) const │ │ │ │ -196 { │ │ │ │ -197 _Q_u_a_d_r_i_c_T_<_S_c_a_l_a_r_> result = *this; │ │ │ │ -198 return result *= _s; │ │ │ │ -199 } │ │ │ │ -200 │ │ │ │ -202 template │ │ │ │ -_2_0_3 _Vec4 _o_p_e_r_a_t_o_r_*(const _Vec4& _v) const │ │ │ │ -204 { │ │ │ │ -205 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]); │ │ │ │ -206 return _Vec4(x*a_ + y*b_ + z*c_ + w*d_, │ │ │ │ -207 x*b_ + y*e_ + z*f_ + w*g_, │ │ │ │ -208 x*c_ + y*f_ + z*h_ + w*i_, │ │ │ │ -209 x*d_ + y*g_ + z*i_ + w*j_); │ │ │ │ -210 } │ │ │ │ +195#define DIM 6 │ │ │ │ +196#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5) │ │ │ │ +197#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op │ │ │ │ +expr(4) op expr(5) │ │ │ │ +198#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr │ │ │ │ +(5) │ │ │ │ +199#include "VectorT_inc.hh" │ │ │ │ +200#undef DIM │ │ │ │ +201#undef unroll │ │ │ │ +202#undef unroll_comb │ │ │ │ +203#undef unroll_csv │ │ │ │ +204 │ │ │ │ +205 │ │ │ │ +206#undef TEMPLATE_HEADER │ │ │ │ +207#undef CLASSNAME │ │ │ │ +208#undef DERIVED │ │ │ │ +209 │ │ │ │ +210 │ │ │ │ 211 │ │ │ │ -213 template │ │ │ │ -_2_1_4 Scalar _o_p_e_r_a_t_o_r_(_)(const _Vec& _v) const │ │ │ │ -215 { │ │ │ │ -216 return _e_v_a_l_u_a_t_e(_v, GenProg::Int2Type<_v_e_c_t_o_r___t_r_a_i_t_s_<___V_e_c_>_:_:_s_i_z_e__>()); │ │ │ │ -217 } │ │ │ │ -218 │ │ │ │ -219 Scalar a() const { return a_; } │ │ │ │ -220 Scalar b() const { return b_; } │ │ │ │ -221 Scalar c() const { return c_; } │ │ │ │ -222 Scalar d() const { return d_; } │ │ │ │ -223 Scalar e() const { return e_; } │ │ │ │ -224 Scalar f() const { return f_; } │ │ │ │ -225 Scalar g() const { return g_; } │ │ │ │ -226 Scalar h() const { return h_; } │ │ │ │ -227 Scalar i() const { return i_; } │ │ │ │ -228 Scalar j() const { return j_; } │ │ │ │ -229 │ │ │ │ -230 Scalar xx() const { return a_; } │ │ │ │ -231 Scalar xy() const { return b_; } │ │ │ │ -232 Scalar xz() const { return c_; } │ │ │ │ -233 Scalar xw() const { return d_; } │ │ │ │ -234 Scalar yy() const { return e_; } │ │ │ │ -235 Scalar yz() const { return f_; } │ │ │ │ -236 Scalar yw() const { return g_; } │ │ │ │ -237 Scalar zz() const { return h_; } │ │ │ │ -238 Scalar zw() const { return i_; } │ │ │ │ -239 Scalar ww() const { return j_; } │ │ │ │ +212 │ │ │ │ +213//== FULL TEMPLATE SPECIALIZATIONS │ │ │ │ +============================================ │ │ │ │ +214#else │ │ │ │ +215 │ │ │ │ +217template<> │ │ │ │ +218inline _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_> │ │ │ │ +219_V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_>_:_:_o_p_e_r_a_t_o_r_%(const _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_>& _rhs) const │ │ │ │ +220{ │ │ │ │ +221 return │ │ │ │ +222 _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1], │ │ │ │ +223 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2], │ │ │ │ +224 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]); │ │ │ │ +225} │ │ │ │ +226 │ │ │ │ +227 │ │ │ │ +229template<> │ │ │ │ +230inline _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_> │ │ │ │ +231_V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_>_:_:_o_p_e_r_a_t_o_r_%(const _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_>& _rhs) const │ │ │ │ +232{ │ │ │ │ +233 return │ │ │ │ +234 _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1], │ │ │ │ +235 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2], │ │ │ │ +236 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]); │ │ │ │ +237} │ │ │ │ +238 │ │ │ │ +239#endif │ │ │ │ 240 │ │ │ │ -241protected: │ │ │ │ +241 │ │ │ │ 242 │ │ │ │ -244 template │ │ │ │ -_2_4_5 Scalar _e_v_a_l_u_a_t_e(const _Vec3& _v, GenProg::Int2Type<3>/*_dimension*/) const │ │ │ │ -246 { │ │ │ │ -247 Scalar x(_v[0]), y(_v[1]), z(_v[2]); │ │ │ │ -248 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x │ │ │ │ -249 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y │ │ │ │ -250 + h_*z*z + 2.0*i_*z │ │ │ │ -251 + j_; │ │ │ │ -252 } │ │ │ │ +243//== GLOBAL FUNCTIONS │ │ │ │ +========================================================= │ │ │ │ +244 │ │ │ │ +245 │ │ │ │ +248template │ │ │ │ +249inline _V_e_c_t_o_r_T_<_S_c_a_l_a_r_1_,_N_> _o_p_e_r_a_t_o_r_*(Scalar2 _s, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_1_,_N_>& │ │ │ │ +_v) { │ │ │ │ +250 return _v*_s; │ │ │ │ +251} │ │ │ │ +252 │ │ │ │ 253 │ │ │ │ -255 template │ │ │ │ -_2_5_6 Scalar _e_v_a_l_u_a_t_e(const _Vec4& _v, GenProg::Int2Type<4>/*_dimension*/) const │ │ │ │ -257 { │ │ │ │ -258 Scalar x(_v[0]), y(_v[1]), z(_v[2]), w(_v[3]); │ │ │ │ -259 return a_*x*x + 2.0*b_*x*y + 2.0*c_*x*z + 2.0*d_*x*w │ │ │ │ -260 + e_*y*y + 2.0*f_*y*z + 2.0*g_*y*w │ │ │ │ -261 + h_*z*z + 2.0*i_*z*w │ │ │ │ -262 + j_*w*w; │ │ │ │ -263 } │ │ │ │ -264 │ │ │ │ -265private: │ │ │ │ -266 │ │ │ │ -267 Scalar a_, b_, c_, d_, │ │ │ │ -268 e_, f_, g_, │ │ │ │ -269 h_, i_, │ │ │ │ -270 j_; │ │ │ │ -271}; │ │ │ │ -272 │ │ │ │ -273 │ │ │ │ -_2_7_5typedef _Q_u_a_d_r_i_c_T_<_f_l_o_a_t_> _Q_u_a_d_r_i_c_f; │ │ │ │ -276 │ │ │ │ -_2_7_8typedef _Q_u_a_d_r_i_c_T_<_d_o_u_b_l_e_> _Q_u_a_d_r_i_c_d; │ │ │ │ +256template │ │ │ │ +257inline Scalar │ │ │ │ +258_d_o_t(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v1, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v2) { │ │ │ │ +259 return (_v1 | _v2); │ │ │ │ +260} │ │ │ │ +261 │ │ │ │ +262 │ │ │ │ +265template │ │ │ │ +266inline _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_> │ │ │ │ +267cross(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v1, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v2) { │ │ │ │ +268 return (_v1 % _v2); │ │ │ │ +269} │ │ │ │ +270 │ │ │ │ +271 │ │ │ │ +274template │ │ │ │ +275Scalar norm(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ +276 return _v._n_o_r_m(); │ │ │ │ +277} │ │ │ │ +278 │ │ │ │ 279 │ │ │ │ -280 │ │ │ │ -281// │ │ │ │ +282template │ │ │ │ +283Scalar sqrnorm(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ +284 return _v._s_q_r_n_o_r_m(); │ │ │ │ +285} │ │ │ │ +286 │ │ │ │ +287 │ │ │ │ +290template │ │ │ │ +291_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& vectorize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v, OtherScalar const& │ │ │ │ +_val) { │ │ │ │ +292 return _v._v_e_c_t_o_r_i_z_e(_val); │ │ │ │ +293} │ │ │ │ +294 │ │ │ │ +295 │ │ │ │ +298template │ │ │ │ +299_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& normalize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ +300 return _v._n_o_r_m_a_l_i_z_e(); │ │ │ │ +301} │ │ │ │ +302 │ │ │ │ +303 │ │ │ │ +306template │ │ │ │ +307_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& maximize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ +_D_I_M_>& _v2) { │ │ │ │ +308 return _v1._m_a_x_i_m_i_z_e(_v2); │ │ │ │ +309} │ │ │ │ +310 │ │ │ │ +311 │ │ │ │ +314template │ │ │ │ +315_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& minimize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ +_D_I_M_>& _v2) { │ │ │ │ +316 return _v1._m_i_n_i_m_i_z_e(_v2); │ │ │ │ +317} │ │ │ │ +318 │ │ │ │ +319 │ │ │ │ +322template │ │ │ │ +323_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> max(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ +_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) { │ │ │ │ +324 return _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>(_v1)._m_a_x_i_m_i_z_e(_v2); │ │ │ │ +325} │ │ │ │ +326 │ │ │ │ +327 │ │ │ │ +330template │ │ │ │ +331_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> min(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ +_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) { │ │ │ │ +332 return _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>(_v1)._m_i_n_i_m_i_z_e(_v2); │ │ │ │ +333} │ │ │ │ +334 │ │ │ │ +335 │ │ │ │ +336//== TYPEDEFS │ │ │ │ +================================================================= │ │ │ │ +337 │ │ │ │ +339typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_c; │ │ │ │ +341typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_u_c; │ │ │ │ +343typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_s; │ │ │ │ +345typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_u_s; │ │ │ │ +347typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_i; │ │ │ │ +349typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_u_i; │ │ │ │ +351typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_1_> _V_e_c_1_f; │ │ │ │ +353typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_1_> _V_e_c_1_d; │ │ │ │ +354 │ │ │ │ +356typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_c; │ │ │ │ +358typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_u_c; │ │ │ │ +360typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_s; │ │ │ │ +362typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_u_s; │ │ │ │ +364typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_i; │ │ │ │ +366typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_u_i; │ │ │ │ +368typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_2_> _V_e_c_2_f; │ │ │ │ +370typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_2_> _V_e_c_2_d; │ │ │ │ +371 │ │ │ │ +373typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_c; │ │ │ │ +375typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_u_c; │ │ │ │ +377typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_s; │ │ │ │ +379typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_u_s; │ │ │ │ +381typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_i; │ │ │ │ +383typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_u_i; │ │ │ │ +385typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_> _V_e_c_3_f; │ │ │ │ +387typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_> _V_e_c_3_d; │ │ │ │ +389typedef _V_e_c_t_o_r_T_<_b_o_o_l_,_3_> _V_e_c_3_b; │ │ │ │ +390 │ │ │ │ +392typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_c; │ │ │ │ +394typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_u_c; │ │ │ │ +396typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_s; │ │ │ │ +398typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_u_s; │ │ │ │ +400typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_i; │ │ │ │ +402typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_u_i; │ │ │ │ +404typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_4_> _V_e_c_4_f; │ │ │ │ +406typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_4_> _V_e_c_4_d; │ │ │ │ +407 │ │ │ │ +409typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_c; │ │ │ │ +411typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_u_c; │ │ │ │ +413typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_s; │ │ │ │ +415typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_u_s; │ │ │ │ +417typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_i; │ │ │ │ +419typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_u_i; │ │ │ │ +421typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_ _5_> _V_e_c_5_f; │ │ │ │ +423typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_ _5_> _V_e_c_5_d; │ │ │ │ +424 │ │ │ │ +426typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_c; │ │ │ │ +428typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_u_c; │ │ │ │ +430typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_s; │ │ │ │ +432typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_u_s; │ │ │ │ +434typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_i; │ │ │ │ +436typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_u_i; │ │ │ │ +438typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_6_> _V_e_c_6_f; │ │ │ │ +440typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_6_> _V_e_c_6_d; │ │ │ │ +441 │ │ │ │ +442 │ │ │ │ +443// │ │ │ │ +============================================================================= │ │ │ │ +444} // namespace OpenMesh │ │ │ │ +445// │ │ │ │ ============================================================================= │ │ │ │ -282} // END_NS_GEOMETRY │ │ │ │ -283} // END_NS_OPENMESH │ │ │ │ -284// │ │ │ │ -============================================================================ │ │ │ │ -285#endif // OPENMESH_GEOMETRY_HH defined │ │ │ │ -286// │ │ │ │ +446 │ │ │ │ +447 │ │ │ │ +448#endif // OPENMESH_VECTOR_HH defined │ │ │ │ +449// │ │ │ │ ============================================================================= │ │ │ │ +450#endif // DOXYGEN │ │ │ │ +451#endif // C++11 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_c │ │ │ │ +VectorT< signed char, 3 > Vec3c │ │ │ │ +3-byte signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:839 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_d │ │ │ │ +VectorT< double, 3 > Vec3d │ │ │ │ +3-double vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:853 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_i │ │ │ │ +VectorT< signed int, 1 > Vec1i │ │ │ │ +1-int signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:813 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_u_c │ │ │ │ +VectorT< unsigned char, 5 > Vec5uc │ │ │ │ +5-byte unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:877 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_u_i │ │ │ │ +VectorT< unsigned int, 2 > Vec2ui │ │ │ │ +2-int unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:832 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ Adapter for osg vector member computing a scalar product. │ │ │ │ DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T │ │ │ │ -/class QuadricT Geometry/QuadricT.hh │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -_Vec4 operator*(const _Vec4 &_v) const │ │ │ │ -multiply 4D vector from right: Q*v │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:203 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_c_l_e_a_r │ │ │ │ -void clear() │ │ │ │ -set all entries to zero │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:166 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_e_v_a_l_u_a_t_e │ │ │ │ -Scalar evaluate(const _Vec4 &_v, GenProg::Int2Type< 4 >) const │ │ │ │ -evaluate quadric Q at 4D vector v: v*Q*v │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:256 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ -QuadricT< Scalar > & operator+=(const QuadricT< Scalar > &_q) │ │ │ │ -add quadrics │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:169 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_e_v_a_l_u_a_t_e │ │ │ │ -Scalar evaluate(const _Vec3 &_v, GenProg::Int2Type< 3 >) const │ │ │ │ -evaluate quadric Q at 3D vector v: v*Q*v │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:245 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_Q_u_a_d_r_i_c_T │ │ │ │ -QuadricT(Scalar _a, Scalar _b, Scalar _c, Scalar _d, Scalar _e, Scalar _f, │ │ │ │ -Scalar _g, Scalar _h, Scalar _i, Scalar _j) │ │ │ │ -construct with upper triangle of symmetrix 4x4 matrix │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:94 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ -QuadricT< Scalar > & operator*=(Scalar _s) │ │ │ │ -multiply by scalar │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:186 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ -Scalar operator()(const _Vec &_v) const │ │ │ │ -evaluate quadric Q at (3D or 4D) vector v: v*Q*v │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:214 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_G_e_o_m_e_t_r_y_:_:_Q_u_a_d_r_i_c_T_:_:_Q_u_a_d_r_i_c_T │ │ │ │ -QuadricT(Scalar _a=0.0, Scalar _b=0.0, Scalar _c=0.0, Scalar _d=0.0) │ │ │ │ -constructor from given plane equation: ax+by+cz+d_=0 │ │ │ │ -DDeeffiinniittiioonn QuadricT.hh:107 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s │ │ │ │ -Helper class providing information about a vector type. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:89 │ │ │ │ -_C_o_n_f_i_g_._h_h │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_d │ │ │ │ +VectorT< double, 1 > Vec1d │ │ │ │ +1-double vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:819 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_d │ │ │ │ +VectorT< double, 4 > Vec4d │ │ │ │ +4-double vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:872 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_f │ │ │ │ +VectorT< float, 2 > Vec2f │ │ │ │ +2-float vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:834 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_s │ │ │ │ +VectorT< signed short int, 3 > Vec3s │ │ │ │ +3-short signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:843 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_d │ │ │ │ +VectorT< double, 2 > Vec2d │ │ │ │ +2-double vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:836 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_i │ │ │ │ +VectorT< signed int, 5 > Vec5i │ │ │ │ +5-int signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:883 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_c │ │ │ │ +VectorT< signed char, 4 > Vec4c │ │ │ │ +4-byte signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:858 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_c │ │ │ │ +VectorT< signed char, 5 > Vec5c │ │ │ │ +5-byte signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:875 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_u_i │ │ │ │ +VectorT< unsigned int, 5 > Vec5ui │ │ │ │ +5-int unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:885 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_s │ │ │ │ +VectorT< signed short int, 5 > Vec5s │ │ │ │ +5-short signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:879 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_i │ │ │ │ +VectorT< unsigned int, 4 > Vec4ui │ │ │ │ +4-int unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:868 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_s │ │ │ │ +VectorT< unsigned short int, 3 > Vec3us │ │ │ │ +3-short unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:845 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_c │ │ │ │ +VectorT< unsigned char, 3 > Vec3uc │ │ │ │ +3-byte unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:841 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_s │ │ │ │ +VectorT< signed short int, 2 > Vec2s │ │ │ │ +2-short signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:826 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_i │ │ │ │ +VectorT< signed int, 2 > Vec2i │ │ │ │ +2-int signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:830 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) - │ │ │ │ +> decltype(rhs.operator*(_s)) │ │ │ │ +Component wise multiplication from the left. │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:693 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_c │ │ │ │ +VectorT< signed char, 2 > Vec2c │ │ │ │ +2-byte signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:822 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_u_s │ │ │ │ +VectorT< unsigned short int, 2 > Vec2us │ │ │ │ +2-short unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:828 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_c │ │ │ │ +VectorT< signed char, 6 > Vec6c │ │ │ │ +6-byte signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:892 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_i │ │ │ │ +VectorT< signed int, 6 > Vec6i │ │ │ │ +6-int signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:900 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_i │ │ │ │ +VectorT< signed int, 4 > Vec4i │ │ │ │ +4-int signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:866 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_s │ │ │ │ +VectorT< signed short int, 4 > Vec4s │ │ │ │ +4-short signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:862 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_u_c │ │ │ │ +VectorT< unsigned char, 6 > Vec6uc │ │ │ │ +6-byte unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:894 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_f │ │ │ │ +VectorT< float, 6 > Vec6f │ │ │ │ +6-float vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:904 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_f │ │ │ │ +VectorT< float, 5 > Vec5f │ │ │ │ +5-float vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:887 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_2_u_c │ │ │ │ +VectorT< unsigned char, 2 > Vec2uc │ │ │ │ +2-byte unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:824 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_u_i │ │ │ │ +VectorT< unsigned int, 6 > Vec6ui │ │ │ │ +6-int unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:902 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_f │ │ │ │ +VectorT< float, 4 > Vec4f │ │ │ │ +4-float vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:870 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_u_c │ │ │ │ +VectorT< unsigned char, 1 > Vec1uc │ │ │ │ +1-byte unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:807 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_c │ │ │ │ +VectorT< unsigned char, 4 > Vec4uc │ │ │ │ +4-byte unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:860 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_u_s │ │ │ │ +VectorT< unsigned short int, 1 > Vec1us │ │ │ │ +1-short unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:811 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_f │ │ │ │ +VectorT< float, 1 > Vec1f │ │ │ │ +1-float vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:817 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_d │ │ │ │ +VectorT< double, 6 > Vec6d │ │ │ │ +6-double vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:906 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_s │ │ │ │ +VectorT< signed short int, 1 > Vec1s │ │ │ │ +1-short signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:809 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_b │ │ │ │ +VectorT< bool, 3 > Vec3b │ │ │ │ +3-bool vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:855 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_u_i │ │ │ │ +VectorT< unsigned int, 1 > Vec1ui │ │ │ │ +1-int unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:815 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_1_c │ │ │ │ +VectorT< signed char, 1 > Vec1c │ │ │ │ +1-byte signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:805 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_d │ │ │ │ +VectorT< double, 5 > Vec5d │ │ │ │ +5-double vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:889 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_s │ │ │ │ +VectorT< unsigned short int, 4 > Vec4us │ │ │ │ +4-short unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:864 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_i │ │ │ │ +VectorT< unsigned int, 3 > Vec3ui │ │ │ │ +3-int unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:849 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_u_s │ │ │ │ +VectorT< unsigned short int, 6 > Vec6us │ │ │ │ +6-short unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:898 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_5_u_s │ │ │ │ +VectorT< unsigned short int, 5 > Vec5us │ │ │ │ +5-short unsigned vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:881 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_f │ │ │ │ +VectorT< float, 3 > Vec3f │ │ │ │ +3-float vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:851 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_6_s │ │ │ │ +VectorT< signed short int, 6 > Vec6s │ │ │ │ +6-short signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:896 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_3_i │ │ │ │ +VectorT< signed int, 3 > Vec3i │ │ │ │ +3-int signed vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:847 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_% │ │ │ │ +auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ +enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), │ │ │ │ +DIM > >::type │ │ │ │ +cross product: only defined for Vec3* as specialization │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:375 │ │ │ │ +_V_e_c_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:68 │ │ │ │ +_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ +vector_type & maximize(const vector_type &_rhs) │ │ │ │ +maximize values: same as *this = max(*this, _rhs), but faster │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:564 │ │ │ │ +_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ +Scalar norm() const │ │ │ │ +compute euclidean norm │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:410 │ │ │ │ +_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ +vector_type & vectorize(const Scalar &_s) │ │ │ │ +store the same value in each component (e.g. to clear all entries) │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:605 │ │ │ │ +_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ +Scalar sqrnorm() const │ │ │ │ +compute squared euclidean norm │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:414 │ │ │ │ +_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ +vector_type & normalize() │ │ │ │ +normalize vector, return normalized vector │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:432 │ │ │ │ +_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ +vector_type & minimize(const vector_type &_rhs) │ │ │ │ +minimize values: same as *this = min(*this, _rhs), but faster │ │ │ │ +DDeeffiinniittiioonn VectorT_inc.hh:547 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00767_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/Vector11T.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/LoopSchemeMaskT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
Vector11T.hh
│ │ │ +
LoopSchemeMaskT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,926 +136,161 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42#ifndef OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_
│ │ │ -
43#define OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_
│ │ │ +
42
│ │ │ +
43
│ │ │
44
│ │ │ -
45#include <array>
│ │ │ -
46#include <utility>
│ │ │ -
47#include <algorithm>
│ │ │ -
48#include <numeric>
│ │ │ -
49#include <type_traits>
│ │ │ -
50#include <cmath>
│ │ │ -
51#include <ostream>
│ │ │ -
52#include <istream>
│ │ │ -
53#include <cassert>
│ │ │ -
54#include <cstdlib>
│ │ │ -
55
│ │ │ -
56// This header is not needed by this file but expected by others including
│ │ │ -
57// this file.
│ │ │ -
58#include <OpenMesh/Core/System/config.h>
│ │ │ -
59
│ │ │ -
60
│ │ │ -
61/*
│ │ │ -
62 * Helpers for VectorT
│ │ │ -
63 */
│ │ │ -
64namespace {
│ │ │ -
65
│ │ │ -
66template<typename ... Ts>
│ │ │ -
67struct are_convertible_to;
│ │ │ -
68
│ │ │ -
69template<typename To, typename From, typename ... Froms>
│ │ │ -
70struct are_convertible_to<To, From, Froms...> {
│ │ │ -
71 static constexpr bool value = std::is_convertible<From, To>::value
│ │ │ -
72 && are_convertible_to<To, Froms...>::value;
│ │ │ -
73};
│ │ │ -
74
│ │ │ -
75template<typename To, typename From>
│ │ │ -
76struct are_convertible_to<To, From> : public std::is_convertible<From, To> {
│ │ │ -
77};
│ │ │ -
78}
│ │ │ +
45#ifndef LOOPSCHEMEMASKT_HH
│ │ │ +
46#define LOOPSCHEMEMASKT_HH
│ │ │ +
47
│ │ │ +
48#include <cmath>
│ │ │ +
49#include <vector>
│ │ │ +
50
│ │ │ +
51#include <OpenMesh/Core/System/config.h>
│ │ │ +
52#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ +
53
│ │ │ +
54namespace OpenMesh
│ │ │ +
55{
│ │ │ +
56
│ │ │ +
65template <class T_, unsigned int cache_size_ = 100>
│ │ │ +
│ │ │ + │ │ │ +
67{
│ │ │ +
68public:
│ │ │ +
69 enum { cache_size = cache_size_ };
│ │ │ +
70 typedef T_ Scalar;
│ │ │ +
71
│ │ │ +
72protected:
│ │ │ +
73
│ │ │ +
74 Scalar proj_weights_[cache_size];
│ │ │ +
75 Scalar limit_weights_[cache_size];
│ │ │ +
76 Scalar step_weights_[cache_size];
│ │ │ +
77 std::vector<Scalar> tang0_weights_[cache_size];
│ │ │ +
78 std::vector<Scalar> tang1_weights_[cache_size];
│ │ │
79
│ │ │ -
80namespace OpenMesh {
│ │ │ +
80protected:
│ │ │
81
│ │ │ -
82template<typename Scalar, int DIM>
│ │ │ -
│ │ │ -
83class VectorT {
│ │ │ -
84
│ │ │ -
85 static_assert(DIM >= 1, "VectorT requires positive dimensionality.");
│ │ │ -
86
│ │ │ -
87 private:
│ │ │ -
88 using container = std::array<Scalar, DIM>;
│ │ │ -
89 container values_;
│ │ │ -
90
│ │ │ -
91 public:
│ │ │ -
92
│ │ │ -
93 //---------------------------------------------------------------- class info
│ │ │ -
94
│ │ │ -
96 typedef Scalar value_type;
│ │ │ +
82 inline static Scalar compute_proj_weight(uint _valence)
│ │ │ +
83 {
│ │ │ +
84 //return pow(3.0 / 2.0 + cos(2.0 * M_PI / _valence), 2) / 2.0 - 1.0;
│ │ │ +
85 double denom = (3.0 + 2.0*cos(2.0*M_PI/(double)_valence));
│ │ │ +
86 double weight = (64.0*_valence)/(40.0 - denom*denom) - _valence;
│ │ │ +
87 return (Scalar) weight;
│ │ │ +
88 }
│ │ │ +
89
│ │ │ +
90 inline static Scalar compute_limit_weight(uint _valence)
│ │ │ +
91 {
│ │ │ +
92 double proj_weight_value = compute_proj_weight(_valence);
│ │ │ +
93 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);//normalize the proj_weight
│ │ │ +
94 double weight = (3.0/8.0)/(1.0 - proj_weight_value + (3.0/8.0));
│ │ │ +
95 return (Scalar)weight;
│ │ │ +
96 }
│ │ │
97
│ │ │ - │ │ │ -
100
│ │ │ -
│ │ │ -
102 static constexpr int dim() {
│ │ │ -
103 return DIM;
│ │ │ -
104 }
│ │ │ -
│ │ │ +
98 inline static Scalar compute_step_weight(uint _valence)
│ │ │ +
99 {
│ │ │ +
100 double proj_weight_value = compute_proj_weight(_valence);
│ │ │ +
101 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);//normalize the proj_weight
│ │ │ +
102 double weight = proj_weight_value - (3.0/8.0);
│ │ │ +
103 return (Scalar)weight;
│ │ │ +
104 }
│ │ │
105
│ │ │ -
│ │ │ -
107 static constexpr size_t size() {
│ │ │ -
108 return DIM;
│ │ │ -
109 }
│ │ │ -
│ │ │ +
106 inline static Scalar compute_tang0_weight(uint _valence, uint _ver_id)
│ │ │ +
107 {
│ │ │ +
108 return (Scalar)cos(2.0*M_PI*(double)_ver_id/(double)_valence);
│ │ │ +
109 }
│ │ │
110
│ │ │ -
111 static constexpr const size_t size_ = DIM;
│ │ │ -
112
│ │ │ -
113 //-------------------------------------------------------------- constructors
│ │ │ -
114
│ │ │ -
115 // Converting constructor: Constructs the vector from DIM values (of
│ │ │ -
116 // potentially heterogenous types) which are all convertible to Scalar.
│ │ │ -
117 template<typename T, typename ... Ts,
│ │ │ -
118 typename = typename std::enable_if<sizeof...(Ts)+1 == DIM>::type,
│ │ │ -
119 typename = typename std::enable_if<
│ │ │ -
120 are_convertible_to<Scalar, T, Ts...>::value>::type>
│ │ │ -
121 constexpr VectorT(T v, Ts... vs) : values_ { {static_cast<Scalar>(v), static_cast<Scalar>(vs)...} } {
│ │ │ -
122 static_assert(sizeof...(Ts)+1 == DIM,
│ │ │ -
123 "Invalid number of components specified in constructor.");
│ │ │ -
124 static_assert(are_convertible_to<Scalar, T, Ts...>::value,
│ │ │ -
125 "Not all components are convertible to Scalar.");
│ │ │ -
126 }
│ │ │ -
127
│ │ │ -
129 constexpr VectorT() {}
│ │ │ -
130
│ │ │ -
│ │ │ -
134 explicit VectorT(const Scalar &v) {
│ │ │ -
135 vectorize(v);
│ │ │ -
136 }
│ │ │ -
│ │ │ -
137
│ │ │ -
138 VectorT(const VectorT &rhs) = default;
│ │ │ -
139 VectorT(VectorT &&rhs) = default;
│ │ │ -
140 VectorT &operator=(const VectorT &rhs) = default;
│ │ │ -
141 VectorT &operator=(VectorT &&rhs) = default;
│ │ │ -
142
│ │ │ -
147 template<typename S = Scalar, int D = DIM>
│ │ │ -
│ │ │ -
148 auto homogenized() const ->
│ │ │ -
149 typename std::enable_if<D == 4,
│ │ │ -
150 VectorT<decltype(std::declval<S>()/std::declval<S>()), DIM>>::type {
│ │ │ -
151 static_assert(D == DIM, "D and DIM need to be identical. (Never "
│ │ │ -
152 "override the default template arguments.)");
│ │ │ -
153 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
154 "to be the same type. (Never override the default template "
│ │ │ -
155 "arguments.)");
│ │ │ -
156 return VectorT(
│ │ │ -
157 values_[0]/values_[3],
│ │ │ -
158 values_[1]/values_[3],
│ │ │ -
159 values_[2]/values_[3],
│ │ │ -
160 1);
│ │ │ -
161 }
│ │ │ -
│ │ │ -
162
│ │ │ -
164 template<typename Iterator,
│ │ │ -
165 typename = decltype(
│ │ │ -
166 *std::declval<Iterator&>(), void(),
│ │ │ -
167 ++std::declval<Iterator&>(), void())>
│ │ │ -
│ │ │ -
168 explicit VectorT(Iterator it) {
│ │ │ -
169 std::copy_n(it, DIM, values_.begin());
│ │ │ -
170 }
│ │ │ -
│ │ │ -
171
│ │ │ -
│ │ │ -
173 explicit VectorT(container&& _array) :
│ │ │ -
174 values_(_array)
│ │ │ -
175 {
│ │ │ -
176 }
│ │ │ -
│ │ │ -
177
│ │ │ -
179 template<typename otherScalarType,
│ │ │ -
180 typename = typename std::enable_if<
│ │ │ -
181 std::is_convertible<otherScalarType, Scalar>::value>>
│ │ │ -
│ │ │ - │ │ │ -
183 operator=(_rhs);
│ │ │ -
184 }
│ │ │ -
│ │ │ -
185
│ │ │ -
186 //--------------------------------------------------------------------- casts
│ │ │ +
111 inline static Scalar compute_tang1_weight(uint _valence, uint _ver_id)
│ │ │ +
112 {
│ │ │ +
113 return (Scalar)sin(2.0*M_PI*(double)_ver_id/(double)_valence);
│ │ │ +
114 }
│ │ │ +
115
│ │ │ +
116 void cache_weights()
│ │ │ +
117 {
│ │ │ +
118 proj_weights_[0] = 1;
│ │ │ +
119 for (uint k = 1; k < cache_size; ++k)
│ │ │ +
120 {
│ │ │ +
121 proj_weights_[k] = compute_proj_weight(k);
│ │ │ +
122 limit_weights_[k] = compute_limit_weight(k);
│ │ │ +
123 step_weights_[k] = compute_step_weight(k);
│ │ │ +
124 tang0_weights_[k].resize(k);
│ │ │ +
125 tang1_weights_[k].resize(k);
│ │ │ +
126 for (uint i = 0; i < k; ++i)
│ │ │ +
127 {
│ │ │ +
128 tang0_weights_[k][i] = compute_tang0_weight(k,i);
│ │ │ +
129 tang1_weights_[k][i] = compute_tang1_weight(k,i);
│ │ │ +
130 }
│ │ │ +
131 }
│ │ │ +
132 }
│ │ │ +
133
│ │ │ +
134public:
│ │ │ +
135
│ │ │ + │ │ │ +
137 {
│ │ │ +
138 cache_weights();
│ │ │ +
139 }
│ │ │ +
140
│ │ │ +
141 inline Scalar proj_weight(uint _valence) const
│ │ │ +
142 {
│ │ │ +
143 assert(_valence < cache_size );
│ │ │ +
144 return proj_weights_[_valence];
│ │ │ +
145 }
│ │ │ +
146
│ │ │ +
147 inline Scalar limit_weight(uint _valence) const
│ │ │ +
148 {
│ │ │ +
149 assert(_valence < cache_size );
│ │ │ +
150 return limit_weights_[_valence];
│ │ │ +
151 }
│ │ │ +
152
│ │ │ +
153 inline Scalar step_weight(uint _valence, uint _step) const
│ │ │ +
154 {
│ │ │ +
155 assert(_valence < cache_size);
│ │ │ +
156 return pow(step_weights_[_valence], (int)_step);//can be precomputed
│ │ │ +
157 }
│ │ │ +
158
│ │ │ +
159 inline Scalar tang0_weight(uint _valence, uint _ver_id) const
│ │ │ +
160 {
│ │ │ +
161 assert(_valence < cache_size );
│ │ │ +
162 assert(_ver_id < _valence);
│ │ │ +
163 return tang0_weights_[_valence][_ver_id];
│ │ │ +
164 }
│ │ │ +
165
│ │ │ +
166 inline Scalar tang1_weight(uint _valence, uint _ver_id) const
│ │ │ +
167 {
│ │ │ +
168 assert(_valence < cache_size );
│ │ │ +
169 assert(_ver_id < _valence);
│ │ │ +
170 return tang1_weights_[_valence][_ver_id];
│ │ │ +
171 }
│ │ │ +
172
│ │ │ +
173 void dump(uint _max_valency = cache_size - 1) const
│ │ │ +
174 {
│ │ │ +
175 assert(_max_valency <= cache_size - 1);
│ │ │ +
176 //CConsole::printf("(k : pw_k, lw_k): ");
│ │ │ +
177 for (uint i = 0; i <= _max_valency; ++i)
│ │ │ +
178 {
│ │ │ +
179 //CConsole::stream() << "(" << i << " : " << proj_weight(i) << ", " << limit_weight(i) << ", " << step_weight(i,1) << "), ";
│ │ │ +
180 }
│ │ │ +
181 //CConsole::printf("\n");
│ │ │ +
182 }
│ │ │ +
183};
│ │ │ +
│ │ │ +
184
│ │ │ + │ │ │ + │ │ │
187
│ │ │ -
189 template<typename OtherScalar,
│ │ │ -
190 typename = typename std::enable_if<
│ │ │ -
191 std::is_convertible<OtherScalar, Scalar>::value>>
│ │ │ -
│ │ │ - │ │ │ -
193 std::transform(_rhs.cbegin(), _rhs.cend(),
│ │ │ -
194 this->begin(), [](OtherScalar rhs) {
│ │ │ -
195 return static_cast<Scalar>(std::move(rhs));
│ │ │ -
196 });
│ │ │ -
197 return *this;
│ │ │ -
198 }
│ │ │ -
│ │ │ -
199
│ │ │ -
201 Scalar* data() { return values_.data(); }
│ │ │ -
202
│ │ │ -
204 const Scalar* data() const { return values_.data(); }
│ │ │ -
205
│ │ │ -
206 //----------------------------------------------------------- element access
│ │ │ -
207
│ │ │ -
│ │ │ -
209 Scalar& operator[](size_t _i) {
│ │ │ -
210 assert(_i < DIM);
│ │ │ -
211 return values_[_i];
│ │ │ -
212 }
│ │ │ -
│ │ │ -
213
│ │ │ -
│ │ │ -
215 const Scalar& operator[](size_t _i) const {
│ │ │ -
216 assert(_i < DIM);
│ │ │ -
217 return values_[_i];
│ │ │ -
218 }
│ │ │ -
│ │ │ -
219
│ │ │ -
220 //---------------------------------------------------------------- comparsion
│ │ │ -
221
│ │ │ -
│ │ │ -
223 bool operator==(const vector_type& _rhs) const {
│ │ │ -
224 return std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin());
│ │ │ -
225 }
│ │ │ -
│ │ │ -
226
│ │ │ -
│ │ │ -
228 bool operator!=(const vector_type& _rhs) const {
│ │ │ -
229 return !std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin());
│ │ │ -
230 }
│ │ │ -
│ │ │ -
231
│ │ │ -
232 //---------------------------------------------------------- scalar operators
│ │ │ -
233
│ │ │ -
235 template<typename OtherScalar>
│ │ │ -
│ │ │ -
236 auto operator*=(const OtherScalar& _s) ->
│ │ │ -
237 typename std::enable_if<std::is_convertible<
│ │ │ -
238 decltype(this->values_[0] * _s), Scalar>::value,
│ │ │ -
239 VectorT<Scalar, DIM>&>::type {
│ │ │ -
240 for (auto& e : *this) {
│ │ │ -
241 e *= _s;
│ │ │ -
242 }
│ │ │ -
243 return *this;
│ │ │ -
244 }
│ │ │ -
│ │ │ -
245
│ │ │ -
247 template<typename OtherScalar>
│ │ │ -
│ │ │ -
248 auto operator/=(const OtherScalar& _s) ->
│ │ │ -
249 typename std::enable_if<std::is_convertible<
│ │ │ -
250 decltype(this->values_[0] / _s), Scalar>::value,
│ │ │ -
251 VectorT<Scalar, DIM>&>::type {
│ │ │ -
252 for (auto& e : *this) {
│ │ │ -
253 e /= _s;
│ │ │ -
254 }
│ │ │ -
255 return *this;
│ │ │ -
256 }
│ │ │ -
│ │ │ -
257
│ │ │ -
259 template<typename OtherScalar>
│ │ │ -
260 typename std::enable_if<std::is_convertible<
│ │ │ -
261 decltype(std::declval<Scalar>() * std::declval<OtherScalar>()),
│ │ │ -
262 Scalar>::value,
│ │ │ - │ │ │ -
264 operator*(const OtherScalar& _s) const {
│ │ │ -
265 return vector_type(*this) *= _s;
│ │ │ -
266 }
│ │ │ -
267
│ │ │ -
269 template<typename OtherScalar>
│ │ │ -
270 typename std::enable_if<std::is_convertible<
│ │ │ -
271 decltype(std::declval<Scalar>() / std::declval<OtherScalar>()),
│ │ │ -
272 Scalar>::value,
│ │ │ - │ │ │ -
274 operator/(const OtherScalar& _s) const {
│ │ │ -
275 return vector_type(*this) /= _s;
│ │ │ -
276 }
│ │ │ -
277
│ │ │ -
278 //---------------------------------------------------------- vector operators
│ │ │ -
279
│ │ │ -
281 template<typename OtherScalar>
│ │ │ - │ │ │ -
283 typename std::enable_if<
│ │ │ -
284 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0,
│ │ │ -
285 vector_type&>::type {
│ │ │ -
286 for (int i = 0; i < DIM; ++i) {
│ │ │ -
287 data()[i] *= _rhs.data()[i];
│ │ │ -
288 }
│ │ │ -
289 return *this;
│ │ │ -
290 }
│ │ │ -
291
│ │ │ -
293 template<typename OtherScalar>
│ │ │ - │ │ │ -
295 typename std::enable_if<
│ │ │ -
296 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0,
│ │ │ -
297 vector_type&>::type {
│ │ │ -
298 for (int i = 0; i < DIM; ++i) {
│ │ │ -
299 data()[i] /= _rhs.data()[i];
│ │ │ -
300 }
│ │ │ -
301 return *this;
│ │ │ -
302 }
│ │ │ -
303
│ │ │ -
305 template<typename OtherScalar>
│ │ │ - │ │ │ -
307 typename std::enable_if<
│ │ │ -
308 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0,
│ │ │ -
309 vector_type&>::type {
│ │ │ -
310 for (int i = 0; i < DIM; ++i) {
│ │ │ -
311 data()[i] -= _rhs.data()[i];
│ │ │ -
312 }
│ │ │ -
313 return *this;
│ │ │ -
314 }
│ │ │ -
315
│ │ │ -
317 template<typename OtherScalar>
│ │ │ - │ │ │ -
319 typename std::enable_if<
│ │ │ -
320 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0,
│ │ │ -
321 vector_type&>::type {
│ │ │ -
322 for (int i = 0; i < DIM; ++i) {
│ │ │ -
323 data()[i] += _rhs.data()[i];
│ │ │ -
324 }
│ │ │ -
325 return *this;
│ │ │ -
326 }
│ │ │ -
327
│ │ │ -
329 template<typename OtherScalar>
│ │ │ -
330 auto operator*(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ -
331 typename std::enable_if<
│ │ │ -
332 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0,
│ │ │ -
333 vector_type>::type {
│ │ │ -
334 return vector_type(*this) *= _rhs;
│ │ │ -
335 }
│ │ │ -
336
│ │ │ -
338 template<typename OtherScalar>
│ │ │ -
339 auto operator/(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ -
340 typename std::enable_if<
│ │ │ -
341 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0,
│ │ │ -
342 vector_type>::type {
│ │ │ -
343 return vector_type(*this) /= _rhs;
│ │ │ -
344 }
│ │ │ -
345
│ │ │ -
347 template<typename OtherScalar>
│ │ │ -
348 auto operator+(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ -
349 typename std::enable_if<
│ │ │ -
350 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0,
│ │ │ -
351 vector_type>::type {
│ │ │ -
352 return vector_type(*this) += _rhs;
│ │ │ -
353 }
│ │ │ -
354
│ │ │ -
356 template<typename OtherScalar>
│ │ │ -
357 auto operator-(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ -
358 typename std::enable_if<
│ │ │ -
359 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0,
│ │ │ -
360 vector_type>::type {
│ │ │ -
361 return vector_type(*this) -= _rhs;
│ │ │ -
362 }
│ │ │ -
363
│ │ │ -
│ │ │ -
365 vector_type operator-(void) const {
│ │ │ -
366 vector_type v;
│ │ │ -
367 std::transform(values_.begin(), values_.end(), v.values_.begin(),
│ │ │ -
368 [](const Scalar &s) { return -s; });
│ │ │ -
369 return v;
│ │ │ -
370 }
│ │ │ -
│ │ │ -
371
│ │ │ -
374 template<typename OtherScalar>
│ │ │ -
│ │ │ -
375 auto operator% (const VectorT<OtherScalar, DIM> &_rhs) const ->
│ │ │ -
376 typename std::enable_if<DIM == 3,
│ │ │ -
377 VectorT<decltype((*this)[0] * _rhs[0] -
│ │ │ -
378 (*this)[0] * _rhs[0]), DIM>>::type {
│ │ │ -
379 return {
│ │ │ -
380 values_[1] * _rhs[2] - values_[2] * _rhs[1],
│ │ │ -
381 values_[2] * _rhs[0] - values_[0] * _rhs[2],
│ │ │ -
382 values_[0] * _rhs[1] - values_[1] * _rhs[0]
│ │ │ -
383 };
│ │ │ -
384 }
│ │ │ -
│ │ │ -
385
│ │ │ -
388 template<typename OtherScalar>
│ │ │ -
│ │ │ -
389 auto cross (const VectorT<OtherScalar, DIM> &_rhs) const ->
│ │ │ -
390 decltype(*this % _rhs)
│ │ │ -
391 {
│ │ │ -
392 return *this % _rhs;
│ │ │ -
393 }
│ │ │ -
│ │ │ -
394
│ │ │ -
395
│ │ │ -
398 template<typename OtherScalar>
│ │ │ -
│ │ │ -
399 auto operator|(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ -
400 decltype(*this->data() * *_rhs.data()) {
│ │ │ -
401
│ │ │ -
402 return std::inner_product(begin() + 1, begin() + DIM, _rhs.begin() + 1,
│ │ │ -
403 *begin() * *_rhs.begin());
│ │ │ -
404 }
│ │ │ -
│ │ │ -
405
│ │ │ -
408 template<typename OtherScalar>
│ │ │ -
│ │ │ -
409 auto dot(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ -
410 decltype(*this | _rhs)
│ │ │ -
411 {
│ │ │ -
412 return *this | _rhs;
│ │ │ -
413 }
│ │ │ -
│ │ │ -
414
│ │ │ -
415 //------------------------------------------------------------ euclidean norm
│ │ │ -
416
│ │ │ -
418
│ │ │ -
419
│ │ │ -
421 template<typename S = Scalar>
│ │ │ -
│ │ │ -
422 decltype(std::declval<S>() * std::declval<S>()) sqrnorm() const {
│ │ │ -
423 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
424 "to be the same type. (Never override the default template "
│ │ │ -
425 "arguments.)");
│ │ │ -
426 typedef decltype(values_[0] * values_[0]) RESULT;
│ │ │ -
427 return std::accumulate(values_.cbegin() + 1, values_.cend(),
│ │ │ -
428 values_[0] * values_[0],
│ │ │ -
429 [](const RESULT &l, const Scalar &r) { return l + r * r; });
│ │ │ -
430 }
│ │ │ -
│ │ │ -
431
│ │ │ -
433 template<typename S = Scalar>
│ │ │ -
│ │ │ -
434 auto norm() const ->
│ │ │ -
435 decltype(std::sqrt(std::declval<VectorT<S, DIM>>().sqrnorm())) {
│ │ │ -
436 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
437 "to be the same type. (Never override the default template "
│ │ │ -
438 "arguments.)");
│ │ │ -
439 return std::sqrt(sqrnorm());
│ │ │ -
440 }
│ │ │ -
│ │ │ -
441
│ │ │ -
442 template<typename S = Scalar>
│ │ │ -
│ │ │ -
443 auto length() const ->
│ │ │ -
444 decltype(std::declval<VectorT<S, DIM>>().norm()) {
│ │ │ -
445 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
446 "to be the same type. (Never override the default template "
│ │ │ -
447 "arguments.)");
│ │ │ -
448 return norm();
│ │ │ -
449 }
│ │ │ -
│ │ │ -
450
│ │ │ -
453 template<typename S = Scalar>
│ │ │ -
│ │ │ -
454 auto normalize() ->
│ │ │ -
455 decltype(*this /= std::declval<VectorT<S, DIM>>().norm()) {
│ │ │ -
456 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
457 "to be the same type. (Never override the default template "
│ │ │ -
458 "arguments.)");
│ │ │ -
459 return *this /= norm();
│ │ │ -
460 }
│ │ │ -
│ │ │ -
461
│ │ │ -
464 template<typename S = Scalar>
│ │ │ -
│ │ │ -
465 auto normalized() const ->
│ │ │ -
466 decltype(*this / std::declval<VectorT<S, DIM>>().norm()) {
│ │ │ -
467 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
468 "to be the same type. (Never override the default template "
│ │ │ -
469 "arguments.)");
│ │ │ -
470 return *this / norm();
│ │ │ -
471 }
│ │ │ -
│ │ │ -
472
│ │ │ -
475 template<typename S = Scalar>
│ │ │ -
476 typename std::enable_if<
│ │ │ -
477 sizeof(decltype(
│ │ │ -
478 static_cast<S>(0),
│ │ │ -
479 std::declval<VectorT<S, DIM>>().norm())) >= 0,
│ │ │ -
480 vector_type&>::type
│ │ │ -
│ │ │ - │ │ │ -
482 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ -
483 "to be the same type. (Never override the default template "
│ │ │ -
484 "arguments.)");
│ │ │ -
485 auto n = norm();
│ │ │ -
486 if (n != static_cast<decltype(norm())>(0)) {
│ │ │ -
487 *this /= n;
│ │ │ -
488 }
│ │ │ -
489 return *this;
│ │ │ -
490 }
│ │ │ -
│ │ │ -
491
│ │ │ -
493
│ │ │ -
494 //------------------------------------------------------------ euclidean norm
│ │ │ -
495
│ │ │ -
497
│ │ │ -
498
│ │ │ -
│ │ │ -
500 Scalar l1_norm() const {
│ │ │ -
501 return std::accumulate(
│ │ │ -
502 values_.cbegin() + 1, values_.cend(), values_[0]);
│ │ │ -
503 }
│ │ │ -
│ │ │ -
504
│ │ │ -
│ │ │ -
506 Scalar l8_norm() const {
│ │ │ -
507 return max_abs();
│ │ │ -
508 }
│ │ │ -
│ │ │ -
509
│ │ │ -
511
│ │ │ -
512 //------------------------------------------------------------ max, min, mean
│ │ │ -
513
│ │ │ -
515
│ │ │ -
516
│ │ │ -
│ │ │ -
518 Scalar max() const {
│ │ │ -
519 return *std::max_element(values_.cbegin(), values_.cend());
│ │ │ -
520 }
│ │ │ -
│ │ │ -
521
│ │ │ -
│ │ │ -
523 Scalar max_abs() const {
│ │ │ -
524 return std::abs(
│ │ │ -
525 *std::max_element(values_.cbegin(), values_.cend(),
│ │ │ -
526 [](const Scalar &a, const Scalar &b) {
│ │ │ -
527 return std::abs(a) < std::abs(b);
│ │ │ -
528 }));
│ │ │ -
529 }
│ │ │ -
│ │ │ -
530
│ │ │ -
│ │ │ -
532 Scalar min() const {
│ │ │ -
533 return *std::min_element(values_.cbegin(), values_.cend());
│ │ │ -
534 }
│ │ │ -
│ │ │ -
535
│ │ │ -
│ │ │ -
537 Scalar min_abs() const {
│ │ │ -
538 return std::abs(
│ │ │ -
539 *std::min_element(values_.cbegin(), values_.cend(),
│ │ │ -
540 [](const Scalar &a, const Scalar &b) {
│ │ │ -
541 return std::abs(a) < std::abs(b);
│ │ │ -
542 }));
│ │ │ -
543 }
│ │ │ -
│ │ │ -
544
│ │ │ -
│ │ │ -
546 Scalar mean() const {
│ │ │ -
547 return l1_norm()/DIM;
│ │ │ -
548 }
│ │ │ -
│ │ │ -
549
│ │ │ -
│ │ │ -
551 Scalar mean_abs() const {
│ │ │ -
552 return std::accumulate(values_.cbegin() + 1, values_.cend(),
│ │ │ -
553 std::abs(values_[0]),
│ │ │ -
554 [](const Scalar &l, const Scalar &r) {
│ │ │ -
555 return l + std::abs(r);
│ │ │ -
556 }) / DIM;
│ │ │ -
557 }
│ │ │ -
│ │ │ -
558
│ │ │ -
│ │ │ - │ │ │ -
561 std::transform(values_.cbegin(), values_.cend(),
│ │ │ -
562 _rhs.values_.cbegin(),
│ │ │ -
563 values_.begin(),
│ │ │ -
564 [](const Scalar &l, const Scalar &r) {
│ │ │ -
565 return std::min(l, r);
│ │ │ -
566 });
│ │ │ -
567 return *this;
│ │ │ -
568 }
│ │ │ -
│ │ │ -
569
│ │ │ -
│ │ │ -
571 bool minimized(const vector_type& _rhs) {
│ │ │ -
572 bool result = false;
│ │ │ -
573 std::transform(values_.cbegin(), values_.cend(),
│ │ │ -
574 _rhs.values_.cbegin(),
│ │ │ -
575 values_.begin(),
│ │ │ -
576 [&result](const Scalar &l, const Scalar &r) {
│ │ │ -
577 if (l < r) {
│ │ │ -
578 return l;
│ │ │ -
579 } else {
│ │ │ -
580 result = true;
│ │ │ -
581 return r;
│ │ │ -
582 }
│ │ │ -
583 });
│ │ │ -
584 return result;
│ │ │ -
585 }
│ │ │ -
│ │ │ -
586
│ │ │ -
│ │ │ - │ │ │ -
589 std::transform(values_.cbegin(), values_.cend(),
│ │ │ -
590 _rhs.values_.cbegin(),
│ │ │ -
591 values_.begin(),
│ │ │ -
592 [](const Scalar &l, const Scalar &r) {
│ │ │ -
593 return std::max(l, r);
│ │ │ -
594 });
│ │ │ -
595 return *this;
│ │ │ -
596 }
│ │ │ -
│ │ │ -
597
│ │ │ -
│ │ │ -
599 bool maximized(const vector_type& _rhs) {
│ │ │ -
600 bool result = false;
│ │ │ -
601 std::transform(values_.cbegin(), values_.cend(),
│ │ │ -
602 _rhs.values_.cbegin(),
│ │ │ -
603 values_.begin(),
│ │ │ -
604 [&result](const Scalar &l, const Scalar &r) {
│ │ │ -
605 if (l > r) {
│ │ │ -
606 return l;
│ │ │ -
607 } else {
│ │ │ -
608 result = true;
│ │ │ -
609 return r;
│ │ │ -
610 }
│ │ │ -
611 });
│ │ │ -
612 return result;
│ │ │ -
613 }
│ │ │ -
│ │ │ -
614
│ │ │ -
│ │ │ -
616 inline vector_type min(const vector_type& _rhs) const {
│ │ │ -
617 return vector_type(*this).minimize(_rhs);
│ │ │ -
618 }
│ │ │ -
│ │ │ -
619
│ │ │ -
│ │ │ -
621 inline vector_type max(const vector_type& _rhs) const {
│ │ │ -
622 return vector_type(*this).maximize(_rhs);
│ │ │ -
623 }
│ │ │ -
│ │ │ -
624
│ │ │ -
626
│ │ │ -
627 //------------------------------------------------------------ misc functions
│ │ │ -
628
│ │ │ -
630 template<typename Functor>
│ │ │ -
│ │ │ -
631 inline vector_type apply(const Functor& _func) const {
│ │ │ -
632 vector_type result;
│ │ │ -
633 std::transform(result.values_.cbegin(), result.values_.cend(),
│ │ │ -
634 result.values_.begin(), _func);
│ │ │ -
635 return result;
│ │ │ -
636 }
│ │ │ -
│ │ │ -
637
│ │ │ -
│ │ │ -
639 vector_type& vectorize(const Scalar& _s) {
│ │ │ -
640 std::fill(values_.begin(), values_.end(), _s);
│ │ │ -
641 return *this;
│ │ │ -
642 }
│ │ │ -
│ │ │ -
643
│ │ │ -
│ │ │ -
645 static vector_type vectorized(const Scalar& _s) {
│ │ │ -
646 return vector_type().vectorize(_s);
│ │ │ -
647 }
│ │ │ -
│ │ │ -
648
│ │ │ -
│ │ │ -
650 bool operator<(const vector_type& _rhs) const {
│ │ │ -
651 return std::lexicographical_compare(
│ │ │ -
652 values_.begin(), values_.end(),
│ │ │ -
653 _rhs.values_.begin(), _rhs.values_.end());
│ │ │ -
654 }
│ │ │ -
│ │ │ -
655
│ │ │ -
│ │ │ -
657 void swap(VectorT& _other)
│ │ │ -
658 noexcept(noexcept(std::swap(values_, _other.values_))) {
│ │ │ -
659 std::swap(values_, _other.values_);
│ │ │ -
660 }
│ │ │ -
│ │ │ -
661
│ │ │ -
662 //------------------------------------------------------------ component iterators
│ │ │ -
663
│ │ │ -
665
│ │ │ -
666
│ │ │ -
667 using iterator = typename container::iterator;
│ │ │ -
668 using const_iterator = typename container::const_iterator;
│ │ │ -
669 using reverse_iterator = typename container::reverse_iterator;
│ │ │ -
670 using const_reverse_iterator = typename container::const_reverse_iterator;
│ │ │ -
671
│ │ │ -
672 iterator begin() noexcept { return values_.begin(); }
│ │ │ -
673 const_iterator begin() const noexcept { return values_.cbegin(); }
│ │ │ -
674 const_iterator cbegin() const noexcept { return values_.cbegin(); }
│ │ │ -
675
│ │ │ -
676 iterator end() noexcept { return values_.end(); }
│ │ │ -
677 const_iterator end() const noexcept { return values_.cend(); }
│ │ │ -
678 const_iterator cend() const noexcept { return values_.cend(); }
│ │ │ -
679
│ │ │ -
680 reverse_iterator rbegin() noexcept { return values_.rbegin(); }
│ │ │ -
681 const_reverse_iterator rbegin() const noexcept { return values_.crbegin(); }
│ │ │ -
682 const_reverse_iterator crbegin() const noexcept { return values_.crbegin(); }
│ │ │ -
683
│ │ │ -
684 reverse_iterator rend() noexcept { return values_.rend(); }
│ │ │ -
685 const_reverse_iterator rend() const noexcept { return values_.crend(); }
│ │ │ -
686 const_reverse_iterator crend() const noexcept { return values_.crend(); }
│ │ │ -
687
│ │ │ -
689};
│ │ │ -
│ │ │ -
690
│ │ │ -
692template<typename Scalar, int DIM, typename OtherScalar>
│ │ │ -
│ │ │ -
693auto operator*(const OtherScalar& _s, const VectorT<Scalar, DIM> &rhs) ->
│ │ │ -
694 decltype(rhs.operator*(_s)) {
│ │ │ -
695
│ │ │ -
696 return rhs * _s;
│ │ │ -
697}
│ │ │ -
│ │ │ -
698
│ │ │ -
700template<typename Scalar, int DIM>
│ │ │ -
701auto operator<<(std::ostream& os, const VectorT<Scalar, DIM> &_vec) ->
│ │ │ -
702 typename std::enable_if<
│ │ │ -
703 sizeof(decltype(os << _vec[0])) >= 0, std::ostream&>::type {
│ │ │ -
704
│ │ │ -
705 os << _vec[0];
│ │ │ -
706 for (int i = 1; i < DIM; ++i) {
│ │ │ -
707 os << " " << _vec[i];
│ │ │ -
708 }
│ │ │ -
709 return os;
│ │ │ -
710}
│ │ │ -
711
│ │ │ -
713template<typename Scalar, int DIM>
│ │ │ -
714auto operator>> (std::istream& is, VectorT<Scalar, DIM> &_vec) ->
│ │ │ -
715 typename std::enable_if<
│ │ │ -
716 sizeof(decltype(is >> _vec[0])) >= 0, std::istream &>::type {
│ │ │ -
717 for (int i = 0; i < DIM; ++i)
│ │ │ -
718 is >> _vec[i];
│ │ │ -
719 return is;
│ │ │ -
720}
│ │ │ -
721
│ │ │ -
724template<typename Scalar, int DIM>
│ │ │ -
│ │ │ -
725Scalar dot(const VectorT<Scalar, DIM>& _v1, const VectorT<Scalar, DIM>& _v2) {
│ │ │ -
726 return (_v1 | _v2);
│ │ │ -
727}
│ │ │ -
│ │ │ -
728
│ │ │ -
731template<typename LScalar, typename RScalar, int DIM>
│ │ │ -
732auto
│ │ │ -
│ │ │ - │ │ │ -
734 decltype(_v1 % _v2) {
│ │ │ -
735 return (_v1 % _v2);
│ │ │ -
736}
│ │ │ -
│ │ │ -
737
│ │ │ -
740template<typename Scalar, int DIM>
│ │ │ -
│ │ │ - │ │ │ -
742noexcept(noexcept(_v1.swap(_v2))) {
│ │ │ -
743 _v1.swap(_v2);
│ │ │ -
744}
│ │ │ -
│ │ │ -
745
│ │ │ -
748template<typename Scalar, int DIM>
│ │ │ -
│ │ │ -
749Scalar norm(const VectorT<Scalar, DIM>& _v) {
│ │ │ -
750 return _v.norm();
│ │ │ -
751}
│ │ │ -
│ │ │ -
752
│ │ │ -
755template<typename Scalar, int DIM>
│ │ │ -
│ │ │ -
756Scalar sqrnorm(const VectorT<Scalar, DIM>& _v) {
│ │ │ -
757 return _v.sqrnorm();
│ │ │ -
758}
│ │ │ -
│ │ │ -
761template<typename Scalar, int DIM, typename OtherScalar>
│ │ │ -
│ │ │ - │ │ │ -
763 return _v.vectorize(_val);
│ │ │ -
764}
│ │ │ -
│ │ │ -
765
│ │ │ -
768template<typename Scalar, int DIM>
│ │ │ -
│ │ │ - │ │ │ -
770 return _v.normalize();
│ │ │ -
771}
│ │ │ -
│ │ │ -
772
│ │ │ -
775template<typename Scalar, int DIM>
│ │ │ -
│ │ │ - │ │ │ -
777 return _v1.maximize(_v2);
│ │ │ -
778}
│ │ │ -
│ │ │ -
779
│ │ │ -
782template<typename Scalar, int DIM>
│ │ │ -
│ │ │ - │ │ │ -
784 return _v1.minimize(_v2);
│ │ │ -
785}
│ │ │ -
│ │ │ -
786
│ │ │ -
789template<typename Scalar, int DIM>
│ │ │ -
│ │ │ - │ │ │ -
791 return _v1.max(_v2);
│ │ │ -
792}
│ │ │ -
│ │ │ -
793
│ │ │ -
796template<typename Scalar, int DIM>
│ │ │ -
│ │ │ - │ │ │ -
798 return _v1.min(_v2);
│ │ │ -
799}
│ │ │ -
│ │ │ -
800
│ │ │ -
801
│ │ │ -
802//== TYPEDEFS =================================================================
│ │ │ -
803
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
820
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
837
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
856
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
873
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
890
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
907
│ │ │ -
908} // namespace OpenMesh
│ │ │ -
909
│ │ │ -
918constexpr OpenMesh::Vec4f operator"" _htmlColor(unsigned long long raw_color) {
│ │ │ -
919 return OpenMesh::Vec4f(
│ │ │ -
920 ((raw_color >> 24) & 0xFF) / 255.0f,
│ │ │ -
921 ((raw_color >> 16) & 0xFF) / 255.0f,
│ │ │ -
922 ((raw_color >> 8) & 0xFF) / 255.0f,
│ │ │ -
923 ((raw_color >> 0) & 0xFF) / 255.0f);
│ │ │ -
924}
│ │ │ -
925
│ │ │ -
926#endif /* OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ */
│ │ │ +
188}//namespace OpenMesh
│ │ │ +
189
│ │ │ +
190#endif//LOOPSCHEMEMASKT_HH
│ │ │ +
191
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition Vector11T.hh:693
│ │ │ -
VectorT< float, 4 > Vec4f
4-float vector
Definition Vector11T.hh:870
│ │ │ -
Definition Vector11T.hh:83
│ │ │ -
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition Vector11T.hh:639
│ │ │ -
const Scalar & operator[](size_t _i) const
get i'th element read-only
Definition Vector11T.hh:215
│ │ │ -
VectorT< Scalar, DIM > & normalize(VectorT< Scalar, DIM > &_v)
non-member normalize
Definition Vector11T.hh:769
│ │ │ -
VectorT(Iterator it)
construct from a value array or any other iterator
Definition Vector11T.hh:168
│ │ │ -
auto cross(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this % _rhs)
cross product: only defined for Vec3* as specialization
Definition Vector11T.hh:389
│ │ │ -
Scalar dot(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
symmetric version of the dot product
Definition Vector11T.hh:725
│ │ │ -
Scalar * data()
access to Scalar array
Definition Vector11T.hh:201
│ │ │ -
auto operator*(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0
component-wise vector multiplication
│ │ │ -
VectorT< Scalar, DIM > & minimize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
non-member minimize
Definition Vector11T.hh:783
│ │ │ -
auto operator+(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0
component-wise vector addition
│ │ │ -
VectorT< Scalar, DIM > vector_type
type of this vector
Definition Vector11T.hh:99
│ │ │ -
static constexpr int dim()
returns dimension of the vector (deprecated)
Definition Vector11T.hh:102
│ │ │ -
decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const
compute squared euclidean norm
Definition Vector11T.hh:422
│ │ │ -
static constexpr size_t size()
returns dimension of the vector
Definition Vector11T.hh:107
│ │ │ -
const Scalar * data() const
access to const Scalar array
Definition Vector11T.hh:204
│ │ │ -
VectorT< Scalar, DIM > & vectorize(VectorT< Scalar, DIM > &_v, OtherScalar const &_val)
non-member vectorize
Definition Vector11T.hh:762
│ │ │ -
void swap(VectorT &_other) noexcept(noexcept(std::swap(values_, _other.values_)))
swap with another vector
Definition Vector11T.hh:657
│ │ │ -
Scalar max_abs() const
return the maximal absolute component
Definition Vector11T.hh:523
│ │ │ -
vector_type min(const vector_type &_rhs) const
component-wise min
Definition Vector11T.hh:616
│ │ │ -
VectorT< Scalar, DIM > min(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
non-member min
Definition Vector11T.hh:797
│ │ │ -
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition Vector11T.hh:588
│ │ │ -
Scalar sqrnorm(const VectorT< Scalar, DIM > &_v)
non-member sqrnorm
Definition Vector11T.hh:756
│ │ │ -
auto cross(const VectorT< LScalar, DIM > &_v1, const VectorT< RScalar, DIM > &_v2) -> decltype(_v1 % _v2)
symmetric version of the cross product
Definition Vector11T.hh:733
│ │ │ -
auto operator|(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this->data() **_rhs.data())
compute scalar product
Definition Vector11T.hh:399
│ │ │ -
auto operator-(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0
component-wise vector difference
│ │ │ -
vector_type &::type normalize_cond()
compute squared euclidean norm
Definition Vector11T.hh:481
│ │ │ -
VectorT< Scalar, DIM > & maximize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
non-member maximize
Definition Vector11T.hh:776
│ │ │ -
void swap(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2) noexcept(noexcept(_v1.swap(_v2)))
non-member swap
Definition Vector11T.hh:741
│ │ │ -
VectorT< Scalar, DIM > max(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
non-member max
Definition Vector11T.hh:790
│ │ │ -
auto operator-=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0
vector difference from this
│ │ │ -
auto operator*=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0
component-wise self-multiplication
│ │ │ -
auto operator/=(const OtherScalar &_s) -> typename std::enable_if< std::is_convertible< decltype(this->values_[0]/_s), Scalar >::value, VectorT< Scalar, DIM > & >::type
component-wise self-division by scalar
Definition Vector11T.hh:248
│ │ │ -
vector_type max(const vector_type &_rhs) const
component-wise max
Definition Vector11T.hh:621
│ │ │ -
vector_type & operator=(const VectorT< OtherScalar, DIM > &_rhs)
cast from vector with a different scalar type
Definition Vector11T.hh:192
│ │ │ -
auto operator/=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0
component-wise self-division
│ │ │ -
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition Vector11T.hh:560
│ │ │ -
static vector_type vectorized(const Scalar &_s)
store the same value in each component
Definition Vector11T.hh:645
│ │ │ -
Scalar l8_norm() const
compute l8_norm
Definition Vector11T.hh:506
│ │ │ -
Scalar min_abs() const
return the minimal absolute component
Definition Vector11T.hh:537
│ │ │ -
VectorT(const Scalar &v)
Creates a vector with all components set to v.
Definition Vector11T.hh:134
│ │ │ -
auto length() const -> decltype(std::declval< VectorT< S, DIM > >().norm())
compute squared euclidean norm
Definition Vector11T.hh:443
│ │ │ -
auto operator/(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0
component-wise vector division
│ │ │ -
vector_type operator-(void) const
unary minus
Definition Vector11T.hh:365
│ │ │ -
bool operator<(const vector_type &_rhs) const
lexicographical comparison
Definition Vector11T.hh:650
│ │ │ -
bool minimized(const vector_type &_rhs)
minimize values and signalize coordinate minimization
Definition Vector11T.hh:571
│ │ │ -
auto homogenized() const -> typename std::enable_if< D==4, VectorT< decltype(std::declval< S >()/std::declval< S >()), DIM > >::type
Only for 4-component vectors with division operator on their Scalar: Dehomogenization.
Definition Vector11T.hh:148
│ │ │ -
Scalar mean_abs() const
return absolute arithmetic mean
Definition Vector11T.hh:551
│ │ │ -
Scalar l1_norm() const
compute L1 (Manhattan) norm
Definition Vector11T.hh:500
│ │ │ -
Scalar value_type
the type of the scalar used in this template
Definition Vector11T.hh:96
│ │ │ -
auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs)
compute scalar product
Definition Vector11T.hh:409
│ │ │ -
VectorT(const VectorT< otherScalarType, DIM > &_rhs)
copy & cast constructor (explicit)
Definition Vector11T.hh:182
│ │ │ -
Scalar mean() const
return arithmetic mean
Definition Vector11T.hh:546
│ │ │ -
auto operator*=(const OtherScalar &_s) -> typename std::enable_if< std::is_convertible< decltype(this->values_[0] *_s), Scalar >::value, VectorT< Scalar, DIM > & >::type
component-wise self-multiplication with scalar
Definition Vector11T.hh:236
│ │ │ -
auto operator+=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0
vector self-addition
│ │ │ -
constexpr VectorT()
default constructor creates uninitialized values.
Definition Vector11T.hh:129
│ │ │ -
vector_type apply(const Functor &_func) const
component-wise apply function object with Scalar operator()(Scalar).
Definition Vector11T.hh:631
│ │ │ -
bool operator==(const vector_type &_rhs) const
component-wise comparison
Definition Vector11T.hh:223
│ │ │ -
bool operator!=(const vector_type &_rhs) const
component-wise comparison
Definition Vector11T.hh:228
│ │ │ -
Scalar max() const
return the maximal component
Definition Vector11T.hh:518
│ │ │ -
bool maximized(const vector_type &_rhs)
maximize values and signalize coordinate maximization
Definition Vector11T.hh:599
│ │ │ -
auto normalize() -> decltype(*this/=std::declval< VectorT< S, DIM > >().norm())
normalize vector, return normalized vector
Definition Vector11T.hh:454
│ │ │ -
Scalar & operator[](size_t _i)
get i'th element read-write
Definition Vector11T.hh:209
│ │ │ -
auto norm() const -> decltype(std::sqrt(std::declval< VectorT< S, DIM > >().sqrnorm()))
compute euclidean norm
Definition Vector11T.hh:434
│ │ │ -
Scalar min() const
return the minimal component
Definition Vector11T.hh:532
│ │ │ -
auto normalized() const -> decltype(*this/std::declval< VectorT< S, DIM > >().norm())
return normalized vector
Definition Vector11T.hh:465
│ │ │ -
auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), DIM > >::type
cross product: only defined for Vec3* as specialization
Definition Vector11T.hh:375
│ │ │ -
Scalar norm(const VectorT< Scalar, DIM > &_v)
non-member norm
Definition Vector11T.hh:749
│ │ │ -
VectorT(container &&_array)
construct from an array
Definition Vector11T.hh:173
│ │ │ -
Definition VectorT_inc.hh:68
│ │ │ +
implements cache for the weights of the original Loop scheme supported:
Definition LoopSchemeMaskT.hh:67
│ │ │ +
A simple singleton template.
Definition SingletonT.hh:77
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -Vector11T.hh │ │ │ │ +LoopSchemeMaskT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,1070 +45,165 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42#ifndef OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ │ │ │ │ -43#define OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ │ │ │ │ +42 │ │ │ │ +43 │ │ │ │ 44 │ │ │ │ -45#include │ │ │ │ -46#include │ │ │ │ -47#include │ │ │ │ -48#include │ │ │ │ -49#include │ │ │ │ -50#include │ │ │ │ -51#include │ │ │ │ -52#include │ │ │ │ -53#include │ │ │ │ -54#include │ │ │ │ -55 │ │ │ │ -56// This header is not needed by this file but expected by others including │ │ │ │ -57// this file. │ │ │ │ -58#include │ │ │ │ -59 │ │ │ │ -60 │ │ │ │ -61/* │ │ │ │ -62 * Helpers for VectorT │ │ │ │ -63 */ │ │ │ │ -64namespace { │ │ │ │ -65 │ │ │ │ -66template │ │ │ │ -67struct are_convertible_to; │ │ │ │ -68 │ │ │ │ -69template │ │ │ │ -70struct are_convertible_to { │ │ │ │ -71 static constexpr bool value = std::is_convertible::value │ │ │ │ -72 && are_convertible_to::value; │ │ │ │ -73}; │ │ │ │ -74 │ │ │ │ -75template │ │ │ │ -76struct are_convertible_to : public std::is_convertible { │ │ │ │ -77}; │ │ │ │ -78} │ │ │ │ +45#ifndef LOOPSCHEMEMASKT_HH │ │ │ │ +46#define LOOPSCHEMEMASKT_HH │ │ │ │ +47 │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50 │ │ │ │ +51#include │ │ │ │ +52#include │ │ │ │ +53 │ │ │ │ +54namespace _O_p_e_n_M_e_s_h │ │ │ │ +55{ │ │ │ │ +56 │ │ │ │ +65template │ │ │ │ +_6_6class _L_o_o_p_S_c_h_e_m_e_M_a_s_k_T │ │ │ │ +67{ │ │ │ │ +68public: │ │ │ │ +69 enum { cache_size = cache_size_ }; │ │ │ │ +70 typedef T_ Scalar; │ │ │ │ +71 │ │ │ │ +72protected: │ │ │ │ +73 │ │ │ │ +74 Scalar proj_weights_[cache_size]; │ │ │ │ +75 Scalar limit_weights_[cache_size]; │ │ │ │ +76 Scalar step_weights_[cache_size]; │ │ │ │ +77 std::vector tang0_weights_[cache_size]; │ │ │ │ +78 std::vector tang1_weights_[cache_size]; │ │ │ │ 79 │ │ │ │ -80namespace _O_p_e_n_M_e_s_h { │ │ │ │ +80protected: │ │ │ │ 81 │ │ │ │ -82template │ │ │ │ -_8_3class _V_e_c_t_o_r_T { │ │ │ │ -84 │ │ │ │ -85 static_assert(DIM >= 1, "VectorT requires positive dimensionality."); │ │ │ │ -86 │ │ │ │ -87 private: │ │ │ │ -88 using container = std::array; │ │ │ │ -89 container values_; │ │ │ │ -90 │ │ │ │ -91 public: │ │ │ │ -92 │ │ │ │ -93 //---------------------------------------------------------------- class │ │ │ │ -info │ │ │ │ -94 │ │ │ │ -_9_6 typedef Scalar _v_a_l_u_e___t_y_p_e; │ │ │ │ +82 inline static Scalar compute_proj_weight(uint _valence) │ │ │ │ +83 { │ │ │ │ +84 //return pow(3.0 / 2.0 + cos(2.0 * M_PI / _valence), 2) / 2.0 - 1.0; │ │ │ │ +85 double denom = (3.0 + 2.0*cos(2.0*M_PI/(double)_valence)); │ │ │ │ +86 double weight = (64.0*_valence)/(40.0 - denom*denom) - _valence; │ │ │ │ +87 return (Scalar) weight; │ │ │ │ +88 } │ │ │ │ +89 │ │ │ │ +90 inline static Scalar compute_limit_weight(uint _valence) │ │ │ │ +91 { │ │ │ │ +92 double proj_weight_value = compute_proj_weight(_valence); │ │ │ │ +93 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);// │ │ │ │ +normalize the proj_weight │ │ │ │ +94 double weight = (3.0/8.0)/(1.0 - proj_weight_value + (3.0/8.0)); │ │ │ │ +95 return (Scalar)weight; │ │ │ │ +96 } │ │ │ │ 97 │ │ │ │ -_9_9 typedef _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> _v_e_c_t_o_r___t_y_p_e; │ │ │ │ -100 │ │ │ │ -_1_0_2 static constexpr int _d_i_m() { │ │ │ │ -103 return DIM; │ │ │ │ +98 inline static Scalar compute_step_weight(uint _valence) │ │ │ │ +99 { │ │ │ │ +100 double proj_weight_value = compute_proj_weight(_valence); │ │ │ │ +101 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);// │ │ │ │ +normalize the proj_weight │ │ │ │ +102 double weight = proj_weight_value - (3.0/8.0); │ │ │ │ +103 return (Scalar)weight; │ │ │ │ 104 } │ │ │ │ 105 │ │ │ │ -_1_0_7 static constexpr size_t _s_i_z_e() { │ │ │ │ -108 return DIM; │ │ │ │ +106 inline static Scalar compute_tang0_weight(uint _valence, uint _ver_id) │ │ │ │ +107 { │ │ │ │ +108 return (Scalar)cos(2.0*M_PI*(double)_ver_id/(double)_valence); │ │ │ │ 109 } │ │ │ │ 110 │ │ │ │ -111 static constexpr const size_t size_ = DIM; │ │ │ │ -112 │ │ │ │ -113 //------------------------------------------------------------- │ │ │ │ -- constructors │ │ │ │ -114 │ │ │ │ -115 // Converting constructor: Constructs the vector from DIM values (of │ │ │ │ -116 // potentially heterogenous types) which are all convertible to Scalar. │ │ │ │ -117 template::type, │ │ │ │ -119 typename = typename std::enable_if< │ │ │ │ -120 are_convertible_to::value>::type> │ │ │ │ -121 constexpr _V_e_c_t_o_r_T(T v, Ts... vs) : values_ { {static_cast(v), │ │ │ │ -static_cast(vs)...} } { │ │ │ │ -122 static_assert(sizeof...(Ts)+1 == DIM, │ │ │ │ -123 "Invalid number of components specified in constructor."); │ │ │ │ -124 static_assert(are_convertible_to::value, │ │ │ │ -125 "Not all components are convertible to Scalar."); │ │ │ │ -126 } │ │ │ │ -127 │ │ │ │ -_1_2_9 constexpr _V_e_c_t_o_r_T() {} │ │ │ │ -130 │ │ │ │ -_1_3_4 explicit _V_e_c_t_o_r_T(const Scalar &v) { │ │ │ │ -135 _v_e_c_t_o_r_i_z_e(v); │ │ │ │ -136 } │ │ │ │ -137 │ │ │ │ -138 _V_e_c_t_o_r_T(const _V_e_c_t_o_r_T &rhs) = default; │ │ │ │ -139 _V_e_c_t_o_r_T(_V_e_c_t_o_r_T &&rhs) = default; │ │ │ │ -140 _V_e_c_t_o_r_T &operator=(const _V_e_c_t_o_r_T &rhs) = default; │ │ │ │ -141 _V_e_c_t_o_r_T &operator=(_V_e_c_t_o_r_T &&rhs) = default; │ │ │ │ -142 │ │ │ │ -147 template │ │ │ │ -_1_4_8 auto _h_o_m_o_g_e_n_i_z_e_d() const -> │ │ │ │ -149 typename std::enable_if()/std::declval()), DIM>>::type { │ │ │ │ -151 static_assert(D == DIM, "D and DIM need to be identical. (Never " │ │ │ │ -152 "override the default template arguments.)"); │ │ │ │ -153 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -154 "to be the same type. (Never override the default template " │ │ │ │ -155 "arguments.)"); │ │ │ │ -156 return _V_e_c_t_o_r_T( │ │ │ │ -157 values_[0]/values_[3], │ │ │ │ -158 values_[1]/values_[3], │ │ │ │ -159 values_[2]/values_[3], │ │ │ │ -160 1); │ │ │ │ -161 } │ │ │ │ -162 │ │ │ │ -164 template(), void(), │ │ │ │ -167 ++std::declval(), void())> │ │ │ │ -_1_6_8 explicit _V_e_c_t_o_r_T(Iterator it) { │ │ │ │ -169 std::copy_n(it, DIM, values_.begin()); │ │ │ │ -170 } │ │ │ │ -171 │ │ │ │ -_1_7_3 explicit _V_e_c_t_o_r_T(container&& _array) : │ │ │ │ -174 values_(_array) │ │ │ │ -175 { │ │ │ │ -176 } │ │ │ │ -177 │ │ │ │ -179 template::value>> │ │ │ │ -_1_8_2 explicit _V_e_c_t_o_r_T(const _V_e_c_t_o_r_T_<_o_t_h_e_r_S_c_a_l_a_r_T_y_p_e_,_ _D_I_M_>& _rhs) { │ │ │ │ -183 operator=(_rhs); │ │ │ │ -184 } │ │ │ │ -185 │ │ │ │ -186 //-------------------------------------------------------------------- │ │ │ │ -- casts │ │ │ │ +111 inline static Scalar compute_tang1_weight(uint _valence, uint _ver_id) │ │ │ │ +112 { │ │ │ │ +113 return (Scalar)sin(2.0*M_PI*(double)_ver_id/(double)_valence); │ │ │ │ +114 } │ │ │ │ +115 │ │ │ │ +116 void cache_weights() │ │ │ │ +117 { │ │ │ │ +118 proj_weights_[0] = 1; │ │ │ │ +119 for (uint k = 1; k < cache_size; ++k) │ │ │ │ +120 { │ │ │ │ +121 proj_weights_[k] = compute_proj_weight(k); │ │ │ │ +122 limit_weights_[k] = compute_limit_weight(k); │ │ │ │ +123 step_weights_[k] = compute_step_weight(k); │ │ │ │ +124 tang0_weights_[k].resize(k); │ │ │ │ +125 tang1_weights_[k].resize(k); │ │ │ │ +126 for (uint i = 0; i < k; ++i) │ │ │ │ +127 { │ │ │ │ +128 tang0_weights_[k][i] = compute_tang0_weight(k,i); │ │ │ │ +129 tang1_weights_[k][i] = compute_tang1_weight(k,i); │ │ │ │ +130 } │ │ │ │ +131 } │ │ │ │ +132 } │ │ │ │ +133 │ │ │ │ +134public: │ │ │ │ +135 │ │ │ │ +136 _L_o_o_p_S_c_h_e_m_e_M_a_s_k_T() │ │ │ │ +137 { │ │ │ │ +138 cache_weights(); │ │ │ │ +139 } │ │ │ │ +140 │ │ │ │ +141 inline Scalar proj_weight(uint _valence) const │ │ │ │ +142 { │ │ │ │ +143 assert(_valence < cache_size ); │ │ │ │ +144 return proj_weights_[_valence]; │ │ │ │ +145 } │ │ │ │ +146 │ │ │ │ +147 inline Scalar limit_weight(uint _valence) const │ │ │ │ +148 { │ │ │ │ +149 assert(_valence < cache_size ); │ │ │ │ +150 return limit_weights_[_valence]; │ │ │ │ +151 } │ │ │ │ +152 │ │ │ │ +153 inline Scalar step_weight(uint _valence, uint _step) const │ │ │ │ +154 { │ │ │ │ +155 assert(_valence < cache_size); │ │ │ │ +156 return pow(step_weights_[_valence], (int)_step);//can be precomputed │ │ │ │ +157 } │ │ │ │ +158 │ │ │ │ +159 inline Scalar tang0_weight(uint _valence, uint _ver_id) const │ │ │ │ +160 { │ │ │ │ +161 assert(_valence < cache_size ); │ │ │ │ +162 assert(_ver_id < _valence); │ │ │ │ +163 return tang0_weights_[_valence][_ver_id]; │ │ │ │ +164 } │ │ │ │ +165 │ │ │ │ +166 inline Scalar tang1_weight(uint _valence, uint _ver_id) const │ │ │ │ +167 { │ │ │ │ +168 assert(_valence < cache_size ); │ │ │ │ +169 assert(_ver_id < _valence); │ │ │ │ +170 return tang1_weights_[_valence][_ver_id]; │ │ │ │ +171 } │ │ │ │ +172 │ │ │ │ +173 void dump(uint _max_valency = cache_size - 1) const │ │ │ │ +174 { │ │ │ │ +175 assert(_max_valency <= cache_size - 1); │ │ │ │ +176 //CConsole::printf("(k : pw_k, lw_k): "); │ │ │ │ +177 for (uint i = 0; i <= _max_valency; ++i) │ │ │ │ +178 { │ │ │ │ +179 //CConsole::stream() << "(" << i << " : " << proj_weight(i) << ", " << │ │ │ │ +limit_weight(i) << ", " << step_weight(i,1) << "), "; │ │ │ │ +180 } │ │ │ │ +181 //CConsole::printf("\n"); │ │ │ │ +182 } │ │ │ │ +183}; │ │ │ │ +184 │ │ │ │ +185typedef _L_o_o_p_S_c_h_e_m_e_M_a_s_k_T_<_d_o_u_b_l_e_,_ _1_0_0_> _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e; │ │ │ │ +186typedef _S_i_n_g_l_e_t_o_n_T_<_L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e_> _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e_S_i_n_g_l_e_t_o_n; │ │ │ │ 187 │ │ │ │ -189 template::value>> │ │ │ │ -_1_9_2 _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) { │ │ │ │ -193 std::transform(_rhs.cbegin(), _rhs.cend(), │ │ │ │ -194 this->begin(), [](OtherScalar rhs) { │ │ │ │ -195 return static_cast(std::move(rhs)); │ │ │ │ -196 }); │ │ │ │ -197 return *this; │ │ │ │ -198 } │ │ │ │ -199 │ │ │ │ -_2_0_1 Scalar* _d_a_t_a() { return values_.data(); } │ │ │ │ -202 │ │ │ │ -_2_0_4 const Scalar* _d_a_t_a() const { return values_.data(); } │ │ │ │ -205 │ │ │ │ -206 //----------------------------------------------------------- element │ │ │ │ -access │ │ │ │ -207 │ │ │ │ -_2_0_9 Scalar& _o_p_e_r_a_t_o_r_[_](size_t _i) { │ │ │ │ -210 assert(_i < DIM); │ │ │ │ -211 return values_[_i]; │ │ │ │ -212 } │ │ │ │ -213 │ │ │ │ -_2_1_5 const Scalar& _o_p_e_r_a_t_o_r_[_](size_t _i) const { │ │ │ │ -216 assert(_i < DIM); │ │ │ │ -217 return values_[_i]; │ │ │ │ -218 } │ │ │ │ -219 │ │ │ │ -220 //--------------------------------------------------------------- │ │ │ │ -- comparsion │ │ │ │ -221 │ │ │ │ -_2_2_3 bool _o_p_e_r_a_t_o_r_=_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -224 return std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), │ │ │ │ -values_.cbegin()); │ │ │ │ -225 } │ │ │ │ -226 │ │ │ │ -_2_2_8 bool _o_p_e_r_a_t_o_r_!_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -229 return !std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), │ │ │ │ -values_.cbegin()); │ │ │ │ -230 } │ │ │ │ -231 │ │ │ │ -232 //---------------------------------------------------------- scalar │ │ │ │ -operators │ │ │ │ -233 │ │ │ │ -235 template │ │ │ │ -_2_3_6 auto _o_p_e_r_a_t_o_r_*_=(const OtherScalar& _s) -> │ │ │ │ -237 typename std::enable_ifvalues_[0] * _s), Scalar>::value, │ │ │ │ -239 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>&>::type { │ │ │ │ -240 for (auto& e : *this) { │ │ │ │ -241 e *= _s; │ │ │ │ -242 } │ │ │ │ -243 return *this; │ │ │ │ -244 } │ │ │ │ -245 │ │ │ │ -247 template │ │ │ │ -_2_4_8 auto _o_p_e_r_a_t_o_r_/_=(const OtherScalar& _s) -> │ │ │ │ -249 typename std::enable_ifvalues_[0] / _s), Scalar>::value, │ │ │ │ -251 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>&>::type { │ │ │ │ -252 for (auto& e : *this) { │ │ │ │ -253 e /= _s; │ │ │ │ -254 } │ │ │ │ -255 return *this; │ │ │ │ -256 } │ │ │ │ -257 │ │ │ │ -259 template │ │ │ │ -260 typename std::enable_if() * std::declval()), │ │ │ │ -262 Scalar>::value, │ │ │ │ -263 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>>::type │ │ │ │ -264 operator*(const OtherScalar& _s) const { │ │ │ │ -265 return _v_e_c_t_o_r___t_y_p_e(*this) *= _s; │ │ │ │ -266 } │ │ │ │ -267 │ │ │ │ -269 template │ │ │ │ -270 typename std::enable_if() / std::declval()), │ │ │ │ -272 Scalar>::value, │ │ │ │ -273 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>>::type │ │ │ │ -274 operator/(const OtherScalar& _s) const { │ │ │ │ -275 return _v_e_c_t_o_r___t_y_p_e(*this) /= _s; │ │ │ │ -276 } │ │ │ │ -277 │ │ │ │ -278 //---------------------------------------------------------- vector │ │ │ │ -operators │ │ │ │ -279 │ │ │ │ -281 template │ │ │ │ -_2_8_2 auto _o_p_e_r_a_t_o_r_*_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ -283 typename std::enable_if< │ │ │ │ -284 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0, │ │ │ │ -285 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ -286 for (int i = 0; i < DIM; ++i) { │ │ │ │ -287 _d_a_t_a()[i] *= _rhs._d_a_t_a()[i]; │ │ │ │ -288 } │ │ │ │ -289 return *this; │ │ │ │ -290 } │ │ │ │ -291 │ │ │ │ -293 template │ │ │ │ -_2_9_4 auto _o_p_e_r_a_t_o_r_/_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ -295 typename std::enable_if< │ │ │ │ -296 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0, │ │ │ │ -297 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ -298 for (int i = 0; i < DIM; ++i) { │ │ │ │ -299 _d_a_t_a()[i] /= _rhs._d_a_t_a()[i]; │ │ │ │ -300 } │ │ │ │ -301 return *this; │ │ │ │ -302 } │ │ │ │ -303 │ │ │ │ -305 template │ │ │ │ -_3_0_6 auto _o_p_e_r_a_t_o_r_-_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ -307 typename std::enable_if< │ │ │ │ -308 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0, │ │ │ │ -309 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ -310 for (int i = 0; i < DIM; ++i) { │ │ │ │ -311 _d_a_t_a()[i] -= _rhs._d_a_t_a()[i]; │ │ │ │ -312 } │ │ │ │ -313 return *this; │ │ │ │ -314 } │ │ │ │ -315 │ │ │ │ -317 template │ │ │ │ -_3_1_8 auto _o_p_e_r_a_t_o_r_+_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ -319 typename std::enable_if< │ │ │ │ -320 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0, │ │ │ │ -321 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ -322 for (int i = 0; i < DIM; ++i) { │ │ │ │ -323 _d_a_t_a()[i] += _rhs._d_a_t_a()[i]; │ │ │ │ -324 } │ │ │ │ -325 return *this; │ │ │ │ -326 } │ │ │ │ -327 │ │ │ │ -329 template │ │ │ │ -_3_3_0 auto _o_p_e_r_a_t_o_r_*(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ -331 typename std::enable_if< │ │ │ │ -332 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0, │ │ │ │ -333 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ -334 return _v_e_c_t_o_r___t_y_p_e(*this) *= _rhs; │ │ │ │ -335 } │ │ │ │ -336 │ │ │ │ -338 template │ │ │ │ -_3_3_9 auto _o_p_e_r_a_t_o_r_/(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ -340 typename std::enable_if< │ │ │ │ -341 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0, │ │ │ │ -342 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ -343 return _v_e_c_t_o_r___t_y_p_e(*this) /= _rhs; │ │ │ │ -344 } │ │ │ │ -345 │ │ │ │ -347 template │ │ │ │ -_3_4_8 auto _o_p_e_r_a_t_o_r_+(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ -349 typename std::enable_if< │ │ │ │ -350 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0, │ │ │ │ -351 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ -352 return _v_e_c_t_o_r___t_y_p_e(*this) += _rhs; │ │ │ │ -353 } │ │ │ │ -354 │ │ │ │ -356 template │ │ │ │ -_3_5_7 auto _o_p_e_r_a_t_o_r_-(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ -358 typename std::enable_if< │ │ │ │ -359 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0, │ │ │ │ -360 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ -361 return _v_e_c_t_o_r___t_y_p_e(*this) -= _rhs; │ │ │ │ -362 } │ │ │ │ -363 │ │ │ │ -_3_6_5 _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_-(void) const { │ │ │ │ -366 _v_e_c_t_o_r___t_y_p_e v; │ │ │ │ -367 std::transform(values_.begin(), values_.end(), v.values_.begin(), │ │ │ │ -368 [](const Scalar &s) { return -s; }); │ │ │ │ -369 return v; │ │ │ │ -370 } │ │ │ │ -371 │ │ │ │ -374 template │ │ │ │ -_3_7_5 auto _o_p_e_r_a_t_o_r_%_ (const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_> &_rhs) const -> │ │ │ │ -376 typename std::enable_if>::type { │ │ │ │ -379 return { │ │ │ │ -380 values_[1] * _rhs[2] - values_[2] * _rhs[1], │ │ │ │ -381 values_[2] * _rhs[0] - values_[0] * _rhs[2], │ │ │ │ -382 values_[0] * _rhs[1] - values_[1] * _rhs[0] │ │ │ │ -383 }; │ │ │ │ -384 } │ │ │ │ -385 │ │ │ │ -388 template │ │ │ │ -_3_8_9 auto _c_r_o_s_s (const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_> &_rhs) const -> │ │ │ │ -390 decltype(*this % _rhs) │ │ │ │ -391 { │ │ │ │ -392 return *this % _rhs; │ │ │ │ -393 } │ │ │ │ -394 │ │ │ │ -395 │ │ │ │ -398 template │ │ │ │ -_3_9_9 auto _o_p_e_r_a_t_o_r_|(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ -400 decltype(*this->_d_a_t_a() * *_rhs.data()) { │ │ │ │ -401 │ │ │ │ -402 return std::inner_product(begin() + 1, begin() + DIM, _rhs.begin() + 1, │ │ │ │ -403 *begin() * *_rhs.begin()); │ │ │ │ -404 } │ │ │ │ -405 │ │ │ │ -408 template │ │ │ │ -_4_0_9 auto _d_o_t(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ -410 decltype(*this | _rhs) │ │ │ │ -411 { │ │ │ │ -412 return *this | _rhs; │ │ │ │ -413 } │ │ │ │ -414 │ │ │ │ -415 //------------------------------------------------------------ euclidean │ │ │ │ -norm │ │ │ │ -416 │ │ │ │ -418 │ │ │ │ -419 │ │ │ │ -421 template │ │ │ │ -_4_2_2 decltype(std::declval() * std::declval()) _s_q_r_n_o_r_m() const { │ │ │ │ -423 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -424 "to be the same type. (Never override the default template " │ │ │ │ -425 "arguments.)"); │ │ │ │ -426 typedef decltype(values_[0] * values_[0]) RESULT; │ │ │ │ -427 return std::accumulate(values_.cbegin() + 1, values_.cend(), │ │ │ │ -428 values_[0] * values_[0], │ │ │ │ -429 [](const RESULT &l, const Scalar &r) { return l + r * r; }); │ │ │ │ -430 } │ │ │ │ -431 │ │ │ │ -433 template │ │ │ │ -_4_3_4 auto _n_o_r_m() const -> │ │ │ │ -435 decltype(std::sqrt(std::declval<_V_e_c_t_o_r_T>()._s_q_r_n_o_r_m())) { │ │ │ │ -436 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -437 "to be the same type. (Never override the default template " │ │ │ │ -438 "arguments.)"); │ │ │ │ -439 return std::sqrt(_s_q_r_n_o_r_m()); │ │ │ │ -440 } │ │ │ │ -441 │ │ │ │ -442 template │ │ │ │ -_4_4_3 auto _l_e_n_g_t_h() const -> │ │ │ │ -444 decltype(std::declval<_V_e_c_t_o_r_T>()._n_o_r_m()) { │ │ │ │ -445 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -446 "to be the same type. (Never override the default template " │ │ │ │ -447 "arguments.)"); │ │ │ │ -448 return _n_o_r_m(); │ │ │ │ -449 } │ │ │ │ -450 │ │ │ │ -453 template │ │ │ │ -_4_5_4 auto _n_o_r_m_a_l_i_z_e() -> │ │ │ │ -455 decltype(*this /= std::declval>()._n_o_r_m()) { │ │ │ │ -456 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -457 "to be the same type. (Never override the default template " │ │ │ │ -458 "arguments.)"); │ │ │ │ -459 return *this /= _n_o_r_m(); │ │ │ │ -460 } │ │ │ │ -461 │ │ │ │ -464 template │ │ │ │ -_4_6_5 auto _n_o_r_m_a_l_i_z_e_d() const -> │ │ │ │ -466 decltype(*this / std::declval<_V_e_c_t_o_r_T>()._n_o_r_m()) { │ │ │ │ -467 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -468 "to be the same type. (Never override the default template " │ │ │ │ -469 "arguments.)"); │ │ │ │ -470 return *this / _n_o_r_m(); │ │ │ │ -471 } │ │ │ │ -472 │ │ │ │ -475 template │ │ │ │ -476 typename std::enable_if< │ │ │ │ -477 sizeof(decltype( │ │ │ │ -478 static_cast(0), │ │ │ │ -479 std::declval<_V_e_c_t_o_r_T_<_S_,_ _D_I_M_>>()._n_o_r_m())) >= 0, │ │ │ │ -480 _v_e_c_t_o_r___t_y_p_e&>::type │ │ │ │ -_4_8_1 _n_o_r_m_a_l_i_z_e___c_o_n_d() { │ │ │ │ -482 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ -483 "to be the same type. (Never override the default template " │ │ │ │ -484 "arguments.)"); │ │ │ │ -485 auto n = _n_o_r_m(); │ │ │ │ -486 if (n != static_cast(0)) { │ │ │ │ -487 *this /= n; │ │ │ │ -488 } │ │ │ │ -489 return *this; │ │ │ │ -490 } │ │ │ │ -491 │ │ │ │ -493 │ │ │ │ -494 //------------------------------------------------------------ euclidean │ │ │ │ -norm │ │ │ │ -495 │ │ │ │ -497 │ │ │ │ -498 │ │ │ │ -_5_0_0 Scalar _l_1___n_o_r_m() const { │ │ │ │ -501 return std::accumulate( │ │ │ │ -502 values_.cbegin() + 1, values_.cend(), values_[0]); │ │ │ │ -503 } │ │ │ │ -504 │ │ │ │ -_5_0_6 Scalar _l_8___n_o_r_m() const { │ │ │ │ -507 return _m_a_x___a_b_s(); │ │ │ │ -508 } │ │ │ │ -509 │ │ │ │ -511 │ │ │ │ -512 //------------------------------------------------------------ max, min, │ │ │ │ -mean │ │ │ │ -513 │ │ │ │ -515 │ │ │ │ -516 │ │ │ │ -_5_1_8 Scalar _m_a_x() const { │ │ │ │ -519 return *std::max_element(values_.cbegin(), values_.cend()); │ │ │ │ -520 } │ │ │ │ -521 │ │ │ │ -_5_2_3 Scalar _m_a_x___a_b_s() const { │ │ │ │ -524 return std::abs( │ │ │ │ -525 *std::max_element(values_.cbegin(), values_.cend(), │ │ │ │ -526 [](const Scalar &a, const Scalar &b) { │ │ │ │ -527 return std::abs(a) < std::abs(b); │ │ │ │ -528 })); │ │ │ │ -529 } │ │ │ │ -530 │ │ │ │ -_5_3_2 Scalar _m_i_n() const { │ │ │ │ -533 return *std::min_element(values_.cbegin(), values_.cend()); │ │ │ │ -534 } │ │ │ │ -535 │ │ │ │ -_5_3_7 Scalar _m_i_n___a_b_s() const { │ │ │ │ -538 return std::abs( │ │ │ │ -539 *std::min_element(values_.cbegin(), values_.cend(), │ │ │ │ -540 [](const Scalar &a, const Scalar &b) { │ │ │ │ -541 return std::abs(a) < std::abs(b); │ │ │ │ -542 })); │ │ │ │ -543 } │ │ │ │ -544 │ │ │ │ -_5_4_6 Scalar _m_e_a_n() const { │ │ │ │ -547 return _l_1___n_o_r_m()/DIM; │ │ │ │ -548 } │ │ │ │ -549 │ │ │ │ -_5_5_1 Scalar _m_e_a_n___a_b_s() const { │ │ │ │ -552 return std::accumulate(values_.cbegin() + 1, values_.cend(), │ │ │ │ -553 std::abs(values_[0]), │ │ │ │ -554 [](const Scalar &l, const Scalar &r) { │ │ │ │ -555 return l + std::abs(r); │ │ │ │ -556 }) / DIM; │ │ │ │ -557 } │ │ │ │ -558 │ │ │ │ -_5_6_0 _v_e_c_t_o_r___t_y_p_e& _m_i_n_i_m_i_z_e(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -561 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ -562 _rhs.values_.cbegin(), │ │ │ │ -563 values_.begin(), │ │ │ │ -564 [](const Scalar &l, const Scalar &r) { │ │ │ │ -565 return std::min(l, r); │ │ │ │ -566 }); │ │ │ │ -567 return *this; │ │ │ │ -568 } │ │ │ │ -569 │ │ │ │ -_5_7_1 bool _m_i_n_i_m_i_z_e_d(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -572 bool result = false; │ │ │ │ -573 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ -574 _rhs.values_.cbegin(), │ │ │ │ -575 values_.begin(), │ │ │ │ -576 [&result](const Scalar &l, const Scalar &r) { │ │ │ │ -577 if (l < r) { │ │ │ │ -578 return l; │ │ │ │ -579 } else { │ │ │ │ -580 result = true; │ │ │ │ -581 return r; │ │ │ │ -582 } │ │ │ │ -583 }); │ │ │ │ -584 return result; │ │ │ │ -585 } │ │ │ │ -586 │ │ │ │ -_5_8_8 _v_e_c_t_o_r___t_y_p_e& _m_a_x_i_m_i_z_e(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -589 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ -590 _rhs.values_.cbegin(), │ │ │ │ -591 values_.begin(), │ │ │ │ -592 [](const Scalar &l, const Scalar &r) { │ │ │ │ -593 return std::max(l, r); │ │ │ │ -594 }); │ │ │ │ -595 return *this; │ │ │ │ -596 } │ │ │ │ -597 │ │ │ │ -_5_9_9 bool _m_a_x_i_m_i_z_e_d(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -600 bool result = false; │ │ │ │ -601 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ -602 _rhs.values_.cbegin(), │ │ │ │ -603 values_.begin(), │ │ │ │ -604 [&result](const Scalar &l, const Scalar &r) { │ │ │ │ -605 if (l > r) { │ │ │ │ -606 return l; │ │ │ │ -607 } else { │ │ │ │ -608 result = true; │ │ │ │ -609 return r; │ │ │ │ -610 } │ │ │ │ -611 }); │ │ │ │ -612 return result; │ │ │ │ -613 } │ │ │ │ -614 │ │ │ │ -_6_1_6 inline _v_e_c_t_o_r___t_y_p_e _m_i_n(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -617 return _v_e_c_t_o_r___t_y_p_e(*this)._m_i_n_i_m_i_z_e(_rhs); │ │ │ │ -618 } │ │ │ │ -619 │ │ │ │ -_6_2_1 inline _v_e_c_t_o_r___t_y_p_e _m_a_x(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -622 return _v_e_c_t_o_r___t_y_p_e(*this)._m_a_x_i_m_i_z_e(_rhs); │ │ │ │ -623 } │ │ │ │ -624 │ │ │ │ -626 │ │ │ │ -627 //------------------------------------------------------------ misc │ │ │ │ -functions │ │ │ │ -628 │ │ │ │ -630 template │ │ │ │ -_6_3_1 inline _v_e_c_t_o_r___t_y_p_e _a_p_p_l_y(const Functor& _func) const { │ │ │ │ -632 _v_e_c_t_o_r___t_y_p_e result; │ │ │ │ -633 std::transform(result.values_.cbegin(), result.values_.cend(), │ │ │ │ -634 result.values_.begin(), _func); │ │ │ │ -635 return result; │ │ │ │ -636 } │ │ │ │ -637 │ │ │ │ -_6_3_9 _v_e_c_t_o_r___t_y_p_e& _v_e_c_t_o_r_i_z_e(const Scalar& _s) { │ │ │ │ -640 std::fill(values_.begin(), values_.end(), _s); │ │ │ │ -641 return *this; │ │ │ │ -642 } │ │ │ │ -643 │ │ │ │ -_6_4_5 static _v_e_c_t_o_r___t_y_p_e _v_e_c_t_o_r_i_z_e_d(const Scalar& _s) { │ │ │ │ -646 return _v_e_c_t_o_r___t_y_p_e()._v_e_c_t_o_r_i_z_e(_s); │ │ │ │ -647 } │ │ │ │ -648 │ │ │ │ -_6_5_0 bool _o_p_e_r_a_t_o_r_<(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -651 return std::lexicographical_compare( │ │ │ │ -652 values_.begin(), values_.end(), │ │ │ │ -653 _rhs.values_.begin(), _rhs.values_.end()); │ │ │ │ -654 } │ │ │ │ -655 │ │ │ │ -_6_5_7 void _s_w_a_p(_V_e_c_t_o_r_T& _other) │ │ │ │ -658 noexcept(noexcept(std::swap(values_, _other.values_))) { │ │ │ │ -659 std::swap(values_, _other.values_); │ │ │ │ -660 } │ │ │ │ -661 │ │ │ │ -662 //------------------------------------------------------------ component │ │ │ │ -iterators │ │ │ │ -663 │ │ │ │ -665 │ │ │ │ -666 │ │ │ │ -667 using iterator = typename container::iterator; │ │ │ │ -668 using const_iterator = typename container::const_iterator; │ │ │ │ -669 using reverse_iterator = typename container::reverse_iterator; │ │ │ │ -670 using const_reverse_iterator = typename container::const_reverse_iterator; │ │ │ │ -671 │ │ │ │ -672 iterator begin() noexcept { return values_.begin(); } │ │ │ │ -673 const_iterator begin() const noexcept { return values_.cbegin(); } │ │ │ │ -674 const_iterator cbegin() const noexcept { return values_.cbegin(); } │ │ │ │ -675 │ │ │ │ -676 iterator end() noexcept { return values_.end(); } │ │ │ │ -677 const_iterator end() const noexcept { return values_.cend(); } │ │ │ │ -678 const_iterator cend() const noexcept { return values_.cend(); } │ │ │ │ -679 │ │ │ │ -680 reverse_iterator rbegin() noexcept { return values_.rbegin(); } │ │ │ │ -681 const_reverse_iterator rbegin() const noexcept { return values_.crbegin(); │ │ │ │ -} │ │ │ │ -682 const_reverse_iterator crbegin() const noexcept { return values_.crbegin(); │ │ │ │ -} │ │ │ │ -683 │ │ │ │ -684 reverse_iterator rend() noexcept { return values_.rend(); } │ │ │ │ -685 const_reverse_iterator rend() const noexcept { return values_.crend(); } │ │ │ │ -686 const_reverse_iterator crend() const noexcept { return values_.crend(); } │ │ │ │ -687 │ │ │ │ -689}; │ │ │ │ -690 │ │ │ │ -692template │ │ │ │ -_6_9_3auto _o_p_e_r_a_t_o_r_*(const OtherScalar& _s, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> &rhs) -> │ │ │ │ -694 decltype(rhs.operator*(_s)) { │ │ │ │ -695 │ │ │ │ -696 return rhs * _s; │ │ │ │ -697} │ │ │ │ -698 │ │ │ │ -700template │ │ │ │ -_7_0_1auto operator<<(std::ostream& os, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> &_vec) -> │ │ │ │ -702 typename std::enable_if< │ │ │ │ -703 sizeof(decltype(os << _vec[0])) >= 0, std::ostream&>::type { │ │ │ │ -704 │ │ │ │ -705 os << _vec[0]; │ │ │ │ -706 for (int i = 1; i < DIM; ++i) { │ │ │ │ -707 os << " " << _vec[i]; │ │ │ │ -708 } │ │ │ │ -709 return os; │ │ │ │ -710} │ │ │ │ -711 │ │ │ │ -713template │ │ │ │ -_7_1_4auto operator>> (std::istream& is, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> &_vec) -> │ │ │ │ -715 typename std::enable_if< │ │ │ │ -716 sizeof(decltype(is >> _vec[0])) >= 0, std::istream &>::type { │ │ │ │ -717 for (int i = 0; i < DIM; ++i) │ │ │ │ -718 is >> _vec[i]; │ │ │ │ -719 return is; │ │ │ │ -720} │ │ │ │ -721 │ │ │ │ -724template │ │ │ │ -_7_2_5Scalar _d_o_t(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) │ │ │ │ -{ │ │ │ │ -726 return (_v1 | _v2); │ │ │ │ -727} │ │ │ │ -728 │ │ │ │ -731template │ │ │ │ -732auto │ │ │ │ -_7_3_3_c_r_o_s_s(const _V_e_c_t_o_r_T_<_L_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const _V_e_c_t_o_r_T_<_R_S_c_a_l_a_r_,_ _D_I_M_>& _v2) -> │ │ │ │ -734 decltype(_v1 % _v2) { │ │ │ │ -735 return (_v1 % _v2); │ │ │ │ -736} │ │ │ │ -737 │ │ │ │ -740template │ │ │ │ -_7_4_1void _s_w_a_p(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) │ │ │ │ -742noexcept(noexcept(_v1.swap(_v2))) { │ │ │ │ -743 _v1.swap(_v2); │ │ │ │ -744} │ │ │ │ -745 │ │ │ │ -748template │ │ │ │ -_7_4_9Scalar _n_o_r_m(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ -750 return _v._n_o_r_m(); │ │ │ │ -751} │ │ │ │ -752 │ │ │ │ -755template │ │ │ │ -_7_5_6Scalar _s_q_r_n_o_r_m(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ -757 return _v._s_q_r_n_o_r_m(); │ │ │ │ -758} │ │ │ │ -761template │ │ │ │ -_7_6_2_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v_e_c_t_o_r_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v, OtherScalar const& │ │ │ │ -_val) { │ │ │ │ -763 return _v._v_e_c_t_o_r_i_z_e(_val); │ │ │ │ -764} │ │ │ │ -765 │ │ │ │ -768template │ │ │ │ -_7_6_9_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _n_o_r_m_a_l_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ -770 return _v._n_o_r_m_a_l_i_z_e(); │ │ │ │ -771} │ │ │ │ -772 │ │ │ │ -775template │ │ │ │ -_7_7_6_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _m_a_x_i_m_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ -_D_I_M_>& _v2) { │ │ │ │ -777 return _v1._m_a_x_i_m_i_z_e(_v2); │ │ │ │ -778} │ │ │ │ -779 │ │ │ │ -782template │ │ │ │ -_7_8_3_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _m_i_n_i_m_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ -_D_I_M_>& _v2) { │ │ │ │ -784 return _v1._m_i_n_i_m_i_z_e(_v2); │ │ │ │ -785} │ │ │ │ -786 │ │ │ │ -789template │ │ │ │ -_7_9_0_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> _m_a_x(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ -_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) { │ │ │ │ -791 return _v1._m_a_x(_v2); │ │ │ │ -792} │ │ │ │ -793 │ │ │ │ -796template │ │ │ │ -_7_9_7_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> _m_i_n(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ -_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) { │ │ │ │ -798 return _v1._m_i_n(_v2); │ │ │ │ -799} │ │ │ │ -800 │ │ │ │ -801 │ │ │ │ -802//== TYPEDEFS │ │ │ │ -================================================================= │ │ │ │ -803 │ │ │ │ -_8_0_5typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_c; │ │ │ │ -_8_0_7typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_u_c; │ │ │ │ -_8_0_9typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_s; │ │ │ │ -_8_1_1typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_u_s; │ │ │ │ -_8_1_3typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_i; │ │ │ │ -_8_1_5typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_u_i; │ │ │ │ -_8_1_7typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_1_> _V_e_c_1_f; │ │ │ │ -_8_1_9typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_1_> _V_e_c_1_d; │ │ │ │ -820 │ │ │ │ -_8_2_2typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_c; │ │ │ │ -_8_2_4typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_u_c; │ │ │ │ -_8_2_6typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_s; │ │ │ │ -_8_2_8typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_u_s; │ │ │ │ -_8_3_0typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_i; │ │ │ │ -_8_3_2typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_u_i; │ │ │ │ -_8_3_4typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_2_> _V_e_c_2_f; │ │ │ │ -_8_3_6typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_2_> _V_e_c_2_d; │ │ │ │ -837 │ │ │ │ -_8_3_9typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_c; │ │ │ │ -_8_4_1typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_u_c; │ │ │ │ -_8_4_3typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_s; │ │ │ │ -_8_4_5typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_u_s; │ │ │ │ -_8_4_7typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_i; │ │ │ │ -_8_4_9typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_u_i; │ │ │ │ -_8_5_1typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_> _V_e_c_3_f; │ │ │ │ -_8_5_3typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_> _V_e_c_3_d; │ │ │ │ -_8_5_5typedef _V_e_c_t_o_r_T_<_b_o_o_l_,_3_> _V_e_c_3_b; │ │ │ │ -856 │ │ │ │ -_8_5_8typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_c; │ │ │ │ -_8_6_0typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_u_c; │ │ │ │ -_8_6_2typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_s; │ │ │ │ -_8_6_4typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_u_s; │ │ │ │ -_8_6_6typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_i; │ │ │ │ -_8_6_8typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_u_i; │ │ │ │ -_8_7_0typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_4_> _V_e_c_4_f; │ │ │ │ -_8_7_2typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_4_> _V_e_c_4_d; │ │ │ │ -873 │ │ │ │ -_8_7_5typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_c; │ │ │ │ -_8_7_7typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_u_c; │ │ │ │ -_8_7_9typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_s; │ │ │ │ -_8_8_1typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_u_s; │ │ │ │ -_8_8_3typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_i; │ │ │ │ -_8_8_5typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_u_i; │ │ │ │ -_8_8_7typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_ _5_> _V_e_c_5_f; │ │ │ │ -_8_8_9typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_ _5_> _V_e_c_5_d; │ │ │ │ -890 │ │ │ │ -_8_9_2typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_c; │ │ │ │ -_8_9_4typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_u_c; │ │ │ │ -_8_9_6typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_s; │ │ │ │ -_8_9_8typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_u_s; │ │ │ │ -_9_0_0typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_i; │ │ │ │ -_9_0_2typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_u_i; │ │ │ │ -_9_0_4typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_6_> _V_e_c_6_f; │ │ │ │ -_9_0_6typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_6_> _V_e_c_6_d; │ │ │ │ -907 │ │ │ │ -908} // namespace OpenMesh │ │ │ │ -909 │ │ │ │ -918constexpr _O_p_e_n_M_e_s_h_:_:_V_e_c_4_f operator"" _htmlColor(unsigned long long │ │ │ │ -raw_color) { │ │ │ │ -919 return _O_p_e_n_M_e_s_h_:_:_V_e_c_4_f( │ │ │ │ -920 ((raw_color >> 24) & 0xFF) / 255.0f, │ │ │ │ -921 ((raw_color >> 16) & 0xFF) / 255.0f, │ │ │ │ -922 ((raw_color >> 8) & 0xFF) / 255.0f, │ │ │ │ -923 ((raw_color >> 0) & 0xFF) / 255.0f); │ │ │ │ -924} │ │ │ │ -925 │ │ │ │ -926#endif /* OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ */ │ │ │ │ +188}//namespace OpenMesh │ │ │ │ +189 │ │ │ │ +190#endif//LOOPSCHEMEMASKT_HH │ │ │ │ +191 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) - │ │ │ │ -> decltype(rhs.operator*(_s)) │ │ │ │ -Component wise multiplication from the left. │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:693 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_f │ │ │ │ -VectorT< float, 4 > Vec4f │ │ │ │ -4-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:870 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:83 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ -vector_type & vectorize(const Scalar &_s) │ │ │ │ -store the same value in each component (e.g. to clear all entries) │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:639 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ -const Scalar & operator[](size_t _i) const │ │ │ │ -get i'th element read-only │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:215 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ -VectorT< Scalar, DIM > & normalize(VectorT< Scalar, DIM > &_v) │ │ │ │ -non-member normalize │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:769 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(Iterator it) │ │ │ │ -construct from a value array or any other iterator │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:168 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_c_r_o_s_s │ │ │ │ -auto cross(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this % │ │ │ │ -_rhs) │ │ │ │ -cross product: only defined for Vec3* as specialization │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:389 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_o_t │ │ │ │ -Scalar dot(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > │ │ │ │ -&_v2) │ │ │ │ -symmetric version of the dot product │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:725 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_a_t_a │ │ │ │ -Scalar * data() │ │ │ │ -access to Scalar array │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:201 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -auto operator*(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0 │ │ │ │ -component-wise vector multiplication │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ -VectorT< Scalar, DIM > & minimize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, │ │ │ │ -DIM > &_v2) │ │ │ │ -non-member minimize │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:783 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ -auto operator+(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0 │ │ │ │ -component-wise vector addition │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r___t_y_p_e │ │ │ │ -VectorT< Scalar, DIM > vector_type │ │ │ │ -type of this vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:99 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_i_m │ │ │ │ -static constexpr int dim() │ │ │ │ -returns dimension of the vector (deprecated) │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:102 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ -decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const │ │ │ │ -compute squared euclidean norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:422 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_i_z_e │ │ │ │ -static constexpr size_t size() │ │ │ │ -returns dimension of the vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:107 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_a_t_a │ │ │ │ -const Scalar * data() const │ │ │ │ -access to const Scalar array │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:204 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ -VectorT< Scalar, DIM > & vectorize(VectorT< Scalar, DIM > &_v, OtherScalar │ │ │ │ -const &_val) │ │ │ │ -non-member vectorize │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:762 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_w_a_p │ │ │ │ -void swap(VectorT &_other) noexcept(noexcept(std::swap(values_, │ │ │ │ -_other.values_))) │ │ │ │ -swap with another vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:657 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x___a_b_s │ │ │ │ -Scalar max_abs() const │ │ │ │ -return the maximal absolute component │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:523 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ -vector_type min(const vector_type &_rhs) const │ │ │ │ -component-wise min │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:616 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ -VectorT< Scalar, DIM > min(const VectorT< Scalar, DIM > &_v1, const VectorT< │ │ │ │ -Scalar, DIM > &_v2) │ │ │ │ -non-member min │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:797 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ -vector_type & maximize(const vector_type &_rhs) │ │ │ │ -maximize values: same as *this = max(*this, _rhs), but faster │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:588 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ -Scalar sqrnorm(const VectorT< Scalar, DIM > &_v) │ │ │ │ -non-member sqrnorm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:756 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_c_r_o_s_s │ │ │ │ -auto cross(const VectorT< LScalar, DIM > &_v1, const VectorT< RScalar, DIM > │ │ │ │ -&_v2) -> decltype(_v1 % _v2) │ │ │ │ -symmetric version of the cross product │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:733 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_| │ │ │ │ -auto operator|(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype │ │ │ │ -(*this->data() **_rhs.data()) │ │ │ │ -compute scalar product │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:399 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ -auto operator-(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0 │ │ │ │ -component-wise vector difference │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e___c_o_n_d │ │ │ │ -vector_type &::type normalize_cond() │ │ │ │ -compute squared euclidean norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:481 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ -VectorT< Scalar, DIM > & maximize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, │ │ │ │ -DIM > &_v2) │ │ │ │ -non-member maximize │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:776 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_w_a_p │ │ │ │ -void swap(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2) noexcept │ │ │ │ -(noexcept(_v1.swap(_v2))) │ │ │ │ -non-member swap │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:741 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ -VectorT< Scalar, DIM > max(const VectorT< Scalar, DIM > &_v1, const VectorT< │ │ │ │ -Scalar, DIM > &_v2) │ │ │ │ -non-member max │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:790 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ -auto operator-=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0 │ │ │ │ -vector difference from this │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ -auto operator*=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0 │ │ │ │ -component-wise self-multiplication │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ -auto operator/=(const OtherScalar &_s) -> typename std::enable_if< std:: │ │ │ │ -is_convertible< decltype(this->values_[0]/_s), Scalar >::value, VectorT< │ │ │ │ -Scalar, DIM > & >::type │ │ │ │ -component-wise self-division by scalar │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:248 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ -vector_type max(const vector_type &_rhs) const │ │ │ │ -component-wise max │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:621 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ -vector_type & operator=(const VectorT< OtherScalar, DIM > &_rhs) │ │ │ │ -cast from vector with a different scalar type │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:192 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ -auto operator/=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0 │ │ │ │ -component-wise self-division │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ -vector_type & minimize(const vector_type &_rhs) │ │ │ │ -minimize values: same as *this = min(*this, _rhs), but faster │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:560 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e_d │ │ │ │ -static vector_type vectorized(const Scalar &_s) │ │ │ │ -store the same value in each component │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:645 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_l_8___n_o_r_m │ │ │ │ -Scalar l8_norm() const │ │ │ │ -compute l8_norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:506 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n___a_b_s │ │ │ │ -Scalar min_abs() const │ │ │ │ -return the minimal absolute component │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:537 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(const Scalar &v) │ │ │ │ -Creates a vector with all components set to v. │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:134 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_l_e_n_g_t_h │ │ │ │ -auto length() const -> decltype(std::declval< VectorT< S, DIM > >().norm()) │ │ │ │ -compute squared euclidean norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:443 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ -auto operator/(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0 │ │ │ │ -component-wise vector division │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ -vector_type operator-(void) const │ │ │ │ -unary minus │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:365 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ -bool operator<(const vector_type &_rhs) const │ │ │ │ -lexicographical comparison │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:650 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e_d │ │ │ │ -bool minimized(const vector_type &_rhs) │ │ │ │ -minimize values and signalize coordinate minimization │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:571 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_h_o_m_o_g_e_n_i_z_e_d │ │ │ │ -auto homogenized() const -> typename std::enable_if< D==4, VectorT< decltype │ │ │ │ -(std::declval< S >()/std::declval< S >()), DIM > >::type │ │ │ │ -Only for 4-component vectors with division operator on their Scalar: │ │ │ │ -Dehomogenization. │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:148 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_e_a_n___a_b_s │ │ │ │ -Scalar mean_abs() const │ │ │ │ -return absolute arithmetic mean │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:551 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_l_1___n_o_r_m │ │ │ │ -Scalar l1_norm() const │ │ │ │ -compute L1 (Manhattan) norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:500 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -Scalar value_type │ │ │ │ -the type of the scalar used in this template │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:96 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_o_t │ │ │ │ -auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs) │ │ │ │ -compute scalar product │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:409 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(const VectorT< otherScalarType, DIM > &_rhs) │ │ │ │ -copy & cast constructor (explicit) │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:182 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_e_a_n │ │ │ │ -Scalar mean() const │ │ │ │ -return arithmetic mean │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:546 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ -auto operator*=(const OtherScalar &_s) -> typename std::enable_if< std:: │ │ │ │ -is_convertible< decltype(this->values_[0] *_s), Scalar >::value, VectorT< │ │ │ │ -Scalar, DIM > & >::type │ │ │ │ -component-wise self-multiplication with scalar │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:236 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ -auto operator+=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ -enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0 │ │ │ │ -vector self-addition │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -constexpr VectorT() │ │ │ │ -default constructor creates uninitialized values. │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:129 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_a_p_p_l_y │ │ │ │ -vector_type apply(const Functor &_func) const │ │ │ │ -component-wise apply function object with Scalar operator()(Scalar). │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:631 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ -bool operator==(const vector_type &_rhs) const │ │ │ │ -component-wise comparison │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:223 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ -bool operator!=(const vector_type &_rhs) const │ │ │ │ -component-wise comparison │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:228 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ -Scalar max() const │ │ │ │ -return the maximal component │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:518 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e_d │ │ │ │ -bool maximized(const vector_type &_rhs) │ │ │ │ -maximize values and signalize coordinate maximization │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:599 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ -auto normalize() -> decltype(*this/=std::declval< VectorT< S, DIM > >().norm()) │ │ │ │ -normalize vector, return normalized vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:454 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ -Scalar & operator[](size_t _i) │ │ │ │ -get i'th element read-write │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:209 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ -auto norm() const -> decltype(std::sqrt(std::declval< VectorT< S, DIM > > │ │ │ │ -().sqrnorm())) │ │ │ │ -compute euclidean norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:434 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ -Scalar min() const │ │ │ │ -return the minimal component │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:532 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e_d │ │ │ │ -auto normalized() const -> decltype(*this/std::declval< VectorT< S, DIM > > │ │ │ │ -().norm()) │ │ │ │ -return normalized vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:465 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_% │ │ │ │ -auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ -enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), │ │ │ │ -DIM > >::type │ │ │ │ -cross product: only defined for Vec3* as specialization │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:375 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ -Scalar norm(const VectorT< Scalar, DIM > &_v) │ │ │ │ -non-member norm │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:749 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(container &&_array) │ │ │ │ -construct from an array │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:173 │ │ │ │ -_V_e_c_t_o_r_T │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:68 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_L_o_o_p_S_c_h_e_m_e_M_a_s_k_T │ │ │ │ +implements cache for the weights of the original Loop scheme supported: │ │ │ │ +DDeeffiinniittiioonn LoopSchemeMaskT.hh:67 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_S_i_n_g_l_e_t_o_n_T │ │ │ │ +A simple singleton template. │ │ │ │ +DDeeffiinniittiioonn SingletonT.hh:77 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00770_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/VectorT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/Vector11T.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
VectorT.hh
│ │ │ +
Vector11T.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,396 +136,926 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43
│ │ │ +
42#ifndef OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_
│ │ │ +
43#define OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_
│ │ │
44
│ │ │ -
45
│ │ │ -
46//=============================================================================
│ │ │ -
47//
│ │ │ -
48// CLASS VectorT
│ │ │ -
49//
│ │ │ -
50//=============================================================================
│ │ │ -
51
│ │ │ -
52// Don't parse this header file with doxygen since
│ │ │ -
53// for some reason (obviously due to a bug in doxygen,
│ │ │ -
54// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)
│ │ │ -
55// macro expansion and preprocessor defines
│ │ │ -
56// don't work properly.
│ │ │ -
57
│ │ │ -
58#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
│ │ │ -
59#include "Vector11T.hh"
│ │ │ -
60#else
│ │ │ -
61#ifndef DOXYGEN
│ │ │ -
62
│ │ │ -
63#ifndef OPENMESH_VECTOR_HH
│ │ │ -
64#define OPENMESH_VECTOR_HH
│ │ │ +
45#include <array>
│ │ │ +
46#include <utility>
│ │ │ +
47#include <algorithm>
│ │ │ +
48#include <numeric>
│ │ │ +
49#include <type_traits>
│ │ │ +
50#include <cmath>
│ │ │ +
51#include <ostream>
│ │ │ +
52#include <istream>
│ │ │ +
53#include <cassert>
│ │ │ +
54#include <cstdlib>
│ │ │ +
55
│ │ │ +
56// This header is not needed by this file but expected by others including
│ │ │ +
57// this file.
│ │ │ +
58#include <OpenMesh/Core/System/config.h>
│ │ │ +
59
│ │ │ +
60
│ │ │ +
61/*
│ │ │ +
62 * Helpers for VectorT
│ │ │ +
63 */
│ │ │ +
64namespace {
│ │ │
65
│ │ │ -
66
│ │ │ -
67//== INCLUDES =================================================================
│ │ │ +
66template<typename ... Ts>
│ │ │ +
67struct are_convertible_to;
│ │ │
68
│ │ │ -
69#include <OpenMesh/Core/System/config.h>
│ │ │ -
70#include <ostream>
│ │ │ -
71#include <cmath>
│ │ │ -
72#include <cassert>
│ │ │ -
73#include <cstring>
│ │ │ +
69template<typename To, typename From, typename ... Froms>
│ │ │ +
70struct are_convertible_to<To, From, Froms...> {
│ │ │ +
71 static constexpr bool value = std::is_convertible<From, To>::value
│ │ │ +
72 && are_convertible_to<To, Froms...>::value;
│ │ │ +
73};
│ │ │
74
│ │ │ -
75#if defined(__GNUC__) && defined(__SSE__)
│ │ │ -
76#include <xmmintrin.h>
│ │ │ -
77#endif
│ │ │ -
78
│ │ │ -
79//== NAMESPACES ===============================================================
│ │ │ -
80
│ │ │ +
75template<typename To, typename From>
│ │ │ +
76struct are_convertible_to<To, From> : public std::is_convertible<From, To> {
│ │ │ +
77};
│ │ │ +
78}
│ │ │ +
79
│ │ │ +
80namespace OpenMesh {
│ │ │
81
│ │ │ -
82namespace OpenMesh {
│ │ │ -
83
│ │ │ +
82template<typename Scalar, int DIM>
│ │ │ +
│ │ │ +
83class VectorT {
│ │ │
84
│ │ │ -
85//== CLASS DEFINITION =========================================================
│ │ │ +
85 static_assert(DIM >= 1, "VectorT requires positive dimensionality.");
│ │ │
86
│ │ │ -
87
│ │ │ -
97template<typename Scalar, int N> class VectorDataT {
│ │ │ -
98 public:
│ │ │ -
99 Scalar values_[N];
│ │ │ -
100};
│ │ │ -
101
│ │ │ -
102
│ │ │ -
103#if defined(__GNUC__) && defined(__SSE__)
│ │ │ -
104
│ │ │ -
106template<> class VectorDataT<float, 4> {
│ │ │ -
107 public:
│ │ │ -
108 union {
│ │ │ -
109 __m128 m128;
│ │ │ -
110 float values_[4];
│ │ │ -
111 };
│ │ │ -
112};
│ │ │ -
113
│ │ │ -
114#endif
│ │ │ -
115
│ │ │ -
116
│ │ │ -
117
│ │ │ -
118
│ │ │ -
119//== CLASS DEFINITION =========================================================
│ │ │ -
120
│ │ │ -
121
│ │ │ -
122#define DIM N
│ │ │ -
123#define TEMPLATE_HEADER template <typename Scalar, int N>
│ │ │ -
124#define CLASSNAME VectorT
│ │ │ -
125#define DERIVED VectorDataT<Scalar,N>
│ │ │ -
126#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
│ │ │ +
87 private:
│ │ │ +
88 using container = std::array<Scalar, DIM>;
│ │ │ +
89 container values_;
│ │ │ +
90
│ │ │ +
91 public:
│ │ │ +
92
│ │ │ +
93 //---------------------------------------------------------------- class info
│ │ │ +
94
│ │ │ +
96 typedef Scalar value_type;
│ │ │ +
97
│ │ │ + │ │ │ +
100
│ │ │ +
│ │ │ +
102 static constexpr int dim() {
│ │ │ +
103 return DIM;
│ │ │ +
104 }
│ │ │ +
│ │ │ +
105
│ │ │ +
│ │ │ +
107 static constexpr size_t size() {
│ │ │ +
108 return DIM;
│ │ │ +
109 }
│ │ │ +
│ │ │ +
110
│ │ │ +
111 static constexpr const size_t size_ = DIM;
│ │ │ +
112
│ │ │ +
113 //-------------------------------------------------------------- constructors
│ │ │ +
114
│ │ │ +
115 // Converting constructor: Constructs the vector from DIM values (of
│ │ │ +
116 // potentially heterogenous types) which are all convertible to Scalar.
│ │ │ +
117 template<typename T, typename ... Ts,
│ │ │ +
118 typename = typename std::enable_if<sizeof...(Ts)+1 == DIM>::type,
│ │ │ +
119 typename = typename std::enable_if<
│ │ │ +
120 are_convertible_to<Scalar, T, Ts...>::value>::type>
│ │ │ +
121 constexpr VectorT(T v, Ts... vs) : values_ { {static_cast<Scalar>(v), static_cast<Scalar>(vs)...} } {
│ │ │ +
122 static_assert(sizeof...(Ts)+1 == DIM,
│ │ │ +
123 "Invalid number of components specified in constructor.");
│ │ │ +
124 static_assert(are_convertible_to<Scalar, T, Ts...>::value,
│ │ │ +
125 "Not all components are convertible to Scalar.");
│ │ │ +
126 }
│ │ │
127
│ │ │ -
133#include "VectorT_inc.hh"
│ │ │ -
134
│ │ │ -
135#undef DIM
│ │ │ -
136#undef TEMPLATE_HEADER
│ │ │ -
137#undef CLASSNAME
│ │ │ -
138#undef DERIVED
│ │ │ -
139#undef unroll
│ │ │ -
140
│ │ │ -
141
│ │ │ +
129 constexpr VectorT() {}
│ │ │ +
130
│ │ │ +
│ │ │ +
134 explicit VectorT(const Scalar &v) {
│ │ │ +
135 vectorize(v);
│ │ │ +
136 }
│ │ │ +
│ │ │ +
137
│ │ │ +
138 VectorT(const VectorT &rhs) = default;
│ │ │ +
139 VectorT(VectorT &&rhs) = default;
│ │ │ +
140 VectorT &operator=(const VectorT &rhs) = default;
│ │ │ +
141 VectorT &operator=(VectorT &&rhs) = default;
│ │ │
142
│ │ │ -
143
│ │ │ -
144//== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
│ │ │ -
145#if OM_PARTIAL_SPECIALIZATION
│ │ │ -
146
│ │ │ -
147
│ │ │ -
148#define TEMPLATE_HEADER template <typename Scalar>
│ │ │ -
149#define CLASSNAME VectorT<Scalar,DIM>
│ │ │ -
150#define DERIVED VectorDataT<Scalar,DIM>
│ │ │ -
151
│ │ │ -
152
│ │ │ -
153#define DIM 2
│ │ │ -
154#define unroll(expr) expr(0) expr(1)
│ │ │ -
155#define unroll_comb(expr, op) expr(0) op expr(1)
│ │ │ -
156#define unroll_csv(expr) expr(0), expr(1)
│ │ │ -
157#include "VectorT_inc.hh"
│ │ │ -
158#undef DIM
│ │ │ -
159#undef unroll
│ │ │ -
160#undef unroll_comb
│ │ │ -
161#undef unroll_csv
│ │ │ +
147 template<typename S = Scalar, int D = DIM>
│ │ │ +
│ │ │ +
148 auto homogenized() const ->
│ │ │ +
149 typename std::enable_if<D == 4,
│ │ │ +
150 VectorT<decltype(std::declval<S>()/std::declval<S>()), DIM>>::type {
│ │ │ +
151 static_assert(D == DIM, "D and DIM need to be identical. (Never "
│ │ │ +
152 "override the default template arguments.)");
│ │ │ +
153 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
154 "to be the same type. (Never override the default template "
│ │ │ +
155 "arguments.)");
│ │ │ +
156 return VectorT(
│ │ │ +
157 values_[0]/values_[3],
│ │ │ +
158 values_[1]/values_[3],
│ │ │ +
159 values_[2]/values_[3],
│ │ │ +
160 1);
│ │ │ +
161 }
│ │ │ +
│ │ │
162
│ │ │ -
163
│ │ │ -
164#define DIM 3
│ │ │ -
165#define unroll(expr) expr(0) expr(1) expr(2)
│ │ │ -
166#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
│ │ │ -
167#define unroll_csv(expr) expr(0), expr(1), expr(2)
│ │ │ -
168#include "VectorT_inc.hh"
│ │ │ -
169#undef DIM
│ │ │ -
170#undef unroll
│ │ │ -
171#undef unroll_comb
│ │ │ -
172#undef unroll_csv
│ │ │ -
173
│ │ │ -
174
│ │ │ -
175#define DIM 4
│ │ │ -
176#define unroll(expr) expr(0) expr(1) expr(2) expr(3)
│ │ │ -
177#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
│ │ │ -
178#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
│ │ │ -
179#include "VectorT_inc.hh"
│ │ │ -
180#undef DIM
│ │ │ -
181#undef unroll
│ │ │ -
182#undef unroll_comb
│ │ │ -
183#undef unroll_csv
│ │ │ -
184
│ │ │ -
185#define DIM 5
│ │ │ -
186#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
│ │ │ -
187#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
│ │ │ -
188#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
│ │ │ -
189#include "VectorT_inc.hh"
│ │ │ -
190#undef DIM
│ │ │ -
191#undef unroll
│ │ │ -
192#undef unroll_comb
│ │ │ -
193#undef unroll_csv
│ │ │ -
194
│ │ │ -
195#define DIM 6
│ │ │ -
196#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
│ │ │ -
197#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
│ │ │ -
198#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
│ │ │ -
199#include "VectorT_inc.hh"
│ │ │ -
200#undef DIM
│ │ │ -
201#undef unroll
│ │ │ -
202#undef unroll_comb
│ │ │ -
203#undef unroll_csv
│ │ │ -
204
│ │ │ +
164 template<typename Iterator,
│ │ │ +
165 typename = decltype(
│ │ │ +
166 *std::declval<Iterator&>(), void(),
│ │ │ +
167 ++std::declval<Iterator&>(), void())>
│ │ │ +
│ │ │ +
168 explicit VectorT(Iterator it) {
│ │ │ +
169 std::copy_n(it, DIM, values_.begin());
│ │ │ +
170 }
│ │ │ +
│ │ │ +
171
│ │ │ +
│ │ │ +
173 explicit VectorT(container&& _array) :
│ │ │ +
174 values_(_array)
│ │ │ +
175 {
│ │ │ +
176 }
│ │ │ +
│ │ │ +
177
│ │ │ +
179 template<typename otherScalarType,
│ │ │ +
180 typename = typename std::enable_if<
│ │ │ +
181 std::is_convertible<otherScalarType, Scalar>::value>>
│ │ │ +
│ │ │ + │ │ │ +
183 operator=(_rhs);
│ │ │ +
184 }
│ │ │ +
│ │ │ +
185
│ │ │ +
186 //--------------------------------------------------------------------- casts
│ │ │ +
187
│ │ │ +
189 template<typename OtherScalar,
│ │ │ +
190 typename = typename std::enable_if<
│ │ │ +
191 std::is_convertible<OtherScalar, Scalar>::value>>
│ │ │ +
│ │ │ + │ │ │ +
193 std::transform(_rhs.cbegin(), _rhs.cend(),
│ │ │ +
194 this->begin(), [](OtherScalar rhs) {
│ │ │ +
195 return static_cast<Scalar>(std::move(rhs));
│ │ │ +
196 });
│ │ │ +
197 return *this;
│ │ │ +
198 }
│ │ │ +
│ │ │ +
199
│ │ │ +
201 Scalar* data() { return values_.data(); }
│ │ │ +
202
│ │ │ +
204 const Scalar* data() const { return values_.data(); }
│ │ │
205
│ │ │ -
206#undef TEMPLATE_HEADER
│ │ │ -
207#undef CLASSNAME
│ │ │ -
208#undef DERIVED
│ │ │ -
209
│ │ │ -
210
│ │ │ -
211
│ │ │ -
212
│ │ │ -
213//== FULL TEMPLATE SPECIALIZATIONS ============================================
│ │ │ -
214#else
│ │ │ -
215
│ │ │ -
217template<>
│ │ │ -
218inline VectorT<float,3>
│ │ │ - │ │ │ -
220{
│ │ │ -
221 return
│ │ │ -
222 VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
│ │ │ -
223 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
│ │ │ -
224 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
│ │ │ -
225}
│ │ │ -
226
│ │ │ -
227
│ │ │ -
229template<>
│ │ │ - │ │ │ - │ │ │ -
232{
│ │ │ -
233 return
│ │ │ -
234 VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
│ │ │ -
235 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
│ │ │ -
236 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
│ │ │ -
237}
│ │ │ -
238
│ │ │ -
239#endif
│ │ │ -
240
│ │ │ -
241
│ │ │ -
242
│ │ │ -
243//== GLOBAL FUNCTIONS =========================================================
│ │ │ -
244
│ │ │ +
206 //----------------------------------------------------------- element access
│ │ │ +
207
│ │ │ +
│ │ │ +
209 Scalar& operator[](size_t _i) {
│ │ │ +
210 assert(_i < DIM);
│ │ │ +
211 return values_[_i];
│ │ │ +
212 }
│ │ │ +
│ │ │ +
213
│ │ │ +
│ │ │ +
215 const Scalar& operator[](size_t _i) const {
│ │ │ +
216 assert(_i < DIM);
│ │ │ +
217 return values_[_i];
│ │ │ +
218 }
│ │ │ +
│ │ │ +
219
│ │ │ +
220 //---------------------------------------------------------------- comparsion
│ │ │ +
221
│ │ │ +
│ │ │ +
223 bool operator==(const vector_type& _rhs) const {
│ │ │ +
224 return std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin());
│ │ │ +
225 }
│ │ │ +
│ │ │ +
226
│ │ │ +
│ │ │ +
228 bool operator!=(const vector_type& _rhs) const {
│ │ │ +
229 return !std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), values_.cbegin());
│ │ │ +
230 }
│ │ │ +
│ │ │ +
231
│ │ │ +
232 //---------------------------------------------------------- scalar operators
│ │ │ +
233
│ │ │ +
235 template<typename OtherScalar>
│ │ │ +
│ │ │ +
236 auto operator*=(const OtherScalar& _s) ->
│ │ │ +
237 typename std::enable_if<std::is_convertible<
│ │ │ +
238 decltype(this->values_[0] * _s), Scalar>::value,
│ │ │ +
239 VectorT<Scalar, DIM>&>::type {
│ │ │ +
240 for (auto& e : *this) {
│ │ │ +
241 e *= _s;
│ │ │ +
242 }
│ │ │ +
243 return *this;
│ │ │ +
244 }
│ │ │ +
│ │ │
245
│ │ │ -
248template<typename Scalar1, typename Scalar2,int N>
│ │ │ -
249inline VectorT<Scalar1,N> operator*(Scalar2 _s, const VectorT<Scalar1,N>& _v) {
│ │ │ -
250 return _v*_s;
│ │ │ -
251}
│ │ │ -
252
│ │ │ -
253
│ │ │ -
256template<typename Scalar, int N>
│ │ │ -
257inline Scalar
│ │ │ -
258dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
│ │ │ -
259 return (_v1 | _v2);
│ │ │ -
260}
│ │ │ -
261
│ │ │ -
262
│ │ │ -
265template<typename Scalar, int N>
│ │ │ -
266inline VectorT<Scalar,N>
│ │ │ -
267cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
│ │ │ -
268 return (_v1 % _v2);
│ │ │ -
269}
│ │ │ -
270
│ │ │ -
271
│ │ │ -
274template<typename Scalar, int DIM>
│ │ │ -
275Scalar norm(const VectorT<Scalar, DIM>& _v) {
│ │ │ -
276 return _v.norm();
│ │ │ -
277}
│ │ │ -
278
│ │ │ +
247 template<typename OtherScalar>
│ │ │ +
│ │ │ +
248 auto operator/=(const OtherScalar& _s) ->
│ │ │ +
249 typename std::enable_if<std::is_convertible<
│ │ │ +
250 decltype(this->values_[0] / _s), Scalar>::value,
│ │ │ +
251 VectorT<Scalar, DIM>&>::type {
│ │ │ +
252 for (auto& e : *this) {
│ │ │ +
253 e /= _s;
│ │ │ +
254 }
│ │ │ +
255 return *this;
│ │ │ +
256 }
│ │ │ +
│ │ │ +
257
│ │ │ +
259 template<typename OtherScalar>
│ │ │ +
260 typename std::enable_if<std::is_convertible<
│ │ │ +
261 decltype(std::declval<Scalar>() * std::declval<OtherScalar>()),
│ │ │ +
262 Scalar>::value,
│ │ │ + │ │ │ +
264 operator*(const OtherScalar& _s) const {
│ │ │ +
265 return vector_type(*this) *= _s;
│ │ │ +
266 }
│ │ │ +
267
│ │ │ +
269 template<typename OtherScalar>
│ │ │ +
270 typename std::enable_if<std::is_convertible<
│ │ │ +
271 decltype(std::declval<Scalar>() / std::declval<OtherScalar>()),
│ │ │ +
272 Scalar>::value,
│ │ │ + │ │ │ +
274 operator/(const OtherScalar& _s) const {
│ │ │ +
275 return vector_type(*this) /= _s;
│ │ │ +
276 }
│ │ │ +
277
│ │ │ +
278 //---------------------------------------------------------- vector operators
│ │ │
279
│ │ │ -
282template<typename Scalar, int DIM>
│ │ │ -
283Scalar sqrnorm(const VectorT<Scalar, DIM>& _v) {
│ │ │ -
284 return _v.sqrnorm();
│ │ │ -
285}
│ │ │ -
286
│ │ │ -
287
│ │ │ -
290template<typename Scalar, int DIM, typename OtherScalar>
│ │ │ -
291VectorT<Scalar, DIM>& vectorize(VectorT<Scalar, DIM>& _v, OtherScalar const& _val) {
│ │ │ -
292 return _v.vectorize(_val);
│ │ │ -
293}
│ │ │ -
294
│ │ │ -
295
│ │ │ -
298template<typename Scalar, int DIM>
│ │ │ - │ │ │ -
300 return _v.normalize();
│ │ │ -
301}
│ │ │ -
302
│ │ │ +
281 template<typename OtherScalar>
│ │ │ + │ │ │ +
283 typename std::enable_if<
│ │ │ +
284 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0,
│ │ │ +
285 vector_type&>::type {
│ │ │ +
286 for (int i = 0; i < DIM; ++i) {
│ │ │ +
287 data()[i] *= _rhs.data()[i];
│ │ │ +
288 }
│ │ │ +
289 return *this;
│ │ │ +
290 }
│ │ │ +
291
│ │ │ +
293 template<typename OtherScalar>
│ │ │ + │ │ │ +
295 typename std::enable_if<
│ │ │ +
296 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0,
│ │ │ +
297 vector_type&>::type {
│ │ │ +
298 for (int i = 0; i < DIM; ++i) {
│ │ │ +
299 data()[i] /= _rhs.data()[i];
│ │ │ +
300 }
│ │ │ +
301 return *this;
│ │ │ +
302 }
│ │ │
303
│ │ │ -
306template<typename Scalar, int DIM>
│ │ │ - │ │ │ -
308 return _v1.maximize(_v2);
│ │ │ -
309}
│ │ │ -
310
│ │ │ -
311
│ │ │ -
314template<typename Scalar, int DIM>
│ │ │ - │ │ │ -
316 return _v1.minimize(_v2);
│ │ │ -
317}
│ │ │ -
318
│ │ │ -
319
│ │ │ -
322template<typename Scalar, int DIM>
│ │ │ - │ │ │ -
324 return VectorT<Scalar, DIM>(_v1).maximize(_v2);
│ │ │ -
325}
│ │ │ -
326
│ │ │ +
305 template<typename OtherScalar>
│ │ │ + │ │ │ +
307 typename std::enable_if<
│ │ │ +
308 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0,
│ │ │ +
309 vector_type&>::type {
│ │ │ +
310 for (int i = 0; i < DIM; ++i) {
│ │ │ +
311 data()[i] -= _rhs.data()[i];
│ │ │ +
312 }
│ │ │ +
313 return *this;
│ │ │ +
314 }
│ │ │ +
315
│ │ │ +
317 template<typename OtherScalar>
│ │ │ + │ │ │ +
319 typename std::enable_if<
│ │ │ +
320 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0,
│ │ │ +
321 vector_type&>::type {
│ │ │ +
322 for (int i = 0; i < DIM; ++i) {
│ │ │ +
323 data()[i] += _rhs.data()[i];
│ │ │ +
324 }
│ │ │ +
325 return *this;
│ │ │ +
326 }
│ │ │
327
│ │ │ -
330template<typename Scalar, int DIM>
│ │ │ - │ │ │ -
332 return VectorT<Scalar, DIM>(_v1).minimize(_v2);
│ │ │ -
333}
│ │ │ -
334
│ │ │ -
335
│ │ │ -
336//== TYPEDEFS =================================================================
│ │ │ -
337
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
351typedef VectorT<float,1> Vec1f;
│ │ │ - │ │ │ +
329 template<typename OtherScalar>
│ │ │ +
330 auto operator*(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ +
331 typename std::enable_if<
│ │ │ +
332 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0,
│ │ │ +
333 vector_type>::type {
│ │ │ +
334 return vector_type(*this) *= _rhs;
│ │ │ +
335 }
│ │ │ +
336
│ │ │ +
338 template<typename OtherScalar>
│ │ │ +
339 auto operator/(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ +
340 typename std::enable_if<
│ │ │ +
341 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0,
│ │ │ +
342 vector_type>::type {
│ │ │ +
343 return vector_type(*this) /= _rhs;
│ │ │ +
344 }
│ │ │ +
345
│ │ │ +
347 template<typename OtherScalar>
│ │ │ +
348 auto operator+(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ +
349 typename std::enable_if<
│ │ │ +
350 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0,
│ │ │ +
351 vector_type>::type {
│ │ │ +
352 return vector_type(*this) += _rhs;
│ │ │ +
353 }
│ │ │
354
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
368typedef VectorT<float,2> Vec2f;
│ │ │ - │ │ │ +
356 template<typename OtherScalar>
│ │ │ +
357 auto operator-(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ +
358 typename std::enable_if<
│ │ │ +
359 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0,
│ │ │ +
360 vector_type>::type {
│ │ │ +
361 return vector_type(*this) -= _rhs;
│ │ │ +
362 }
│ │ │ +
363
│ │ │ +
│ │ │ +
365 vector_type operator-(void) const {
│ │ │ +
366 vector_type v;
│ │ │ +
367 std::transform(values_.begin(), values_.end(), v.values_.begin(),
│ │ │ +
368 [](const Scalar &s) { return -s; });
│ │ │ +
369 return v;
│ │ │ +
370 }
│ │ │ +
│ │ │
371
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
385typedef VectorT<float,3> Vec3f;
│ │ │ - │ │ │ -
389typedef VectorT<bool,3> Vec3b;
│ │ │ -
390
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
404typedef VectorT<float,4> Vec4f;
│ │ │ - │ │ │ -
407
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
424
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
438typedef VectorT<float,6> Vec6f;
│ │ │ - │ │ │ +
374 template<typename OtherScalar>
│ │ │ +
│ │ │ +
375 auto operator% (const VectorT<OtherScalar, DIM> &_rhs) const ->
│ │ │ +
376 typename std::enable_if<DIM == 3,
│ │ │ +
377 VectorT<decltype((*this)[0] * _rhs[0] -
│ │ │ +
378 (*this)[0] * _rhs[0]), DIM>>::type {
│ │ │ +
379 return {
│ │ │ +
380 values_[1] * _rhs[2] - values_[2] * _rhs[1],
│ │ │ +
381 values_[2] * _rhs[0] - values_[0] * _rhs[2],
│ │ │ +
382 values_[0] * _rhs[1] - values_[1] * _rhs[0]
│ │ │ +
383 };
│ │ │ +
384 }
│ │ │ +
│ │ │ +
385
│ │ │ +
388 template<typename OtherScalar>
│ │ │ +
│ │ │ +
389 auto cross (const VectorT<OtherScalar, DIM> &_rhs) const ->
│ │ │ +
390 decltype(*this % _rhs)
│ │ │ +
391 {
│ │ │ +
392 return *this % _rhs;
│ │ │ +
393 }
│ │ │ +
│ │ │ +
394
│ │ │ +
395
│ │ │ +
398 template<typename OtherScalar>
│ │ │ +
│ │ │ +
399 auto operator|(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ +
400 decltype(*this->data() * *_rhs.data()) {
│ │ │ +
401
│ │ │ +
402 return std::inner_product(begin() + 1, begin() + DIM, _rhs.begin() + 1,
│ │ │ +
403 *begin() * *_rhs.begin());
│ │ │ +
404 }
│ │ │ +
│ │ │ +
405
│ │ │ +
408 template<typename OtherScalar>
│ │ │ +
│ │ │ +
409 auto dot(const VectorT<OtherScalar, DIM>& _rhs) const ->
│ │ │ +
410 decltype(*this | _rhs)
│ │ │ +
411 {
│ │ │ +
412 return *this | _rhs;
│ │ │ +
413 }
│ │ │ +
│ │ │ +
414
│ │ │ +
415 //------------------------------------------------------------ euclidean norm
│ │ │ +
416
│ │ │ +
418
│ │ │ +
419
│ │ │ +
421 template<typename S = Scalar>
│ │ │ +
│ │ │ +
422 decltype(std::declval<S>() * std::declval<S>()) sqrnorm() const {
│ │ │ +
423 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
424 "to be the same type. (Never override the default template "
│ │ │ +
425 "arguments.)");
│ │ │ +
426 typedef decltype(values_[0] * values_[0]) RESULT;
│ │ │ +
427 return std::accumulate(values_.cbegin() + 1, values_.cend(),
│ │ │ +
428 values_[0] * values_[0],
│ │ │ +
429 [](const RESULT &l, const Scalar &r) { return l + r * r; });
│ │ │ +
430 }
│ │ │ +
│ │ │ +
431
│ │ │ +
433 template<typename S = Scalar>
│ │ │ +
│ │ │ +
434 auto norm() const ->
│ │ │ +
435 decltype(std::sqrt(std::declval<VectorT<S, DIM>>().sqrnorm())) {
│ │ │ +
436 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
437 "to be the same type. (Never override the default template "
│ │ │ +
438 "arguments.)");
│ │ │ +
439 return std::sqrt(sqrnorm());
│ │ │ +
440 }
│ │ │ +
│ │ │
441
│ │ │ -
442
│ │ │ -
443//=============================================================================
│ │ │ -
444} // namespace OpenMesh
│ │ │ -
445//=============================================================================
│ │ │ -
446
│ │ │ -
447
│ │ │ -
448#endif // OPENMESH_VECTOR_HH defined
│ │ │ -
449//=============================================================================
│ │ │ -
450#endif // DOXYGEN
│ │ │ -
451#endif // C++11
│ │ │ +
442 template<typename S = Scalar>
│ │ │ +
│ │ │ +
443 auto length() const ->
│ │ │ +
444 decltype(std::declval<VectorT<S, DIM>>().norm()) {
│ │ │ +
445 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
446 "to be the same type. (Never override the default template "
│ │ │ +
447 "arguments.)");
│ │ │ +
448 return norm();
│ │ │ +
449 }
│ │ │ +
│ │ │ +
450
│ │ │ +
453 template<typename S = Scalar>
│ │ │ +
│ │ │ +
454 auto normalize() ->
│ │ │ +
455 decltype(*this /= std::declval<VectorT<S, DIM>>().norm()) {
│ │ │ +
456 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
457 "to be the same type. (Never override the default template "
│ │ │ +
458 "arguments.)");
│ │ │ +
459 return *this /= norm();
│ │ │ +
460 }
│ │ │ +
│ │ │ +
461
│ │ │ +
464 template<typename S = Scalar>
│ │ │ +
│ │ │ +
465 auto normalized() const ->
│ │ │ +
466 decltype(*this / std::declval<VectorT<S, DIM>>().norm()) {
│ │ │ +
467 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
468 "to be the same type. (Never override the default template "
│ │ │ +
469 "arguments.)");
│ │ │ +
470 return *this / norm();
│ │ │ +
471 }
│ │ │ +
│ │ │ +
472
│ │ │ +
475 template<typename S = Scalar>
│ │ │ +
476 typename std::enable_if<
│ │ │ +
477 sizeof(decltype(
│ │ │ +
478 static_cast<S>(0),
│ │ │ +
479 std::declval<VectorT<S, DIM>>().norm())) >= 0,
│ │ │ +
480 vector_type&>::type
│ │ │ +
│ │ │ + │ │ │ +
482 static_assert(std::is_same<S, Scalar>::value, "S and Scalar need "
│ │ │ +
483 "to be the same type. (Never override the default template "
│ │ │ +
484 "arguments.)");
│ │ │ +
485 auto n = norm();
│ │ │ +
486 if (n != static_cast<decltype(norm())>(0)) {
│ │ │ +
487 *this /= n;
│ │ │ +
488 }
│ │ │ +
489 return *this;
│ │ │ +
490 }
│ │ │ +
│ │ │ +
491
│ │ │ +
493
│ │ │ +
494 //------------------------------------------------------------ euclidean norm
│ │ │ +
495
│ │ │ +
497
│ │ │ +
498
│ │ │ +
│ │ │ +
500 Scalar l1_norm() const {
│ │ │ +
501 return std::accumulate(
│ │ │ +
502 values_.cbegin() + 1, values_.cend(), values_[0]);
│ │ │ +
503 }
│ │ │ +
│ │ │ +
504
│ │ │ +
│ │ │ +
506 Scalar l8_norm() const {
│ │ │ +
507 return max_abs();
│ │ │ +
508 }
│ │ │ +
│ │ │ +
509
│ │ │ +
511
│ │ │ +
512 //------------------------------------------------------------ max, min, mean
│ │ │ +
513
│ │ │ +
515
│ │ │ +
516
│ │ │ +
│ │ │ +
518 Scalar max() const {
│ │ │ +
519 return *std::max_element(values_.cbegin(), values_.cend());
│ │ │ +
520 }
│ │ │ +
│ │ │ +
521
│ │ │ +
│ │ │ +
523 Scalar max_abs() const {
│ │ │ +
524 return std::abs(
│ │ │ +
525 *std::max_element(values_.cbegin(), values_.cend(),
│ │ │ +
526 [](const Scalar &a, const Scalar &b) {
│ │ │ +
527 return std::abs(a) < std::abs(b);
│ │ │ +
528 }));
│ │ │ +
529 }
│ │ │ +
│ │ │ +
530
│ │ │ +
│ │ │ +
532 Scalar min() const {
│ │ │ +
533 return *std::min_element(values_.cbegin(), values_.cend());
│ │ │ +
534 }
│ │ │ +
│ │ │ +
535
│ │ │ +
│ │ │ +
537 Scalar min_abs() const {
│ │ │ +
538 return std::abs(
│ │ │ +
539 *std::min_element(values_.cbegin(), values_.cend(),
│ │ │ +
540 [](const Scalar &a, const Scalar &b) {
│ │ │ +
541 return std::abs(a) < std::abs(b);
│ │ │ +
542 }));
│ │ │ +
543 }
│ │ │ +
│ │ │ +
544
│ │ │ +
│ │ │ +
546 Scalar mean() const {
│ │ │ +
547 return l1_norm()/DIM;
│ │ │ +
548 }
│ │ │ +
│ │ │ +
549
│ │ │ +
│ │ │ +
551 Scalar mean_abs() const {
│ │ │ +
552 return std::accumulate(values_.cbegin() + 1, values_.cend(),
│ │ │ +
553 std::abs(values_[0]),
│ │ │ +
554 [](const Scalar &l, const Scalar &r) {
│ │ │ +
555 return l + std::abs(r);
│ │ │ +
556 }) / DIM;
│ │ │ +
557 }
│ │ │ +
│ │ │ +
558
│ │ │ +
│ │ │ + │ │ │ +
561 std::transform(values_.cbegin(), values_.cend(),
│ │ │ +
562 _rhs.values_.cbegin(),
│ │ │ +
563 values_.begin(),
│ │ │ +
564 [](const Scalar &l, const Scalar &r) {
│ │ │ +
565 return std::min(l, r);
│ │ │ +
566 });
│ │ │ +
567 return *this;
│ │ │ +
568 }
│ │ │ +
│ │ │ +
569
│ │ │ +
│ │ │ +
571 bool minimized(const vector_type& _rhs) {
│ │ │ +
572 bool result = false;
│ │ │ +
573 std::transform(values_.cbegin(), values_.cend(),
│ │ │ +
574 _rhs.values_.cbegin(),
│ │ │ +
575 values_.begin(),
│ │ │ +
576 [&result](const Scalar &l, const Scalar &r) {
│ │ │ +
577 if (l < r) {
│ │ │ +
578 return l;
│ │ │ +
579 } else {
│ │ │ +
580 result = true;
│ │ │ +
581 return r;
│ │ │ +
582 }
│ │ │ +
583 });
│ │ │ +
584 return result;
│ │ │ +
585 }
│ │ │ +
│ │ │ +
586
│ │ │ +
│ │ │ + │ │ │ +
589 std::transform(values_.cbegin(), values_.cend(),
│ │ │ +
590 _rhs.values_.cbegin(),
│ │ │ +
591 values_.begin(),
│ │ │ +
592 [](const Scalar &l, const Scalar &r) {
│ │ │ +
593 return std::max(l, r);
│ │ │ +
594 });
│ │ │ +
595 return *this;
│ │ │ +
596 }
│ │ │ +
│ │ │ +
597
│ │ │ +
│ │ │ +
599 bool maximized(const vector_type& _rhs) {
│ │ │ +
600 bool result = false;
│ │ │ +
601 std::transform(values_.cbegin(), values_.cend(),
│ │ │ +
602 _rhs.values_.cbegin(),
│ │ │ +
603 values_.begin(),
│ │ │ +
604 [&result](const Scalar &l, const Scalar &r) {
│ │ │ +
605 if (l > r) {
│ │ │ +
606 return l;
│ │ │ +
607 } else {
│ │ │ +
608 result = true;
│ │ │ +
609 return r;
│ │ │ +
610 }
│ │ │ +
611 });
│ │ │ +
612 return result;
│ │ │ +
613 }
│ │ │ +
│ │ │ +
614
│ │ │ +
│ │ │ +
616 inline vector_type min(const vector_type& _rhs) const {
│ │ │ +
617 return vector_type(*this).minimize(_rhs);
│ │ │ +
618 }
│ │ │ +
│ │ │ +
619
│ │ │ +
│ │ │ +
621 inline vector_type max(const vector_type& _rhs) const {
│ │ │ +
622 return vector_type(*this).maximize(_rhs);
│ │ │ +
623 }
│ │ │ +
│ │ │ +
624
│ │ │ +
626
│ │ │ +
627 //------------------------------------------------------------ misc functions
│ │ │ +
628
│ │ │ +
630 template<typename Functor>
│ │ │ +
│ │ │ +
631 inline vector_type apply(const Functor& _func) const {
│ │ │ +
632 vector_type result;
│ │ │ +
633 std::transform(result.values_.cbegin(), result.values_.cend(),
│ │ │ +
634 result.values_.begin(), _func);
│ │ │ +
635 return result;
│ │ │ +
636 }
│ │ │ +
│ │ │ +
637
│ │ │ +
│ │ │ +
639 vector_type& vectorize(const Scalar& _s) {
│ │ │ +
640 std::fill(values_.begin(), values_.end(), _s);
│ │ │ +
641 return *this;
│ │ │ +
642 }
│ │ │ +
│ │ │ +
643
│ │ │ +
│ │ │ +
645 static vector_type vectorized(const Scalar& _s) {
│ │ │ +
646 return vector_type().vectorize(_s);
│ │ │ +
647 }
│ │ │ +
│ │ │ +
648
│ │ │ +
│ │ │ +
650 bool operator<(const vector_type& _rhs) const {
│ │ │ +
651 return std::lexicographical_compare(
│ │ │ +
652 values_.begin(), values_.end(),
│ │ │ +
653 _rhs.values_.begin(), _rhs.values_.end());
│ │ │ +
654 }
│ │ │ +
│ │ │ +
655
│ │ │ +
│ │ │ +
657 void swap(VectorT& _other)
│ │ │ +
658 noexcept(noexcept(std::swap(values_, _other.values_))) {
│ │ │ +
659 std::swap(values_, _other.values_);
│ │ │ +
660 }
│ │ │ +
│ │ │ +
661
│ │ │ +
662 //------------------------------------------------------------ component iterators
│ │ │ +
663
│ │ │ +
665
│ │ │ +
666
│ │ │ +
667 using iterator = typename container::iterator;
│ │ │ +
668 using const_iterator = typename container::const_iterator;
│ │ │ +
669 using reverse_iterator = typename container::reverse_iterator;
│ │ │ +
670 using const_reverse_iterator = typename container::const_reverse_iterator;
│ │ │ +
671
│ │ │ +
672 iterator begin() noexcept { return values_.begin(); }
│ │ │ +
673 const_iterator begin() const noexcept { return values_.cbegin(); }
│ │ │ +
674 const_iterator cbegin() const noexcept { return values_.cbegin(); }
│ │ │ +
675
│ │ │ +
676 iterator end() noexcept { return values_.end(); }
│ │ │ +
677 const_iterator end() const noexcept { return values_.cend(); }
│ │ │ +
678 const_iterator cend() const noexcept { return values_.cend(); }
│ │ │ +
679
│ │ │ +
680 reverse_iterator rbegin() noexcept { return values_.rbegin(); }
│ │ │ +
681 const_reverse_iterator rbegin() const noexcept { return values_.crbegin(); }
│ │ │ +
682 const_reverse_iterator crbegin() const noexcept { return values_.crbegin(); }
│ │ │ +
683
│ │ │ +
684 reverse_iterator rend() noexcept { return values_.rend(); }
│ │ │ +
685 const_reverse_iterator rend() const noexcept { return values_.crend(); }
│ │ │ +
686 const_reverse_iterator crend() const noexcept { return values_.crend(); }
│ │ │ +
687
│ │ │ +
689};
│ │ │ +
│ │ │ +
690
│ │ │ +
692template<typename Scalar, int DIM, typename OtherScalar>
│ │ │ +
│ │ │ +
693auto operator*(const OtherScalar& _s, const VectorT<Scalar, DIM> &rhs) ->
│ │ │ +
694 decltype(rhs.operator*(_s)) {
│ │ │ +
695
│ │ │ +
696 return rhs * _s;
│ │ │ +
697}
│ │ │ +
│ │ │ +
698
│ │ │ +
700template<typename Scalar, int DIM>
│ │ │ +
701auto operator<<(std::ostream& os, const VectorT<Scalar, DIM> &_vec) ->
│ │ │ +
702 typename std::enable_if<
│ │ │ +
703 sizeof(decltype(os << _vec[0])) >= 0, std::ostream&>::type {
│ │ │ +
704
│ │ │ +
705 os << _vec[0];
│ │ │ +
706 for (int i = 1; i < DIM; ++i) {
│ │ │ +
707 os << " " << _vec[i];
│ │ │ +
708 }
│ │ │ +
709 return os;
│ │ │ +
710}
│ │ │ +
711
│ │ │ +
713template<typename Scalar, int DIM>
│ │ │ +
714auto operator>> (std::istream& is, VectorT<Scalar, DIM> &_vec) ->
│ │ │ +
715 typename std::enable_if<
│ │ │ +
716 sizeof(decltype(is >> _vec[0])) >= 0, std::istream &>::type {
│ │ │ +
717 for (int i = 0; i < DIM; ++i)
│ │ │ +
718 is >> _vec[i];
│ │ │ +
719 return is;
│ │ │ +
720}
│ │ │ +
721
│ │ │ +
724template<typename Scalar, int DIM>
│ │ │ +
│ │ │ +
725Scalar dot(const VectorT<Scalar, DIM>& _v1, const VectorT<Scalar, DIM>& _v2) {
│ │ │ +
726 return (_v1 | _v2);
│ │ │ +
727}
│ │ │ +
│ │ │ +
728
│ │ │ +
731template<typename LScalar, typename RScalar, int DIM>
│ │ │ +
732auto
│ │ │ +
│ │ │ + │ │ │ +
734 decltype(_v1 % _v2) {
│ │ │ +
735 return (_v1 % _v2);
│ │ │ +
736}
│ │ │ +
│ │ │ +
737
│ │ │ +
740template<typename Scalar, int DIM>
│ │ │ +
│ │ │ + │ │ │ +
742noexcept(noexcept(_v1.swap(_v2))) {
│ │ │ +
743 _v1.swap(_v2);
│ │ │ +
744}
│ │ │ +
│ │ │ +
745
│ │ │ +
748template<typename Scalar, int DIM>
│ │ │ +
│ │ │ +
749Scalar norm(const VectorT<Scalar, DIM>& _v) {
│ │ │ +
750 return _v.norm();
│ │ │ +
751}
│ │ │ +
│ │ │ +
752
│ │ │ +
755template<typename Scalar, int DIM>
│ │ │ +
│ │ │ +
756Scalar sqrnorm(const VectorT<Scalar, DIM>& _v) {
│ │ │ +
757 return _v.sqrnorm();
│ │ │ +
758}
│ │ │ +
│ │ │ +
761template<typename Scalar, int DIM, typename OtherScalar>
│ │ │ +
│ │ │ + │ │ │ +
763 return _v.vectorize(_val);
│ │ │ +
764}
│ │ │ +
│ │ │ +
765
│ │ │ +
768template<typename Scalar, int DIM>
│ │ │ +
│ │ │ + │ │ │ +
770 return _v.normalize();
│ │ │ +
771}
│ │ │ +
│ │ │ +
772
│ │ │ +
775template<typename Scalar, int DIM>
│ │ │ +
│ │ │ + │ │ │ +
777 return _v1.maximize(_v2);
│ │ │ +
778}
│ │ │ +
│ │ │ +
779
│ │ │ +
782template<typename Scalar, int DIM>
│ │ │ +
│ │ │ + │ │ │ +
784 return _v1.minimize(_v2);
│ │ │ +
785}
│ │ │ +
│ │ │ +
786
│ │ │ +
789template<typename Scalar, int DIM>
│ │ │ +
│ │ │ + │ │ │ +
791 return _v1.max(_v2);
│ │ │ +
792}
│ │ │ +
│ │ │ +
793
│ │ │ +
796template<typename Scalar, int DIM>
│ │ │ +
│ │ │ + │ │ │ +
798 return _v1.min(_v2);
│ │ │ +
799}
│ │ │ +
│ │ │ +
800
│ │ │ +
801
│ │ │ +
802//== TYPEDEFS =================================================================
│ │ │ +
803
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
820
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
837
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
856
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
873
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
890
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
907
│ │ │ +
908} // namespace OpenMesh
│ │ │ +
909
│ │ │ +
918constexpr OpenMesh::Vec4f operator"" _htmlColor(unsigned long long raw_color) {
│ │ │ +
919 return OpenMesh::Vec4f(
│ │ │ +
920 ((raw_color >> 24) & 0xFF) / 255.0f,
│ │ │ +
921 ((raw_color >> 16) & 0xFF) / 255.0f,
│ │ │ +
922 ((raw_color >> 8) & 0xFF) / 255.0f,
│ │ │ +
923 ((raw_color >> 0) & 0xFF) / 255.0f);
│ │ │ +
924}
│ │ │ +
925
│ │ │ +
926#endif /* OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ */
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
VectorT< signed char, 3 > Vec3c
3-byte signed vector
Definition Vector11T.hh:839
│ │ │ -
VectorT< double, 3 > Vec3d
3-double vector
Definition Vector11T.hh:853
│ │ │ -
VectorT< signed int, 1 > Vec1i
1-int signed vector
Definition Vector11T.hh:813
│ │ │ -
VectorT< unsigned char, 5 > Vec5uc
5-byte unsigned vector
Definition Vector11T.hh:877
│ │ │ -
VectorT< unsigned int, 2 > Vec2ui
2-int unsigned vector
Definition Vector11T.hh:832
│ │ │ -
osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2)
Adapter for osg vector member computing a scalar product.
Definition VectorAdapter.hh:176
│ │ │ -
VectorT< double, 1 > Vec1d
1-double vector
Definition Vector11T.hh:819
│ │ │ -
VectorT< double, 4 > Vec4d
4-double vector
Definition Vector11T.hh:872
│ │ │ -
VectorT< float, 2 > Vec2f
2-float vector
Definition Vector11T.hh:834
│ │ │ -
VectorT< signed short int, 3 > Vec3s
3-short signed vector
Definition Vector11T.hh:843
│ │ │ -
VectorT< double, 2 > Vec2d
2-double vector
Definition Vector11T.hh:836
│ │ │ -
VectorT< signed int, 5 > Vec5i
5-int signed vector
Definition Vector11T.hh:883
│ │ │ -
VectorT< signed char, 4 > Vec4c
4-byte signed vector
Definition Vector11T.hh:858
│ │ │ -
VectorT< signed char, 5 > Vec5c
5-byte signed vector
Definition Vector11T.hh:875
│ │ │ -
VectorT< unsigned int, 5 > Vec5ui
5-int unsigned vector
Definition Vector11T.hh:885
│ │ │ -
VectorT< signed short int, 5 > Vec5s
5-short signed vector
Definition Vector11T.hh:879
│ │ │ -
VectorT< unsigned int, 4 > Vec4ui
4-int unsigned vector
Definition Vector11T.hh:868
│ │ │ -
VectorT< unsigned short int, 3 > Vec3us
3-short unsigned vector
Definition Vector11T.hh:845
│ │ │ -
VectorT< unsigned char, 3 > Vec3uc
3-byte unsigned vector
Definition Vector11T.hh:841
│ │ │ -
VectorT< signed short int, 2 > Vec2s
2-short signed vector
Definition Vector11T.hh:826
│ │ │ -
VectorT< signed int, 2 > Vec2i
2-int signed vector
Definition Vector11T.hh:830
│ │ │
auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) -> decltype(rhs.operator*(_s))
Component wise multiplication from the left.
Definition Vector11T.hh:693
│ │ │ -
VectorT< signed char, 2 > Vec2c
2-byte signed vector
Definition Vector11T.hh:822
│ │ │ -
VectorT< unsigned short int, 2 > Vec2us
2-short unsigned vector
Definition Vector11T.hh:828
│ │ │ -
VectorT< signed char, 6 > Vec6c
6-byte signed vector
Definition Vector11T.hh:892
│ │ │ -
VectorT< signed int, 6 > Vec6i
6-int signed vector
Definition Vector11T.hh:900
│ │ │ -
VectorT< signed int, 4 > Vec4i
4-int signed vector
Definition Vector11T.hh:866
│ │ │ -
VectorT< signed short int, 4 > Vec4s
4-short signed vector
Definition Vector11T.hh:862
│ │ │ -
VectorT< unsigned char, 6 > Vec6uc
6-byte unsigned vector
Definition Vector11T.hh:894
│ │ │ -
VectorT< float, 6 > Vec6f
6-float vector
Definition Vector11T.hh:904
│ │ │ -
VectorT< float, 5 > Vec5f
5-float vector
Definition Vector11T.hh:887
│ │ │ -
VectorT< unsigned char, 2 > Vec2uc
2-byte unsigned vector
Definition Vector11T.hh:824
│ │ │ -
VectorT< unsigned int, 6 > Vec6ui
6-int unsigned vector
Definition Vector11T.hh:902
│ │ │
VectorT< float, 4 > Vec4f
4-float vector
Definition Vector11T.hh:870
│ │ │ -
VectorT< unsigned char, 1 > Vec1uc
1-byte unsigned vector
Definition Vector11T.hh:807
│ │ │ -
VectorT< unsigned char, 4 > Vec4uc
4-byte unsigned vector
Definition Vector11T.hh:860
│ │ │ -
VectorT< unsigned short int, 1 > Vec1us
1-short unsigned vector
Definition Vector11T.hh:811
│ │ │ -
VectorT< float, 1 > Vec1f
1-float vector
Definition Vector11T.hh:817
│ │ │ -
VectorT< double, 6 > Vec6d
6-double vector
Definition Vector11T.hh:906
│ │ │ -
VectorT< signed short int, 1 > Vec1s
1-short signed vector
Definition Vector11T.hh:809
│ │ │ -
VectorT< bool, 3 > Vec3b
3-bool vector
Definition Vector11T.hh:855
│ │ │ -
VectorT< unsigned int, 1 > Vec1ui
1-int unsigned vector
Definition Vector11T.hh:815
│ │ │ -
VectorT< signed char, 1 > Vec1c
1-byte signed vector
Definition Vector11T.hh:805
│ │ │ -
VectorT< double, 5 > Vec5d
5-double vector
Definition Vector11T.hh:889
│ │ │ -
VectorT< unsigned short int, 4 > Vec4us
4-short unsigned vector
Definition Vector11T.hh:864
│ │ │ -
VectorT< unsigned int, 3 > Vec3ui
3-int unsigned vector
Definition Vector11T.hh:849
│ │ │ -
VectorT< unsigned short int, 6 > Vec6us
6-short unsigned vector
Definition Vector11T.hh:898
│ │ │ -
VectorT< unsigned short int, 5 > Vec5us
5-short unsigned vector
Definition Vector11T.hh:881
│ │ │ -
VectorT< float, 3 > Vec3f
3-float vector
Definition Vector11T.hh:851
│ │ │ -
VectorT< signed short int, 6 > Vec6s
6-short signed vector
Definition Vector11T.hh:896
│ │ │ -
VectorT< signed int, 3 > Vec3i
3-int signed vector
Definition Vector11T.hh:847
│ │ │ +
Definition Vector11T.hh:83
│ │ │ +
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition Vector11T.hh:639
│ │ │ +
const Scalar & operator[](size_t _i) const
get i'th element read-only
Definition Vector11T.hh:215
│ │ │ +
VectorT< Scalar, DIM > & normalize(VectorT< Scalar, DIM > &_v)
non-member normalize
Definition Vector11T.hh:769
│ │ │ +
VectorT(Iterator it)
construct from a value array or any other iterator
Definition Vector11T.hh:168
│ │ │ +
auto cross(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this % _rhs)
cross product: only defined for Vec3* as specialization
Definition Vector11T.hh:389
│ │ │ +
Scalar dot(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
symmetric version of the dot product
Definition Vector11T.hh:725
│ │ │ +
Scalar * data()
access to Scalar array
Definition Vector11T.hh:201
│ │ │ +
auto operator*(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0
component-wise vector multiplication
│ │ │ +
VectorT< Scalar, DIM > & minimize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
non-member minimize
Definition Vector11T.hh:783
│ │ │ +
auto operator+(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0
component-wise vector addition
│ │ │ +
VectorT< Scalar, DIM > vector_type
type of this vector
Definition Vector11T.hh:99
│ │ │ +
static constexpr int dim()
returns dimension of the vector (deprecated)
Definition Vector11T.hh:102
│ │ │ +
decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const
compute squared euclidean norm
Definition Vector11T.hh:422
│ │ │ +
static constexpr size_t size()
returns dimension of the vector
Definition Vector11T.hh:107
│ │ │ +
const Scalar * data() const
access to const Scalar array
Definition Vector11T.hh:204
│ │ │ +
VectorT< Scalar, DIM > & vectorize(VectorT< Scalar, DIM > &_v, OtherScalar const &_val)
non-member vectorize
Definition Vector11T.hh:762
│ │ │ +
void swap(VectorT &_other) noexcept(noexcept(std::swap(values_, _other.values_)))
swap with another vector
Definition Vector11T.hh:657
│ │ │ +
Scalar max_abs() const
return the maximal absolute component
Definition Vector11T.hh:523
│ │ │ +
vector_type min(const vector_type &_rhs) const
component-wise min
Definition Vector11T.hh:616
│ │ │ +
VectorT< Scalar, DIM > min(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
non-member min
Definition Vector11T.hh:797
│ │ │ +
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition Vector11T.hh:588
│ │ │ +
Scalar sqrnorm(const VectorT< Scalar, DIM > &_v)
non-member sqrnorm
Definition Vector11T.hh:756
│ │ │ +
auto cross(const VectorT< LScalar, DIM > &_v1, const VectorT< RScalar, DIM > &_v2) -> decltype(_v1 % _v2)
symmetric version of the cross product
Definition Vector11T.hh:733
│ │ │ +
auto operator|(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this->data() **_rhs.data())
compute scalar product
Definition Vector11T.hh:399
│ │ │ +
auto operator-(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0
component-wise vector difference
│ │ │ +
vector_type &::type normalize_cond()
compute squared euclidean norm
Definition Vector11T.hh:481
│ │ │ +
VectorT< Scalar, DIM > & maximize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2)
non-member maximize
Definition Vector11T.hh:776
│ │ │ +
void swap(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2) noexcept(noexcept(_v1.swap(_v2)))
non-member swap
Definition Vector11T.hh:741
│ │ │ +
VectorT< Scalar, DIM > max(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > &_v2)
non-member max
Definition Vector11T.hh:790
│ │ │ +
auto operator-=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0
vector difference from this
│ │ │ +
auto operator*=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0
component-wise self-multiplication
│ │ │ +
auto operator/=(const OtherScalar &_s) -> typename std::enable_if< std::is_convertible< decltype(this->values_[0]/_s), Scalar >::value, VectorT< Scalar, DIM > & >::type
component-wise self-division by scalar
Definition Vector11T.hh:248
│ │ │ +
vector_type max(const vector_type &_rhs) const
component-wise max
Definition Vector11T.hh:621
│ │ │ +
vector_type & operator=(const VectorT< OtherScalar, DIM > &_rhs)
cast from vector with a different scalar type
Definition Vector11T.hh:192
│ │ │ +
auto operator/=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0
component-wise self-division
│ │ │ +
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition Vector11T.hh:560
│ │ │ +
static vector_type vectorized(const Scalar &_s)
store the same value in each component
Definition Vector11T.hh:645
│ │ │ +
Scalar l8_norm() const
compute l8_norm
Definition Vector11T.hh:506
│ │ │ +
Scalar min_abs() const
return the minimal absolute component
Definition Vector11T.hh:537
│ │ │ +
VectorT(const Scalar &v)
Creates a vector with all components set to v.
Definition Vector11T.hh:134
│ │ │ +
auto length() const -> decltype(std::declval< VectorT< S, DIM > >().norm())
compute squared euclidean norm
Definition Vector11T.hh:443
│ │ │ +
auto operator/(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0
component-wise vector division
│ │ │ +
vector_type operator-(void) const
unary minus
Definition Vector11T.hh:365
│ │ │ +
bool operator<(const vector_type &_rhs) const
lexicographical comparison
Definition Vector11T.hh:650
│ │ │ +
bool minimized(const vector_type &_rhs)
minimize values and signalize coordinate minimization
Definition Vector11T.hh:571
│ │ │ +
auto homogenized() const -> typename std::enable_if< D==4, VectorT< decltype(std::declval< S >()/std::declval< S >()), DIM > >::type
Only for 4-component vectors with division operator on their Scalar: Dehomogenization.
Definition Vector11T.hh:148
│ │ │ +
Scalar mean_abs() const
return absolute arithmetic mean
Definition Vector11T.hh:551
│ │ │ +
Scalar l1_norm() const
compute L1 (Manhattan) norm
Definition Vector11T.hh:500
│ │ │ +
Scalar value_type
the type of the scalar used in this template
Definition Vector11T.hh:96
│ │ │ +
auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs)
compute scalar product
Definition Vector11T.hh:409
│ │ │ +
VectorT(const VectorT< otherScalarType, DIM > &_rhs)
copy & cast constructor (explicit)
Definition Vector11T.hh:182
│ │ │ +
Scalar mean() const
return arithmetic mean
Definition Vector11T.hh:546
│ │ │ +
auto operator*=(const OtherScalar &_s) -> typename std::enable_if< std::is_convertible< decltype(this->values_[0] *_s), Scalar >::value, VectorT< Scalar, DIM > & >::type
component-wise self-multiplication with scalar
Definition Vector11T.hh:236
│ │ │ +
auto operator+=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std::enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0
vector self-addition
│ │ │ +
constexpr VectorT()
default constructor creates uninitialized values.
Definition Vector11T.hh:129
│ │ │ +
vector_type apply(const Functor &_func) const
component-wise apply function object with Scalar operator()(Scalar).
Definition Vector11T.hh:631
│ │ │ +
bool operator==(const vector_type &_rhs) const
component-wise comparison
Definition Vector11T.hh:223
│ │ │ +
bool operator!=(const vector_type &_rhs) const
component-wise comparison
Definition Vector11T.hh:228
│ │ │ +
Scalar max() const
return the maximal component
Definition Vector11T.hh:518
│ │ │ +
bool maximized(const vector_type &_rhs)
maximize values and signalize coordinate maximization
Definition Vector11T.hh:599
│ │ │ +
auto normalize() -> decltype(*this/=std::declval< VectorT< S, DIM > >().norm())
normalize vector, return normalized vector
Definition Vector11T.hh:454
│ │ │ +
Scalar & operator[](size_t _i)
get i'th element read-write
Definition Vector11T.hh:209
│ │ │ +
auto norm() const -> decltype(std::sqrt(std::declval< VectorT< S, DIM > >().sqrnorm()))
compute euclidean norm
Definition Vector11T.hh:434
│ │ │ +
Scalar min() const
return the minimal component
Definition Vector11T.hh:532
│ │ │ +
auto normalized() const -> decltype(*this/std::declval< VectorT< S, DIM > >().norm())
return normalized vector
Definition Vector11T.hh:465
│ │ │
auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), DIM > >::type
cross product: only defined for Vec3* as specialization
Definition Vector11T.hh:375
│ │ │ +
Scalar norm(const VectorT< Scalar, DIM > &_v)
non-member norm
Definition Vector11T.hh:749
│ │ │ +
VectorT(container &&_array)
construct from an array
Definition Vector11T.hh:173
│ │ │
Definition VectorT_inc.hh:68
│ │ │ -
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition VectorT_inc.hh:564
│ │ │ -
Scalar norm() const
compute euclidean norm
Definition VectorT_inc.hh:410
│ │ │ -
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition VectorT_inc.hh:605
│ │ │ -
Scalar sqrnorm() const
compute squared euclidean norm
Definition VectorT_inc.hh:414
│ │ │ -
vector_type & normalize()
normalize vector, return normalized vector
Definition VectorT_inc.hh:432
│ │ │ -
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition VectorT_inc.hh:547
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -VectorT.hh │ │ │ │ +Vector11T.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,596 +45,1070 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43 │ │ │ │ +42#ifndef OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ │ │ │ │ +43#define OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ │ │ │ │ 44 │ │ │ │ -45 │ │ │ │ -46// │ │ │ │ -============================================================================= │ │ │ │ -47// │ │ │ │ -48// CLASS VectorT │ │ │ │ -49// │ │ │ │ -50// │ │ │ │ -============================================================================= │ │ │ │ -51 │ │ │ │ -52// Don't parse this header file with doxygen since │ │ │ │ -53// for some reason (obviously due to a bug in doxygen, │ │ │ │ -54// bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182) │ │ │ │ -55// macro expansion and preprocessor defines │ │ │ │ -56// don't work properly. │ │ │ │ -57 │ │ │ │ -58#if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || │ │ │ │ -defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY) │ │ │ │ -59#include "Vector11T.hh" │ │ │ │ -60#else │ │ │ │ -61#ifndef DOXYGEN │ │ │ │ -62 │ │ │ │ -63#ifndef OPENMESH_VECTOR_HH │ │ │ │ -64#define OPENMESH_VECTOR_HH │ │ │ │ +45#include │ │ │ │ +46#include │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50#include │ │ │ │ +51#include │ │ │ │ +52#include │ │ │ │ +53#include │ │ │ │ +54#include │ │ │ │ +55 │ │ │ │ +56// This header is not needed by this file but expected by others including │ │ │ │ +57// this file. │ │ │ │ +58#include │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +61/* │ │ │ │ +62 * Helpers for VectorT │ │ │ │ +63 */ │ │ │ │ +64namespace { │ │ │ │ 65 │ │ │ │ -66 │ │ │ │ -67//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ +66template │ │ │ │ +67struct are_convertible_to; │ │ │ │ 68 │ │ │ │ -69#include │ │ │ │ -70#include │ │ │ │ -71#include │ │ │ │ -72#include │ │ │ │ -73#include │ │ │ │ +69template │ │ │ │ +70struct are_convertible_to { │ │ │ │ +71 static constexpr bool value = std::is_convertible::value │ │ │ │ +72 && are_convertible_to::value; │ │ │ │ +73}; │ │ │ │ 74 │ │ │ │ -75#if defined(__GNUC__) && defined(__SSE__) │ │ │ │ -76#include │ │ │ │ -77#endif │ │ │ │ -78 │ │ │ │ -79//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -80 │ │ │ │ +75template │ │ │ │ +76struct are_convertible_to : public std::is_convertible { │ │ │ │ +77}; │ │ │ │ +78} │ │ │ │ +79 │ │ │ │ +80namespace _O_p_e_n_M_e_s_h { │ │ │ │ 81 │ │ │ │ -82namespace _O_p_e_n_M_e_s_h { │ │ │ │ -83 │ │ │ │ +82template │ │ │ │ +_8_3class _V_e_c_t_o_r_T { │ │ │ │ 84 │ │ │ │ -85//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ +85 static_assert(DIM >= 1, "VectorT requires positive dimensionality."); │ │ │ │ 86 │ │ │ │ -87 │ │ │ │ -97template class VectorDataT { │ │ │ │ -98 public: │ │ │ │ -99 Scalar values_[N]; │ │ │ │ -100}; │ │ │ │ -101 │ │ │ │ -102 │ │ │ │ -103#if defined(__GNUC__) && defined(__SSE__) │ │ │ │ -104 │ │ │ │ -106template<> class VectorDataT { │ │ │ │ -107 public: │ │ │ │ -108 union { │ │ │ │ -109 __m128 m128; │ │ │ │ -110 float values_[4]; │ │ │ │ -111 }; │ │ │ │ -112}; │ │ │ │ -113 │ │ │ │ -114#endif │ │ │ │ -115 │ │ │ │ -116 │ │ │ │ -117 │ │ │ │ -118 │ │ │ │ -119//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ -120 │ │ │ │ -121 │ │ │ │ -122#define DIM N │ │ │ │ -123#define TEMPLATE_HEADER template │ │ │ │ -124#define CLASSNAME VectorT │ │ │ │ -125#define DERIVED VectorDataT │ │ │ │ -126#define unroll(expr) for (int i=0; i; │ │ │ │ +89 container values_; │ │ │ │ +90 │ │ │ │ +91 public: │ │ │ │ +92 │ │ │ │ +93 //---------------------------------------------------------------- class │ │ │ │ +info │ │ │ │ +94 │ │ │ │ +_9_6 typedef Scalar _v_a_l_u_e___t_y_p_e; │ │ │ │ +97 │ │ │ │ +_9_9 typedef _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> _v_e_c_t_o_r___t_y_p_e; │ │ │ │ +100 │ │ │ │ +_1_0_2 static constexpr int _d_i_m() { │ │ │ │ +103 return DIM; │ │ │ │ +104 } │ │ │ │ +105 │ │ │ │ +_1_0_7 static constexpr size_t _s_i_z_e() { │ │ │ │ +108 return DIM; │ │ │ │ +109 } │ │ │ │ +110 │ │ │ │ +111 static constexpr const size_t size_ = DIM; │ │ │ │ +112 │ │ │ │ +113 //------------------------------------------------------------- │ │ │ │ +- constructors │ │ │ │ +114 │ │ │ │ +115 // Converting constructor: Constructs the vector from DIM values (of │ │ │ │ +116 // potentially heterogenous types) which are all convertible to Scalar. │ │ │ │ +117 template::type, │ │ │ │ +119 typename = typename std::enable_if< │ │ │ │ +120 are_convertible_to::value>::type> │ │ │ │ +121 constexpr _V_e_c_t_o_r_T(T v, Ts... vs) : values_ { {static_cast(v), │ │ │ │ +static_cast(vs)...} } { │ │ │ │ +122 static_assert(sizeof...(Ts)+1 == DIM, │ │ │ │ +123 "Invalid number of components specified in constructor."); │ │ │ │ +124 static_assert(are_convertible_to::value, │ │ │ │ +125 "Not all components are convertible to Scalar."); │ │ │ │ +126 } │ │ │ │ 127 │ │ │ │ -133#include "VectorT_inc.hh" │ │ │ │ -134 │ │ │ │ -135#undef DIM │ │ │ │ -136#undef TEMPLATE_HEADER │ │ │ │ -137#undef CLASSNAME │ │ │ │ -138#undef DERIVED │ │ │ │ -139#undef unroll │ │ │ │ -140 │ │ │ │ -141 │ │ │ │ +_1_2_9 constexpr _V_e_c_t_o_r_T() {} │ │ │ │ +130 │ │ │ │ +_1_3_4 explicit _V_e_c_t_o_r_T(const Scalar &v) { │ │ │ │ +135 _v_e_c_t_o_r_i_z_e(v); │ │ │ │ +136 } │ │ │ │ +137 │ │ │ │ +138 _V_e_c_t_o_r_T(const _V_e_c_t_o_r_T &rhs) = default; │ │ │ │ +139 _V_e_c_t_o_r_T(_V_e_c_t_o_r_T &&rhs) = default; │ │ │ │ +140 _V_e_c_t_o_r_T &operator=(const _V_e_c_t_o_r_T &rhs) = default; │ │ │ │ +141 _V_e_c_t_o_r_T &operator=(_V_e_c_t_o_r_T &&rhs) = default; │ │ │ │ 142 │ │ │ │ -143 │ │ │ │ -144//== PARTIAL TEMPLATE SPECIALIZATIONS │ │ │ │ -========================================= │ │ │ │ -145#if OM_PARTIAL_SPECIALIZATION │ │ │ │ -146 │ │ │ │ -147 │ │ │ │ -148#define TEMPLATE_HEADER template │ │ │ │ -149#define CLASSNAME VectorT │ │ │ │ -150#define DERIVED VectorDataT │ │ │ │ -151 │ │ │ │ -152 │ │ │ │ -153#define DIM 2 │ │ │ │ -154#define unroll(expr) expr(0) expr(1) │ │ │ │ -155#define unroll_comb(expr, op) expr(0) op expr(1) │ │ │ │ -156#define unroll_csv(expr) expr(0), expr(1) │ │ │ │ -157#include "VectorT_inc.hh" │ │ │ │ -158#undef DIM │ │ │ │ -159#undef unroll │ │ │ │ -160#undef unroll_comb │ │ │ │ -161#undef unroll_csv │ │ │ │ +147 template │ │ │ │ +_1_4_8 auto _h_o_m_o_g_e_n_i_z_e_d() const -> │ │ │ │ +149 typename std::enable_if()/std::declval()), DIM>>::type { │ │ │ │ +151 static_assert(D == DIM, "D and DIM need to be identical. (Never " │ │ │ │ +152 "override the default template arguments.)"); │ │ │ │ +153 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +154 "to be the same type. (Never override the default template " │ │ │ │ +155 "arguments.)"); │ │ │ │ +156 return _V_e_c_t_o_r_T( │ │ │ │ +157 values_[0]/values_[3], │ │ │ │ +158 values_[1]/values_[3], │ │ │ │ +159 values_[2]/values_[3], │ │ │ │ +160 1); │ │ │ │ +161 } │ │ │ │ 162 │ │ │ │ -163 │ │ │ │ -164#define DIM 3 │ │ │ │ -165#define unroll(expr) expr(0) expr(1) expr(2) │ │ │ │ -166#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) │ │ │ │ -167#define unroll_csv(expr) expr(0), expr(1), expr(2) │ │ │ │ -168#include "VectorT_inc.hh" │ │ │ │ -169#undef DIM │ │ │ │ -170#undef unroll │ │ │ │ -171#undef unroll_comb │ │ │ │ -172#undef unroll_csv │ │ │ │ -173 │ │ │ │ -174 │ │ │ │ -175#define DIM 4 │ │ │ │ -176#define unroll(expr) expr(0) expr(1) expr(2) expr(3) │ │ │ │ -177#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) │ │ │ │ -178#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3) │ │ │ │ -179#include "VectorT_inc.hh" │ │ │ │ -180#undef DIM │ │ │ │ -181#undef unroll │ │ │ │ -182#undef unroll_comb │ │ │ │ -183#undef unroll_csv │ │ │ │ -184 │ │ │ │ -185#define DIM 5 │ │ │ │ -186#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) │ │ │ │ -187#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op │ │ │ │ -expr(4) │ │ │ │ -188#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4) │ │ │ │ -189#include "VectorT_inc.hh" │ │ │ │ -190#undef DIM │ │ │ │ -191#undef unroll │ │ │ │ -192#undef unroll_comb │ │ │ │ -193#undef unroll_csv │ │ │ │ -194 │ │ │ │ -195#define DIM 6 │ │ │ │ -196#define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5) │ │ │ │ -197#define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op │ │ │ │ -expr(4) op expr(5) │ │ │ │ -198#define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr │ │ │ │ -(5) │ │ │ │ -199#include "VectorT_inc.hh" │ │ │ │ -200#undef DIM │ │ │ │ -201#undef unroll │ │ │ │ -202#undef unroll_comb │ │ │ │ -203#undef unroll_csv │ │ │ │ -204 │ │ │ │ +164 template(), void(), │ │ │ │ +167 ++std::declval(), void())> │ │ │ │ +_1_6_8 explicit _V_e_c_t_o_r_T(Iterator it) { │ │ │ │ +169 std::copy_n(it, DIM, values_.begin()); │ │ │ │ +170 } │ │ │ │ +171 │ │ │ │ +_1_7_3 explicit _V_e_c_t_o_r_T(container&& _array) : │ │ │ │ +174 values_(_array) │ │ │ │ +175 { │ │ │ │ +176 } │ │ │ │ +177 │ │ │ │ +179 template::value>> │ │ │ │ +_1_8_2 explicit _V_e_c_t_o_r_T(const _V_e_c_t_o_r_T_<_o_t_h_e_r_S_c_a_l_a_r_T_y_p_e_,_ _D_I_M_>& _rhs) { │ │ │ │ +183 operator=(_rhs); │ │ │ │ +184 } │ │ │ │ +185 │ │ │ │ +186 //-------------------------------------------------------------------- │ │ │ │ +- casts │ │ │ │ +187 │ │ │ │ +189 template::value>> │ │ │ │ +_1_9_2 _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) { │ │ │ │ +193 std::transform(_rhs.cbegin(), _rhs.cend(), │ │ │ │ +194 this->begin(), [](OtherScalar rhs) { │ │ │ │ +195 return static_cast(std::move(rhs)); │ │ │ │ +196 }); │ │ │ │ +197 return *this; │ │ │ │ +198 } │ │ │ │ +199 │ │ │ │ +_2_0_1 Scalar* _d_a_t_a() { return values_.data(); } │ │ │ │ +202 │ │ │ │ +_2_0_4 const Scalar* _d_a_t_a() const { return values_.data(); } │ │ │ │ 205 │ │ │ │ -206#undef TEMPLATE_HEADER │ │ │ │ -207#undef CLASSNAME │ │ │ │ -208#undef DERIVED │ │ │ │ -209 │ │ │ │ -210 │ │ │ │ -211 │ │ │ │ -212 │ │ │ │ -213//== FULL TEMPLATE SPECIALIZATIONS │ │ │ │ -============================================ │ │ │ │ -214#else │ │ │ │ -215 │ │ │ │ -217template<> │ │ │ │ -218inline _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_> │ │ │ │ -219_V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_>_:_:_o_p_e_r_a_t_o_r_%(const _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_>& _rhs) const │ │ │ │ -220{ │ │ │ │ -221 return │ │ │ │ -222 _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1], │ │ │ │ -223 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2], │ │ │ │ -224 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]); │ │ │ │ -225} │ │ │ │ +206 //----------------------------------------------------------- element │ │ │ │ +access │ │ │ │ +207 │ │ │ │ +_2_0_9 Scalar& _o_p_e_r_a_t_o_r_[_](size_t _i) { │ │ │ │ +210 assert(_i < DIM); │ │ │ │ +211 return values_[_i]; │ │ │ │ +212 } │ │ │ │ +213 │ │ │ │ +_2_1_5 const Scalar& _o_p_e_r_a_t_o_r_[_](size_t _i) const { │ │ │ │ +216 assert(_i < DIM); │ │ │ │ +217 return values_[_i]; │ │ │ │ +218 } │ │ │ │ +219 │ │ │ │ +220 //--------------------------------------------------------------- │ │ │ │ +- comparsion │ │ │ │ +221 │ │ │ │ +_2_2_3 bool _o_p_e_r_a_t_o_r_=_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ +224 return std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), │ │ │ │ +values_.cbegin()); │ │ │ │ +225 } │ │ │ │ 226 │ │ │ │ -227 │ │ │ │ -229template<> │ │ │ │ -230inline _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_> │ │ │ │ -231_V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_>_:_:_o_p_e_r_a_t_o_r_%(const _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_>& _rhs) const │ │ │ │ -232{ │ │ │ │ -233 return │ │ │ │ -234 _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1], │ │ │ │ -235 values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2], │ │ │ │ -236 values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]); │ │ │ │ -237} │ │ │ │ -238 │ │ │ │ -239#endif │ │ │ │ -240 │ │ │ │ -241 │ │ │ │ -242 │ │ │ │ -243//== GLOBAL FUNCTIONS │ │ │ │ -========================================================= │ │ │ │ -244 │ │ │ │ +_2_2_8 bool _o_p_e_r_a_t_o_r_!_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ +229 return !std::equal(_rhs.values_.cbegin(), _rhs.values_.cend(), │ │ │ │ +values_.cbegin()); │ │ │ │ +230 } │ │ │ │ +231 │ │ │ │ +232 //---------------------------------------------------------- scalar │ │ │ │ +operators │ │ │ │ +233 │ │ │ │ +235 template │ │ │ │ +_2_3_6 auto _o_p_e_r_a_t_o_r_*_=(const OtherScalar& _s) -> │ │ │ │ +237 typename std::enable_ifvalues_[0] * _s), Scalar>::value, │ │ │ │ +239 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>&>::type { │ │ │ │ +240 for (auto& e : *this) { │ │ │ │ +241 e *= _s; │ │ │ │ +242 } │ │ │ │ +243 return *this; │ │ │ │ +244 } │ │ │ │ 245 │ │ │ │ -248template │ │ │ │ -249inline _V_e_c_t_o_r_T_<_S_c_a_l_a_r_1_,_N_> _o_p_e_r_a_t_o_r_*(Scalar2 _s, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_1_,_N_>& │ │ │ │ -_v) { │ │ │ │ -250 return _v*_s; │ │ │ │ -251} │ │ │ │ -252 │ │ │ │ -253 │ │ │ │ -256template │ │ │ │ -257inline Scalar │ │ │ │ -258_d_o_t(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v1, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v2) { │ │ │ │ -259 return (_v1 | _v2); │ │ │ │ -260} │ │ │ │ -261 │ │ │ │ -262 │ │ │ │ -265template │ │ │ │ -266inline _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_> │ │ │ │ -267cross(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v1, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_N_>& _v2) { │ │ │ │ -268 return (_v1 % _v2); │ │ │ │ -269} │ │ │ │ -270 │ │ │ │ -271 │ │ │ │ -274template │ │ │ │ -275Scalar norm(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ -276 return _v._n_o_r_m(); │ │ │ │ -277} │ │ │ │ -278 │ │ │ │ +247 template │ │ │ │ +_2_4_8 auto _o_p_e_r_a_t_o_r_/_=(const OtherScalar& _s) -> │ │ │ │ +249 typename std::enable_ifvalues_[0] / _s), Scalar>::value, │ │ │ │ +251 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>&>::type { │ │ │ │ +252 for (auto& e : *this) { │ │ │ │ +253 e /= _s; │ │ │ │ +254 } │ │ │ │ +255 return *this; │ │ │ │ +256 } │ │ │ │ +257 │ │ │ │ +259 template │ │ │ │ +260 typename std::enable_if() * std::declval()), │ │ │ │ +262 Scalar>::value, │ │ │ │ +263 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>>::type │ │ │ │ +264 operator*(const OtherScalar& _s) const { │ │ │ │ +265 return _v_e_c_t_o_r___t_y_p_e(*this) *= _s; │ │ │ │ +266 } │ │ │ │ +267 │ │ │ │ +269 template │ │ │ │ +270 typename std::enable_if() / std::declval()), │ │ │ │ +272 Scalar>::value, │ │ │ │ +273 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>>::type │ │ │ │ +274 operator/(const OtherScalar& _s) const { │ │ │ │ +275 return _v_e_c_t_o_r___t_y_p_e(*this) /= _s; │ │ │ │ +276 } │ │ │ │ +277 │ │ │ │ +278 //---------------------------------------------------------- vector │ │ │ │ +operators │ │ │ │ 279 │ │ │ │ -282template │ │ │ │ -283Scalar sqrnorm(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ -284 return _v._s_q_r_n_o_r_m(); │ │ │ │ -285} │ │ │ │ -286 │ │ │ │ -287 │ │ │ │ -290template │ │ │ │ -291_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& vectorize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v, OtherScalar const& │ │ │ │ -_val) { │ │ │ │ -292 return _v._v_e_c_t_o_r_i_z_e(_val); │ │ │ │ -293} │ │ │ │ -294 │ │ │ │ -295 │ │ │ │ -298template │ │ │ │ -299_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& normalize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ -300 return _v._n_o_r_m_a_l_i_z_e(); │ │ │ │ -301} │ │ │ │ -302 │ │ │ │ +281 template │ │ │ │ +_2_8_2 auto _o_p_e_r_a_t_o_r_*_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ +283 typename std::enable_if< │ │ │ │ +284 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0, │ │ │ │ +285 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ +286 for (int i = 0; i < DIM; ++i) { │ │ │ │ +287 _d_a_t_a()[i] *= _rhs._d_a_t_a()[i]; │ │ │ │ +288 } │ │ │ │ +289 return *this; │ │ │ │ +290 } │ │ │ │ +291 │ │ │ │ +293 template │ │ │ │ +_2_9_4 auto _o_p_e_r_a_t_o_r_/_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ +295 typename std::enable_if< │ │ │ │ +296 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0, │ │ │ │ +297 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ +298 for (int i = 0; i < DIM; ++i) { │ │ │ │ +299 _d_a_t_a()[i] /= _rhs._d_a_t_a()[i]; │ │ │ │ +300 } │ │ │ │ +301 return *this; │ │ │ │ +302 } │ │ │ │ 303 │ │ │ │ -306template │ │ │ │ -307_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& maximize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ +305 template │ │ │ │ +_3_0_6 auto _o_p_e_r_a_t_o_r_-_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ +307 typename std::enable_if< │ │ │ │ +308 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0, │ │ │ │ +309 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ +310 for (int i = 0; i < DIM; ++i) { │ │ │ │ +311 _d_a_t_a()[i] -= _rhs._d_a_t_a()[i]; │ │ │ │ +312 } │ │ │ │ +313 return *this; │ │ │ │ +314 } │ │ │ │ +315 │ │ │ │ +317 template │ │ │ │ +_3_1_8 auto _o_p_e_r_a_t_o_r_+_=(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) -> │ │ │ │ +319 typename std::enable_if< │ │ │ │ +320 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0, │ │ │ │ +321 _v_e_c_t_o_r___t_y_p_e&>::type { │ │ │ │ +322 for (int i = 0; i < DIM; ++i) { │ │ │ │ +323 _d_a_t_a()[i] += _rhs._d_a_t_a()[i]; │ │ │ │ +324 } │ │ │ │ +325 return *this; │ │ │ │ +326 } │ │ │ │ +327 │ │ │ │ +329 template │ │ │ │ +_3_3_0 auto _o_p_e_r_a_t_o_r_*(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ +331 typename std::enable_if< │ │ │ │ +332 sizeof(decltype(this->values_[0] * *_rhs.data())) >= 0, │ │ │ │ +333 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ +334 return _v_e_c_t_o_r___t_y_p_e(*this) *= _rhs; │ │ │ │ +335 } │ │ │ │ +336 │ │ │ │ +338 template │ │ │ │ +_3_3_9 auto _o_p_e_r_a_t_o_r_/(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ +340 typename std::enable_if< │ │ │ │ +341 sizeof(decltype(this->values_[0] / *_rhs.data())) >= 0, │ │ │ │ +342 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ +343 return _v_e_c_t_o_r___t_y_p_e(*this) /= _rhs; │ │ │ │ +344 } │ │ │ │ +345 │ │ │ │ +347 template │ │ │ │ +_3_4_8 auto _o_p_e_r_a_t_o_r_+(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ +349 typename std::enable_if< │ │ │ │ +350 sizeof(decltype(this->values_[0] + *_rhs.data())) >= 0, │ │ │ │ +351 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ +352 return _v_e_c_t_o_r___t_y_p_e(*this) += _rhs; │ │ │ │ +353 } │ │ │ │ +354 │ │ │ │ +356 template │ │ │ │ +_3_5_7 auto _o_p_e_r_a_t_o_r_-(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ +358 typename std::enable_if< │ │ │ │ +359 sizeof(decltype(this->values_[0] - *_rhs.data())) >= 0, │ │ │ │ +360 _v_e_c_t_o_r___t_y_p_e>::type { │ │ │ │ +361 return _v_e_c_t_o_r___t_y_p_e(*this) -= _rhs; │ │ │ │ +362 } │ │ │ │ +363 │ │ │ │ +_3_6_5 _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_-(void) const { │ │ │ │ +366 _v_e_c_t_o_r___t_y_p_e v; │ │ │ │ +367 std::transform(values_.begin(), values_.end(), v.values_.begin(), │ │ │ │ +368 [](const Scalar &s) { return -s; }); │ │ │ │ +369 return v; │ │ │ │ +370 } │ │ │ │ +371 │ │ │ │ +374 template │ │ │ │ +_3_7_5 auto _o_p_e_r_a_t_o_r_%_ (const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_> &_rhs) const -> │ │ │ │ +376 typename std::enable_if>::type { │ │ │ │ +379 return { │ │ │ │ +380 values_[1] * _rhs[2] - values_[2] * _rhs[1], │ │ │ │ +381 values_[2] * _rhs[0] - values_[0] * _rhs[2], │ │ │ │ +382 values_[0] * _rhs[1] - values_[1] * _rhs[0] │ │ │ │ +383 }; │ │ │ │ +384 } │ │ │ │ +385 │ │ │ │ +388 template │ │ │ │ +_3_8_9 auto _c_r_o_s_s (const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_> &_rhs) const -> │ │ │ │ +390 decltype(*this % _rhs) │ │ │ │ +391 { │ │ │ │ +392 return *this % _rhs; │ │ │ │ +393 } │ │ │ │ +394 │ │ │ │ +395 │ │ │ │ +398 template │ │ │ │ +_3_9_9 auto _o_p_e_r_a_t_o_r_|(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ +400 decltype(*this->_d_a_t_a() * *_rhs.data()) { │ │ │ │ +401 │ │ │ │ +402 return std::inner_product(begin() + 1, begin() + DIM, _rhs.begin() + 1, │ │ │ │ +403 *begin() * *_rhs.begin()); │ │ │ │ +404 } │ │ │ │ +405 │ │ │ │ +408 template │ │ │ │ +_4_0_9 auto _d_o_t(const _V_e_c_t_o_r_T_<_O_t_h_e_r_S_c_a_l_a_r_,_ _D_I_M_>& _rhs) const -> │ │ │ │ +410 decltype(*this | _rhs) │ │ │ │ +411 { │ │ │ │ +412 return *this | _rhs; │ │ │ │ +413 } │ │ │ │ +414 │ │ │ │ +415 //------------------------------------------------------------ euclidean │ │ │ │ +norm │ │ │ │ +416 │ │ │ │ +418 │ │ │ │ +419 │ │ │ │ +421 template │ │ │ │ +_4_2_2 decltype(std::declval() * std::declval()) _s_q_r_n_o_r_m() const { │ │ │ │ +423 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +424 "to be the same type. (Never override the default template " │ │ │ │ +425 "arguments.)"); │ │ │ │ +426 typedef decltype(values_[0] * values_[0]) RESULT; │ │ │ │ +427 return std::accumulate(values_.cbegin() + 1, values_.cend(), │ │ │ │ +428 values_[0] * values_[0], │ │ │ │ +429 [](const RESULT &l, const Scalar &r) { return l + r * r; }); │ │ │ │ +430 } │ │ │ │ +431 │ │ │ │ +433 template │ │ │ │ +_4_3_4 auto _n_o_r_m() const -> │ │ │ │ +435 decltype(std::sqrt(std::declval<_V_e_c_t_o_r_T>()._s_q_r_n_o_r_m())) { │ │ │ │ +436 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +437 "to be the same type. (Never override the default template " │ │ │ │ +438 "arguments.)"); │ │ │ │ +439 return std::sqrt(_s_q_r_n_o_r_m()); │ │ │ │ +440 } │ │ │ │ +441 │ │ │ │ +442 template │ │ │ │ +_4_4_3 auto _l_e_n_g_t_h() const -> │ │ │ │ +444 decltype(std::declval<_V_e_c_t_o_r_T>()._n_o_r_m()) { │ │ │ │ +445 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +446 "to be the same type. (Never override the default template " │ │ │ │ +447 "arguments.)"); │ │ │ │ +448 return _n_o_r_m(); │ │ │ │ +449 } │ │ │ │ +450 │ │ │ │ +453 template │ │ │ │ +_4_5_4 auto _n_o_r_m_a_l_i_z_e() -> │ │ │ │ +455 decltype(*this /= std::declval>()._n_o_r_m()) { │ │ │ │ +456 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +457 "to be the same type. (Never override the default template " │ │ │ │ +458 "arguments.)"); │ │ │ │ +459 return *this /= _n_o_r_m(); │ │ │ │ +460 } │ │ │ │ +461 │ │ │ │ +464 template │ │ │ │ +_4_6_5 auto _n_o_r_m_a_l_i_z_e_d() const -> │ │ │ │ +466 decltype(*this / std::declval<_V_e_c_t_o_r_T>()._n_o_r_m()) { │ │ │ │ +467 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +468 "to be the same type. (Never override the default template " │ │ │ │ +469 "arguments.)"); │ │ │ │ +470 return *this / _n_o_r_m(); │ │ │ │ +471 } │ │ │ │ +472 │ │ │ │ +475 template │ │ │ │ +476 typename std::enable_if< │ │ │ │ +477 sizeof(decltype( │ │ │ │ +478 static_cast(0), │ │ │ │ +479 std::declval<_V_e_c_t_o_r_T_<_S_,_ _D_I_M_>>()._n_o_r_m())) >= 0, │ │ │ │ +480 _v_e_c_t_o_r___t_y_p_e&>::type │ │ │ │ +_4_8_1 _n_o_r_m_a_l_i_z_e___c_o_n_d() { │ │ │ │ +482 static_assert(std::is_same::value, "S and Scalar need " │ │ │ │ +483 "to be the same type. (Never override the default template " │ │ │ │ +484 "arguments.)"); │ │ │ │ +485 auto n = _n_o_r_m(); │ │ │ │ +486 if (n != static_cast(0)) { │ │ │ │ +487 *this /= n; │ │ │ │ +488 } │ │ │ │ +489 return *this; │ │ │ │ +490 } │ │ │ │ +491 │ │ │ │ +493 │ │ │ │ +494 //------------------------------------------------------------ euclidean │ │ │ │ +norm │ │ │ │ +495 │ │ │ │ +497 │ │ │ │ +498 │ │ │ │ +_5_0_0 Scalar _l_1___n_o_r_m() const { │ │ │ │ +501 return std::accumulate( │ │ │ │ +502 values_.cbegin() + 1, values_.cend(), values_[0]); │ │ │ │ +503 } │ │ │ │ +504 │ │ │ │ +_5_0_6 Scalar _l_8___n_o_r_m() const { │ │ │ │ +507 return _m_a_x___a_b_s(); │ │ │ │ +508 } │ │ │ │ +509 │ │ │ │ +511 │ │ │ │ +512 //------------------------------------------------------------ max, min, │ │ │ │ +mean │ │ │ │ +513 │ │ │ │ +515 │ │ │ │ +516 │ │ │ │ +_5_1_8 Scalar _m_a_x() const { │ │ │ │ +519 return *std::max_element(values_.cbegin(), values_.cend()); │ │ │ │ +520 } │ │ │ │ +521 │ │ │ │ +_5_2_3 Scalar _m_a_x___a_b_s() const { │ │ │ │ +524 return std::abs( │ │ │ │ +525 *std::max_element(values_.cbegin(), values_.cend(), │ │ │ │ +526 [](const Scalar &a, const Scalar &b) { │ │ │ │ +527 return std::abs(a) < std::abs(b); │ │ │ │ +528 })); │ │ │ │ +529 } │ │ │ │ +530 │ │ │ │ +_5_3_2 Scalar _m_i_n() const { │ │ │ │ +533 return *std::min_element(values_.cbegin(), values_.cend()); │ │ │ │ +534 } │ │ │ │ +535 │ │ │ │ +_5_3_7 Scalar _m_i_n___a_b_s() const { │ │ │ │ +538 return std::abs( │ │ │ │ +539 *std::min_element(values_.cbegin(), values_.cend(), │ │ │ │ +540 [](const Scalar &a, const Scalar &b) { │ │ │ │ +541 return std::abs(a) < std::abs(b); │ │ │ │ +542 })); │ │ │ │ +543 } │ │ │ │ +544 │ │ │ │ +_5_4_6 Scalar _m_e_a_n() const { │ │ │ │ +547 return _l_1___n_o_r_m()/DIM; │ │ │ │ +548 } │ │ │ │ +549 │ │ │ │ +_5_5_1 Scalar _m_e_a_n___a_b_s() const { │ │ │ │ +552 return std::accumulate(values_.cbegin() + 1, values_.cend(), │ │ │ │ +553 std::abs(values_[0]), │ │ │ │ +554 [](const Scalar &l, const Scalar &r) { │ │ │ │ +555 return l + std::abs(r); │ │ │ │ +556 }) / DIM; │ │ │ │ +557 } │ │ │ │ +558 │ │ │ │ +_5_6_0 _v_e_c_t_o_r___t_y_p_e& _m_i_n_i_m_i_z_e(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ +561 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ +562 _rhs.values_.cbegin(), │ │ │ │ +563 values_.begin(), │ │ │ │ +564 [](const Scalar &l, const Scalar &r) { │ │ │ │ +565 return std::min(l, r); │ │ │ │ +566 }); │ │ │ │ +567 return *this; │ │ │ │ +568 } │ │ │ │ +569 │ │ │ │ +_5_7_1 bool _m_i_n_i_m_i_z_e_d(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ +572 bool result = false; │ │ │ │ +573 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ +574 _rhs.values_.cbegin(), │ │ │ │ +575 values_.begin(), │ │ │ │ +576 [&result](const Scalar &l, const Scalar &r) { │ │ │ │ +577 if (l < r) { │ │ │ │ +578 return l; │ │ │ │ +579 } else { │ │ │ │ +580 result = true; │ │ │ │ +581 return r; │ │ │ │ +582 } │ │ │ │ +583 }); │ │ │ │ +584 return result; │ │ │ │ +585 } │ │ │ │ +586 │ │ │ │ +_5_8_8 _v_e_c_t_o_r___t_y_p_e& _m_a_x_i_m_i_z_e(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ +589 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ +590 _rhs.values_.cbegin(), │ │ │ │ +591 values_.begin(), │ │ │ │ +592 [](const Scalar &l, const Scalar &r) { │ │ │ │ +593 return std::max(l, r); │ │ │ │ +594 }); │ │ │ │ +595 return *this; │ │ │ │ +596 } │ │ │ │ +597 │ │ │ │ +_5_9_9 bool _m_a_x_i_m_i_z_e_d(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ +600 bool result = false; │ │ │ │ +601 std::transform(values_.cbegin(), values_.cend(), │ │ │ │ +602 _rhs.values_.cbegin(), │ │ │ │ +603 values_.begin(), │ │ │ │ +604 [&result](const Scalar &l, const Scalar &r) { │ │ │ │ +605 if (l > r) { │ │ │ │ +606 return l; │ │ │ │ +607 } else { │ │ │ │ +608 result = true; │ │ │ │ +609 return r; │ │ │ │ +610 } │ │ │ │ +611 }); │ │ │ │ +612 return result; │ │ │ │ +613 } │ │ │ │ +614 │ │ │ │ +_6_1_6 inline _v_e_c_t_o_r___t_y_p_e _m_i_n(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ +617 return _v_e_c_t_o_r___t_y_p_e(*this)._m_i_n_i_m_i_z_e(_rhs); │ │ │ │ +618 } │ │ │ │ +619 │ │ │ │ +_6_2_1 inline _v_e_c_t_o_r___t_y_p_e _m_a_x(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ +622 return _v_e_c_t_o_r___t_y_p_e(*this)._m_a_x_i_m_i_z_e(_rhs); │ │ │ │ +623 } │ │ │ │ +624 │ │ │ │ +626 │ │ │ │ +627 //------------------------------------------------------------ misc │ │ │ │ +functions │ │ │ │ +628 │ │ │ │ +630 template │ │ │ │ +_6_3_1 inline _v_e_c_t_o_r___t_y_p_e _a_p_p_l_y(const Functor& _func) const { │ │ │ │ +632 _v_e_c_t_o_r___t_y_p_e result; │ │ │ │ +633 std::transform(result.values_.cbegin(), result.values_.cend(), │ │ │ │ +634 result.values_.begin(), _func); │ │ │ │ +635 return result; │ │ │ │ +636 } │ │ │ │ +637 │ │ │ │ +_6_3_9 _v_e_c_t_o_r___t_y_p_e& _v_e_c_t_o_r_i_z_e(const Scalar& _s) { │ │ │ │ +640 std::fill(values_.begin(), values_.end(), _s); │ │ │ │ +641 return *this; │ │ │ │ +642 } │ │ │ │ +643 │ │ │ │ +_6_4_5 static _v_e_c_t_o_r___t_y_p_e _v_e_c_t_o_r_i_z_e_d(const Scalar& _s) { │ │ │ │ +646 return _v_e_c_t_o_r___t_y_p_e()._v_e_c_t_o_r_i_z_e(_s); │ │ │ │ +647 } │ │ │ │ +648 │ │ │ │ +_6_5_0 bool _o_p_e_r_a_t_o_r_<(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ +651 return std::lexicographical_compare( │ │ │ │ +652 values_.begin(), values_.end(), │ │ │ │ +653 _rhs.values_.begin(), _rhs.values_.end()); │ │ │ │ +654 } │ │ │ │ +655 │ │ │ │ +_6_5_7 void _s_w_a_p(_V_e_c_t_o_r_T& _other) │ │ │ │ +658 noexcept(noexcept(std::swap(values_, _other.values_))) { │ │ │ │ +659 std::swap(values_, _other.values_); │ │ │ │ +660 } │ │ │ │ +661 │ │ │ │ +662 //------------------------------------------------------------ component │ │ │ │ +iterators │ │ │ │ +663 │ │ │ │ +665 │ │ │ │ +666 │ │ │ │ +667 using iterator = typename container::iterator; │ │ │ │ +668 using const_iterator = typename container::const_iterator; │ │ │ │ +669 using reverse_iterator = typename container::reverse_iterator; │ │ │ │ +670 using const_reverse_iterator = typename container::const_reverse_iterator; │ │ │ │ +671 │ │ │ │ +672 iterator begin() noexcept { return values_.begin(); } │ │ │ │ +673 const_iterator begin() const noexcept { return values_.cbegin(); } │ │ │ │ +674 const_iterator cbegin() const noexcept { return values_.cbegin(); } │ │ │ │ +675 │ │ │ │ +676 iterator end() noexcept { return values_.end(); } │ │ │ │ +677 const_iterator end() const noexcept { return values_.cend(); } │ │ │ │ +678 const_iterator cend() const noexcept { return values_.cend(); } │ │ │ │ +679 │ │ │ │ +680 reverse_iterator rbegin() noexcept { return values_.rbegin(); } │ │ │ │ +681 const_reverse_iterator rbegin() const noexcept { return values_.crbegin(); │ │ │ │ +} │ │ │ │ +682 const_reverse_iterator crbegin() const noexcept { return values_.crbegin(); │ │ │ │ +} │ │ │ │ +683 │ │ │ │ +684 reverse_iterator rend() noexcept { return values_.rend(); } │ │ │ │ +685 const_reverse_iterator rend() const noexcept { return values_.crend(); } │ │ │ │ +686 const_reverse_iterator crend() const noexcept { return values_.crend(); } │ │ │ │ +687 │ │ │ │ +689}; │ │ │ │ +690 │ │ │ │ +692template │ │ │ │ +_6_9_3auto _o_p_e_r_a_t_o_r_*(const OtherScalar& _s, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> &rhs) -> │ │ │ │ +694 decltype(rhs.operator*(_s)) { │ │ │ │ +695 │ │ │ │ +696 return rhs * _s; │ │ │ │ +697} │ │ │ │ +698 │ │ │ │ +700template │ │ │ │ +_7_0_1auto operator<<(std::ostream& os, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> &_vec) -> │ │ │ │ +702 typename std::enable_if< │ │ │ │ +703 sizeof(decltype(os << _vec[0])) >= 0, std::ostream&>::type { │ │ │ │ +704 │ │ │ │ +705 os << _vec[0]; │ │ │ │ +706 for (int i = 1; i < DIM; ++i) { │ │ │ │ +707 os << " " << _vec[i]; │ │ │ │ +708 } │ │ │ │ +709 return os; │ │ │ │ +710} │ │ │ │ +711 │ │ │ │ +713template │ │ │ │ +_7_1_4auto operator>> (std::istream& is, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> &_vec) -> │ │ │ │ +715 typename std::enable_if< │ │ │ │ +716 sizeof(decltype(is >> _vec[0])) >= 0, std::istream &>::type { │ │ │ │ +717 for (int i = 0; i < DIM; ++i) │ │ │ │ +718 is >> _vec[i]; │ │ │ │ +719 return is; │ │ │ │ +720} │ │ │ │ +721 │ │ │ │ +724template │ │ │ │ +_7_2_5Scalar _d_o_t(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) │ │ │ │ +{ │ │ │ │ +726 return (_v1 | _v2); │ │ │ │ +727} │ │ │ │ +728 │ │ │ │ +731template │ │ │ │ +732auto │ │ │ │ +_7_3_3_c_r_o_s_s(const _V_e_c_t_o_r_T_<_L_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const _V_e_c_t_o_r_T_<_R_S_c_a_l_a_r_,_ _D_I_M_>& _v2) -> │ │ │ │ +734 decltype(_v1 % _v2) { │ │ │ │ +735 return (_v1 % _v2); │ │ │ │ +736} │ │ │ │ +737 │ │ │ │ +740template │ │ │ │ +_7_4_1void _s_w_a_p(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) │ │ │ │ +742noexcept(noexcept(_v1.swap(_v2))) { │ │ │ │ +743 _v1.swap(_v2); │ │ │ │ +744} │ │ │ │ +745 │ │ │ │ +748template │ │ │ │ +_7_4_9Scalar _n_o_r_m(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ +750 return _v._n_o_r_m(); │ │ │ │ +751} │ │ │ │ +752 │ │ │ │ +755template │ │ │ │ +_7_5_6Scalar _s_q_r_n_o_r_m(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ +757 return _v._s_q_r_n_o_r_m(); │ │ │ │ +758} │ │ │ │ +761template │ │ │ │ +_7_6_2_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v_e_c_t_o_r_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v, OtherScalar const& │ │ │ │ +_val) { │ │ │ │ +763 return _v._v_e_c_t_o_r_i_z_e(_val); │ │ │ │ +764} │ │ │ │ +765 │ │ │ │ +768template │ │ │ │ +_7_6_9_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _n_o_r_m_a_l_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v) { │ │ │ │ +770 return _v._n_o_r_m_a_l_i_z_e(); │ │ │ │ +771} │ │ │ │ +772 │ │ │ │ +775template │ │ │ │ +_7_7_6_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _m_a_x_i_m_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ _D_I_M_>& _v2) { │ │ │ │ -308 return _v1._m_a_x_i_m_i_z_e(_v2); │ │ │ │ -309} │ │ │ │ -310 │ │ │ │ -311 │ │ │ │ -314template │ │ │ │ -315_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& minimize(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ +777 return _v1._m_a_x_i_m_i_z_e(_v2); │ │ │ │ +778} │ │ │ │ +779 │ │ │ │ +782template │ │ │ │ +_7_8_3_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _m_i_n_i_m_i_z_e(_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_, │ │ │ │ _D_I_M_>& _v2) { │ │ │ │ -316 return _v1._m_i_n_i_m_i_z_e(_v2); │ │ │ │ -317} │ │ │ │ -318 │ │ │ │ -319 │ │ │ │ -322template │ │ │ │ -323_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> max(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ +784 return _v1._m_i_n_i_m_i_z_e(_v2); │ │ │ │ +785} │ │ │ │ +786 │ │ │ │ +789template │ │ │ │ +_7_9_0_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> _m_a_x(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) { │ │ │ │ -324 return _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>(_v1)._m_a_x_i_m_i_z_e(_v2); │ │ │ │ -325} │ │ │ │ -326 │ │ │ │ -327 │ │ │ │ -330template │ │ │ │ -331_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> min(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ +791 return _v1._m_a_x(_v2); │ │ │ │ +792} │ │ │ │ +793 │ │ │ │ +796template │ │ │ │ +_7_9_7_V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_> _m_i_n(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v1, const │ │ │ │ _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>& _v2) { │ │ │ │ -332 return _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_ _D_I_M_>(_v1)._m_i_n_i_m_i_z_e(_v2); │ │ │ │ -333} │ │ │ │ -334 │ │ │ │ -335 │ │ │ │ -336//== TYPEDEFS │ │ │ │ +798 return _v1._m_i_n(_v2); │ │ │ │ +799} │ │ │ │ +800 │ │ │ │ +801 │ │ │ │ +802//== TYPEDEFS │ │ │ │ ================================================================= │ │ │ │ -337 │ │ │ │ -339typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_c; │ │ │ │ -341typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_u_c; │ │ │ │ -343typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_s; │ │ │ │ -345typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_u_s; │ │ │ │ -347typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_i; │ │ │ │ -349typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_u_i; │ │ │ │ -351typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_1_> _V_e_c_1_f; │ │ │ │ -353typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_1_> _V_e_c_1_d; │ │ │ │ -354 │ │ │ │ -356typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_c; │ │ │ │ -358typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_u_c; │ │ │ │ -360typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_s; │ │ │ │ -362typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_u_s; │ │ │ │ -364typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_i; │ │ │ │ -366typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_u_i; │ │ │ │ -368typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_2_> _V_e_c_2_f; │ │ │ │ -370typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_2_> _V_e_c_2_d; │ │ │ │ -371 │ │ │ │ -373typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_c; │ │ │ │ -375typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_u_c; │ │ │ │ -377typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_s; │ │ │ │ -379typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_u_s; │ │ │ │ -381typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_i; │ │ │ │ -383typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_u_i; │ │ │ │ -385typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_> _V_e_c_3_f; │ │ │ │ -387typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_> _V_e_c_3_d; │ │ │ │ -389typedef _V_e_c_t_o_r_T_<_b_o_o_l_,_3_> _V_e_c_3_b; │ │ │ │ -390 │ │ │ │ -392typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_c; │ │ │ │ -394typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_u_c; │ │ │ │ -396typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_s; │ │ │ │ -398typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_u_s; │ │ │ │ -400typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_i; │ │ │ │ -402typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_u_i; │ │ │ │ -404typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_4_> _V_e_c_4_f; │ │ │ │ -406typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_4_> _V_e_c_4_d; │ │ │ │ -407 │ │ │ │ -409typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_c; │ │ │ │ -411typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_u_c; │ │ │ │ -413typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_s; │ │ │ │ -415typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_u_s; │ │ │ │ -417typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_i; │ │ │ │ -419typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_u_i; │ │ │ │ -421typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_ _5_> _V_e_c_5_f; │ │ │ │ -423typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_ _5_> _V_e_c_5_d; │ │ │ │ -424 │ │ │ │ -426typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_c; │ │ │ │ -428typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_u_c; │ │ │ │ -430typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_s; │ │ │ │ -432typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_u_s; │ │ │ │ -434typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_i; │ │ │ │ -436typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_u_i; │ │ │ │ -438typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_6_> _V_e_c_6_f; │ │ │ │ -440typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_6_> _V_e_c_6_d; │ │ │ │ -441 │ │ │ │ -442 │ │ │ │ -443// │ │ │ │ -============================================================================= │ │ │ │ -444} // namespace OpenMesh │ │ │ │ -445// │ │ │ │ -============================================================================= │ │ │ │ -446 │ │ │ │ -447 │ │ │ │ -448#endif // OPENMESH_VECTOR_HH defined │ │ │ │ -449// │ │ │ │ -============================================================================= │ │ │ │ -450#endif // DOXYGEN │ │ │ │ -451#endif // C++11 │ │ │ │ +803 │ │ │ │ +_8_0_5typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_c; │ │ │ │ +_8_0_7typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_1_> _V_e_c_1_u_c; │ │ │ │ +_8_0_9typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_s; │ │ │ │ +_8_1_1typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_1_> _V_e_c_1_u_s; │ │ │ │ +_8_1_3typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_i; │ │ │ │ +_8_1_5typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_1_> _V_e_c_1_u_i; │ │ │ │ +_8_1_7typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_1_> _V_e_c_1_f; │ │ │ │ +_8_1_9typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_1_> _V_e_c_1_d; │ │ │ │ +820 │ │ │ │ +_8_2_2typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_c; │ │ │ │ +_8_2_4typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_2_> _V_e_c_2_u_c; │ │ │ │ +_8_2_6typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_s; │ │ │ │ +_8_2_8typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_2_> _V_e_c_2_u_s; │ │ │ │ +_8_3_0typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_i; │ │ │ │ +_8_3_2typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_2_> _V_e_c_2_u_i; │ │ │ │ +_8_3_4typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_2_> _V_e_c_2_f; │ │ │ │ +_8_3_6typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_2_> _V_e_c_2_d; │ │ │ │ +837 │ │ │ │ +_8_3_9typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_c; │ │ │ │ +_8_4_1typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_3_> _V_e_c_3_u_c; │ │ │ │ +_8_4_3typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_s; │ │ │ │ +_8_4_5typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_3_> _V_e_c_3_u_s; │ │ │ │ +_8_4_7typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_i; │ │ │ │ +_8_4_9typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_3_> _V_e_c_3_u_i; │ │ │ │ +_8_5_1typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_3_> _V_e_c_3_f; │ │ │ │ +_8_5_3typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_3_> _V_e_c_3_d; │ │ │ │ +_8_5_5typedef _V_e_c_t_o_r_T_<_b_o_o_l_,_3_> _V_e_c_3_b; │ │ │ │ +856 │ │ │ │ +_8_5_8typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_c; │ │ │ │ +_8_6_0typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_4_> _V_e_c_4_u_c; │ │ │ │ +_8_6_2typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_s; │ │ │ │ +_8_6_4typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_4_> _V_e_c_4_u_s; │ │ │ │ +_8_6_6typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_i; │ │ │ │ +_8_6_8typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_4_> _V_e_c_4_u_i; │ │ │ │ +_8_7_0typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_4_> _V_e_c_4_f; │ │ │ │ +_8_7_2typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_4_> _V_e_c_4_d; │ │ │ │ +873 │ │ │ │ +_8_7_5typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_c; │ │ │ │ +_8_7_7typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_ _5_> _V_e_c_5_u_c; │ │ │ │ +_8_7_9typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_s; │ │ │ │ +_8_8_1typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_ _5_> _V_e_c_5_u_s; │ │ │ │ +_8_8_3typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_i; │ │ │ │ +_8_8_5typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_ _5_> _V_e_c_5_u_i; │ │ │ │ +_8_8_7typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_ _5_> _V_e_c_5_f; │ │ │ │ +_8_8_9typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_ _5_> _V_e_c_5_d; │ │ │ │ +890 │ │ │ │ +_8_9_2typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_c; │ │ │ │ +_8_9_4typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _c_h_a_r_,_6_> _V_e_c_6_u_c; │ │ │ │ +_8_9_6typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_s; │ │ │ │ +_8_9_8typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _s_h_o_r_t_ _i_n_t_,_6_> _V_e_c_6_u_s; │ │ │ │ +_9_0_0typedef _V_e_c_t_o_r_T_<_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_i; │ │ │ │ +_9_0_2typedef _V_e_c_t_o_r_T_<_u_n_s_i_g_n_e_d_ _i_n_t_,_6_> _V_e_c_6_u_i; │ │ │ │ +_9_0_4typedef _V_e_c_t_o_r_T_<_f_l_o_a_t_,_6_> _V_e_c_6_f; │ │ │ │ +_9_0_6typedef _V_e_c_t_o_r_T_<_d_o_u_b_l_e_,_6_> _V_e_c_6_d; │ │ │ │ +907 │ │ │ │ +908} // namespace OpenMesh │ │ │ │ +909 │ │ │ │ +918constexpr _O_p_e_n_M_e_s_h_:_:_V_e_c_4_f operator"" _htmlColor(unsigned long long │ │ │ │ +raw_color) { │ │ │ │ +919 return _O_p_e_n_M_e_s_h_:_:_V_e_c_4_f( │ │ │ │ +920 ((raw_color >> 24) & 0xFF) / 255.0f, │ │ │ │ +921 ((raw_color >> 16) & 0xFF) / 255.0f, │ │ │ │ +922 ((raw_color >> 8) & 0xFF) / 255.0f, │ │ │ │ +923 ((raw_color >> 0) & 0xFF) / 255.0f); │ │ │ │ +924} │ │ │ │ +925 │ │ │ │ +926#endif /* OPENMESH_SRC_OPENMESH_CORE_GEOMETRY_VECTOR11T_HH_ */ │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_c │ │ │ │ -VectorT< signed char, 3 > Vec3c │ │ │ │ -3-byte signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:839 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_d │ │ │ │ -VectorT< double, 3 > Vec3d │ │ │ │ -3-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:853 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_i │ │ │ │ -VectorT< signed int, 1 > Vec1i │ │ │ │ -1-int signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:813 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_u_c │ │ │ │ -VectorT< unsigned char, 5 > Vec5uc │ │ │ │ -5-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:877 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_u_i │ │ │ │ -VectorT< unsigned int, 2 > Vec2ui │ │ │ │ -2-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:832 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_d_o_t │ │ │ │ -osg::Vec3f::ValueType dot(const osg::Vec3f &_v1, const osg::Vec3f &_v2) │ │ │ │ -Adapter for osg vector member computing a scalar product. │ │ │ │ -DDeeffiinniittiioonn VectorAdapter.hh:176 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_d │ │ │ │ -VectorT< double, 1 > Vec1d │ │ │ │ -1-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:819 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_d │ │ │ │ -VectorT< double, 4 > Vec4d │ │ │ │ -4-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:872 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_f │ │ │ │ -VectorT< float, 2 > Vec2f │ │ │ │ -2-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:834 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_s │ │ │ │ -VectorT< signed short int, 3 > Vec3s │ │ │ │ -3-short signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:843 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_d │ │ │ │ -VectorT< double, 2 > Vec2d │ │ │ │ -2-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:836 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_i │ │ │ │ -VectorT< signed int, 5 > Vec5i │ │ │ │ -5-int signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:883 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_c │ │ │ │ -VectorT< signed char, 4 > Vec4c │ │ │ │ -4-byte signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:858 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_c │ │ │ │ -VectorT< signed char, 5 > Vec5c │ │ │ │ -5-byte signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:875 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_u_i │ │ │ │ -VectorT< unsigned int, 5 > Vec5ui │ │ │ │ -5-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:885 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_s │ │ │ │ -VectorT< signed short int, 5 > Vec5s │ │ │ │ -5-short signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:879 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_i │ │ │ │ -VectorT< unsigned int, 4 > Vec4ui │ │ │ │ -4-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:868 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_s │ │ │ │ -VectorT< unsigned short int, 3 > Vec3us │ │ │ │ -3-short unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:845 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_c │ │ │ │ -VectorT< unsigned char, 3 > Vec3uc │ │ │ │ -3-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:841 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_s │ │ │ │ -VectorT< signed short int, 2 > Vec2s │ │ │ │ -2-short signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:826 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_i │ │ │ │ -VectorT< signed int, 2 > Vec2i │ │ │ │ -2-int signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:830 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ auto operator*(const OtherScalar &_s, const VectorT< Scalar, DIM > &rhs) - │ │ │ │ > decltype(rhs.operator*(_s)) │ │ │ │ Component wise multiplication from the left. │ │ │ │ DDeeffiinniittiioonn Vector11T.hh:693 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_c │ │ │ │ -VectorT< signed char, 2 > Vec2c │ │ │ │ -2-byte signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:822 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_u_s │ │ │ │ -VectorT< unsigned short int, 2 > Vec2us │ │ │ │ -2-short unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:828 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_c │ │ │ │ -VectorT< signed char, 6 > Vec6c │ │ │ │ -6-byte signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:892 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_i │ │ │ │ -VectorT< signed int, 6 > Vec6i │ │ │ │ -6-int signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:900 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_i │ │ │ │ -VectorT< signed int, 4 > Vec4i │ │ │ │ -4-int signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:866 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_s │ │ │ │ -VectorT< signed short int, 4 > Vec4s │ │ │ │ -4-short signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:862 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_u_c │ │ │ │ -VectorT< unsigned char, 6 > Vec6uc │ │ │ │ -6-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:894 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_f │ │ │ │ -VectorT< float, 6 > Vec6f │ │ │ │ -6-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:904 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_f │ │ │ │ -VectorT< float, 5 > Vec5f │ │ │ │ -5-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:887 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_2_u_c │ │ │ │ -VectorT< unsigned char, 2 > Vec2uc │ │ │ │ -2-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:824 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_u_i │ │ │ │ -VectorT< unsigned int, 6 > Vec6ui │ │ │ │ -6-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:902 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_c_4_f │ │ │ │ VectorT< float, 4 > Vec4f │ │ │ │ 4-float vector │ │ │ │ DDeeffiinniittiioonn Vector11T.hh:870 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_u_c │ │ │ │ -VectorT< unsigned char, 1 > Vec1uc │ │ │ │ -1-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:807 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_c │ │ │ │ -VectorT< unsigned char, 4 > Vec4uc │ │ │ │ -4-byte unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:860 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_u_s │ │ │ │ -VectorT< unsigned short int, 1 > Vec1us │ │ │ │ -1-short unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:811 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_f │ │ │ │ -VectorT< float, 1 > Vec1f │ │ │ │ -1-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:817 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_d │ │ │ │ -VectorT< double, 6 > Vec6d │ │ │ │ -6-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:906 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_s │ │ │ │ -VectorT< signed short int, 1 > Vec1s │ │ │ │ -1-short signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:809 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_b │ │ │ │ -VectorT< bool, 3 > Vec3b │ │ │ │ -3-bool vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:855 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_u_i │ │ │ │ -VectorT< unsigned int, 1 > Vec1ui │ │ │ │ -1-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:815 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_1_c │ │ │ │ -VectorT< signed char, 1 > Vec1c │ │ │ │ -1-byte signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:805 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_d │ │ │ │ -VectorT< double, 5 > Vec5d │ │ │ │ -5-double vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:889 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_4_u_s │ │ │ │ -VectorT< unsigned short int, 4 > Vec4us │ │ │ │ -4-short unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:864 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_u_i │ │ │ │ -VectorT< unsigned int, 3 > Vec3ui │ │ │ │ -3-int unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:849 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_u_s │ │ │ │ -VectorT< unsigned short int, 6 > Vec6us │ │ │ │ -6-short unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:898 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_5_u_s │ │ │ │ -VectorT< unsigned short int, 5 > Vec5us │ │ │ │ -5-short unsigned vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:881 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_f │ │ │ │ -VectorT< float, 3 > Vec3f │ │ │ │ -3-float vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:851 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_6_s │ │ │ │ -VectorT< signed short int, 6 > Vec6s │ │ │ │ -6-short signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:896 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_V_e_c_3_i │ │ │ │ -VectorT< signed int, 3 > Vec3i │ │ │ │ -3-int signed vector │ │ │ │ -DDeeffiinniittiioonn Vector11T.hh:847 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:83 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ +vector_type & vectorize(const Scalar &_s) │ │ │ │ +store the same value in each component (e.g. to clear all entries) │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:639 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ +const Scalar & operator[](size_t _i) const │ │ │ │ +get i'th element read-only │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:215 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ +VectorT< Scalar, DIM > & normalize(VectorT< Scalar, DIM > &_v) │ │ │ │ +non-member normalize │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:769 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ +VectorT(Iterator it) │ │ │ │ +construct from a value array or any other iterator │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:168 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_c_r_o_s_s │ │ │ │ +auto cross(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this % │ │ │ │ +_rhs) │ │ │ │ +cross product: only defined for Vec3* as specialization │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:389 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_o_t │ │ │ │ +Scalar dot(const VectorT< Scalar, DIM > &_v1, const VectorT< Scalar, DIM > │ │ │ │ +&_v2) │ │ │ │ +symmetric version of the dot product │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:725 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_a_t_a │ │ │ │ +Scalar * data() │ │ │ │ +access to Scalar array │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:201 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ +auto operator*(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0 │ │ │ │ +component-wise vector multiplication │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ +VectorT< Scalar, DIM > & minimize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, │ │ │ │ +DIM > &_v2) │ │ │ │ +non-member minimize │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:783 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ +auto operator+(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0 │ │ │ │ +component-wise vector addition │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r___t_y_p_e │ │ │ │ +VectorT< Scalar, DIM > vector_type │ │ │ │ +type of this vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:99 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_i_m │ │ │ │ +static constexpr int dim() │ │ │ │ +returns dimension of the vector (deprecated) │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:102 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ +decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const │ │ │ │ +compute squared euclidean norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:422 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_i_z_e │ │ │ │ +static constexpr size_t size() │ │ │ │ +returns dimension of the vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:107 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_a_t_a │ │ │ │ +const Scalar * data() const │ │ │ │ +access to const Scalar array │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:204 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ +VectorT< Scalar, DIM > & vectorize(VectorT< Scalar, DIM > &_v, OtherScalar │ │ │ │ +const &_val) │ │ │ │ +non-member vectorize │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:762 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_w_a_p │ │ │ │ +void swap(VectorT &_other) noexcept(noexcept(std::swap(values_, │ │ │ │ +_other.values_))) │ │ │ │ +swap with another vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:657 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x___a_b_s │ │ │ │ +Scalar max_abs() const │ │ │ │ +return the maximal absolute component │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:523 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ +vector_type min(const vector_type &_rhs) const │ │ │ │ +component-wise min │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:616 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ +VectorT< Scalar, DIM > min(const VectorT< Scalar, DIM > &_v1, const VectorT< │ │ │ │ +Scalar, DIM > &_v2) │ │ │ │ +non-member min │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:797 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ +vector_type & maximize(const vector_type &_rhs) │ │ │ │ +maximize values: same as *this = max(*this, _rhs), but faster │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:588 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ +Scalar sqrnorm(const VectorT< Scalar, DIM > &_v) │ │ │ │ +non-member sqrnorm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:756 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_c_r_o_s_s │ │ │ │ +auto cross(const VectorT< LScalar, DIM > &_v1, const VectorT< RScalar, DIM > │ │ │ │ +&_v2) -> decltype(_v1 % _v2) │ │ │ │ +symmetric version of the cross product │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:733 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_| │ │ │ │ +auto operator|(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype │ │ │ │ +(*this->data() **_rhs.data()) │ │ │ │ +compute scalar product │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:399 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ +auto operator-(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0 │ │ │ │ +component-wise vector difference │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e___c_o_n_d │ │ │ │ +vector_type &::type normalize_cond() │ │ │ │ +compute squared euclidean norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:481 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ +VectorT< Scalar, DIM > & maximize(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, │ │ │ │ +DIM > &_v2) │ │ │ │ +non-member maximize │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:776 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_s_w_a_p │ │ │ │ +void swap(VectorT< Scalar, DIM > &_v1, VectorT< Scalar, DIM > &_v2) noexcept │ │ │ │ +(noexcept(_v1.swap(_v2))) │ │ │ │ +non-member swap │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:741 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ +VectorT< Scalar, DIM > max(const VectorT< Scalar, DIM > &_v1, const VectorT< │ │ │ │ +Scalar, DIM > &_v2) │ │ │ │ +non-member max │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:790 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ +auto operator-=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0] - *_rhs.data())) >=0 │ │ │ │ +vector difference from this │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ +auto operator*=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0] **_rhs.data())) >=0 │ │ │ │ +component-wise self-multiplication │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ +auto operator/=(const OtherScalar &_s) -> typename std::enable_if< std:: │ │ │ │ +is_convertible< decltype(this->values_[0]/_s), Scalar >::value, VectorT< │ │ │ │ +Scalar, DIM > & >::type │ │ │ │ +component-wise self-division by scalar │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:248 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ +vector_type max(const vector_type &_rhs) const │ │ │ │ +component-wise max │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:621 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ +vector_type & operator=(const VectorT< OtherScalar, DIM > &_rhs) │ │ │ │ +cast from vector with a different scalar type │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:192 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ +auto operator/=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0 │ │ │ │ +component-wise self-division │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ +vector_type & minimize(const vector_type &_rhs) │ │ │ │ +minimize values: same as *this = min(*this, _rhs), but faster │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:560 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e_d │ │ │ │ +static vector_type vectorized(const Scalar &_s) │ │ │ │ +store the same value in each component │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:645 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_l_8___n_o_r_m │ │ │ │ +Scalar l8_norm() const │ │ │ │ +compute l8_norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:506 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n___a_b_s │ │ │ │ +Scalar min_abs() const │ │ │ │ +return the minimal absolute component │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:537 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ +VectorT(const Scalar &v) │ │ │ │ +Creates a vector with all components set to v. │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:134 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_l_e_n_g_t_h │ │ │ │ +auto length() const -> decltype(std::declval< VectorT< S, DIM > >().norm()) │ │ │ │ +compute squared euclidean norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:443 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ +auto operator/(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0]/*_rhs.data())) >=0 │ │ │ │ +component-wise vector division │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ +vector_type operator-(void) const │ │ │ │ +unary minus │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:365 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ +bool operator<(const vector_type &_rhs) const │ │ │ │ +lexicographical comparison │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:650 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e_d │ │ │ │ +bool minimized(const vector_type &_rhs) │ │ │ │ +minimize values and signalize coordinate minimization │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:571 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_h_o_m_o_g_e_n_i_z_e_d │ │ │ │ +auto homogenized() const -> typename std::enable_if< D==4, VectorT< decltype │ │ │ │ +(std::declval< S >()/std::declval< S >()), DIM > >::type │ │ │ │ +Only for 4-component vectors with division operator on their Scalar: │ │ │ │ +Dehomogenization. │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:148 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_e_a_n___a_b_s │ │ │ │ +Scalar mean_abs() const │ │ │ │ +return absolute arithmetic mean │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:551 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_l_1___n_o_r_m │ │ │ │ +Scalar l1_norm() const │ │ │ │ +compute L1 (Manhattan) norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:500 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +Scalar value_type │ │ │ │ +the type of the scalar used in this template │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_d_o_t │ │ │ │ +auto dot(const VectorT< OtherScalar, DIM > &_rhs) const -> decltype(*this|_rhs) │ │ │ │ +compute scalar product │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:409 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ +VectorT(const VectorT< otherScalarType, DIM > &_rhs) │ │ │ │ +copy & cast constructor (explicit) │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:182 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_e_a_n │ │ │ │ +Scalar mean() const │ │ │ │ +return arithmetic mean │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:546 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ +auto operator*=(const OtherScalar &_s) -> typename std::enable_if< std:: │ │ │ │ +is_convertible< decltype(this->values_[0] *_s), Scalar >::value, VectorT< │ │ │ │ +Scalar, DIM > & >::type │ │ │ │ +component-wise self-multiplication with scalar │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:236 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ +auto operator+=(const VectorT< OtherScalar, DIM > &_rhs) -> typename std:: │ │ │ │ +enable_if< sizeof(decltype(this->values_[0]+ *_rhs.data())) >=0 │ │ │ │ +vector self-addition │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ +constexpr VectorT() │ │ │ │ +default constructor creates uninitialized values. │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:129 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_a_p_p_l_y │ │ │ │ +vector_type apply(const Functor &_func) const │ │ │ │ +component-wise apply function object with Scalar operator()(Scalar). │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:631 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +bool operator==(const vector_type &_rhs) const │ │ │ │ +component-wise comparison │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:223 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ +bool operator!=(const vector_type &_rhs) const │ │ │ │ +component-wise comparison │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:228 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ +Scalar max() const │ │ │ │ +return the maximal component │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:518 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e_d │ │ │ │ +bool maximized(const vector_type &_rhs) │ │ │ │ +maximize values and signalize coordinate maximization │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:599 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ +auto normalize() -> decltype(*this/=std::declval< VectorT< S, DIM > >().norm()) │ │ │ │ +normalize vector, return normalized vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:454 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ +Scalar & operator[](size_t _i) │ │ │ │ +get i'th element read-write │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:209 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ +auto norm() const -> decltype(std::sqrt(std::declval< VectorT< S, DIM > > │ │ │ │ +().sqrnorm())) │ │ │ │ +compute euclidean norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:434 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ +Scalar min() const │ │ │ │ +return the minimal component │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:532 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e_d │ │ │ │ +auto normalized() const -> decltype(*this/std::declval< VectorT< S, DIM > > │ │ │ │ +().norm()) │ │ │ │ +return normalized vector │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:465 │ │ │ │ _O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_% │ │ │ │ auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std:: │ │ │ │ enable_if< DIM==3, VectorT< decltype((*this)[0] *_rhs[0] -(*this)[0] *_rhs[0]), │ │ │ │ DIM > >::type │ │ │ │ cross product: only defined for Vec3* as specialization │ │ │ │ DDeeffiinniittiioonn Vector11T.hh:375 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ +Scalar norm(const VectorT< Scalar, DIM > &_v) │ │ │ │ +non-member norm │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:749 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ +VectorT(container &&_array) │ │ │ │ +construct from an array │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:173 │ │ │ │ _V_e_c_t_o_r_T │ │ │ │ DDeeffiinniittiioonn VectorT_inc.hh:68 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ -vector_type & maximize(const vector_type &_rhs) │ │ │ │ -maximize values: same as *this = max(*this, _rhs), but faster │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:564 │ │ │ │ -_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ -Scalar norm() const │ │ │ │ -compute euclidean norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:410 │ │ │ │ -_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ -vector_type & vectorize(const Scalar &_s) │ │ │ │ -store the same value in each component (e.g. to clear all entries) │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:605 │ │ │ │ -_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ -Scalar sqrnorm() const │ │ │ │ -compute squared euclidean norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:414 │ │ │ │ -_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ -vector_type & normalize() │ │ │ │ -normalize vector, return normalized vector │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:432 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ -vector_type & minimize(const vector_type &_rhs) │ │ │ │ -minimize values: same as *this = min(*this, _rhs), but faster │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:547 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00773_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/NormalConeT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/EigenVectorT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
NormalConeT.hh
│ │ │ +
EigenVectorT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,94 +136,80 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42
│ │ │ -
43//=============================================================================
│ │ │ -
44//
│ │ │ -
45// CLASS NormalCone
│ │ │ -
46//
│ │ │ -
47//=============================================================================
│ │ │ -
48
│ │ │ -
49
│ │ │ -
50#ifndef OPENMESH_NORMALCONE_HH
│ │ │ -
51#define OPENMESH_NORMALCONE_HH
│ │ │ -
52
│ │ │ -
53
│ │ │ -
54//== INCLUDES =================================================================
│ │ │ -
55
│ │ │ -
56
│ │ │ -
57#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ -
58#include <OpenMesh/Core/Utils/vector_traits.hh>
│ │ │ -
59
│ │ │ -
60
│ │ │ -
61//== NAMESPACES ===============================================================
│ │ │ -
62
│ │ │ -
63
│ │ │ -
64namespace OpenMesh {
│ │ │ -
65
│ │ │ +
45#pragma once
│ │ │ +
46
│ │ │ +
47#include <Eigen/Core>
│ │ │ +
48#include <Eigen/Dense>
│ │ │ +
49#include <Eigen/Geometry>
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52namespace OpenMesh {
│ │ │ +
53 template <typename _Scalar, int _Rows, int _Cols, int _Options>
│ │ │ +
│ │ │ +
54 struct vector_traits<Eigen::Matrix<_Scalar, _Rows, _Cols, _Options>> {
│ │ │ +
55 static_assert(_Rows != Eigen::Dynamic && _Cols != Eigen::Dynamic,
│ │ │ +
56 "Should not use dynamic vectors.");
│ │ │ +
57 static_assert(_Rows == 1 || _Cols == 1, "Should not use matrices.");
│ │ │ +
58
│ │ │ +
59 using vector_type = Eigen::Matrix<_Scalar, _Rows, _Cols, _Options>;
│ │ │ +
60 using value_type = _Scalar;
│ │ │ +
61 static const size_t size_ = _Rows * _Cols;
│ │ │ +
62 static size_t size() { return size_; }
│ │ │ +
63};
│ │ │ +
│ │ │ +
64
│ │ │ +
65} // namespace OpenMesh
│ │ │
66
│ │ │ -
67//== CLASS DEFINITION =========================================================
│ │ │ +
67namespace Eigen {
│ │ │
68
│ │ │ -
69
│ │ │ -
76template <typename Vector>
│ │ │ -
│ │ │ - │ │ │ -
78{
│ │ │ -
79public:
│ │ │ -
80
│ │ │ -
81 // typedefs
│ │ │ -
82 typedef typename vector_traits<Vector>::value_type Scalar;
│ │ │ -
83 typedef Vector Vec3;
│ │ │ +
69 template <typename Derived>
│ │ │ +
70 typename Derived::Scalar dot(const MatrixBase<Derived> &x,
│ │ │ +
71 const MatrixBase<Derived> &y) {
│ │ │ +
72 return x.dot(y);
│ │ │ +
73 }
│ │ │ +
74
│ │ │ +
75 template <typename Derived>
│ │ │ +
76 typename MatrixBase< Derived >::PlainObject cross(const MatrixBase<Derived> &x, const MatrixBase<Derived> &y) {
│ │ │ +
77 return x.cross(y);
│ │ │ +
78 }
│ │ │ +
79
│ │ │ +
80 template <typename Derived>
│ │ │ +
81 typename Derived::Scalar norm(const MatrixBase<Derived> &x) {
│ │ │ +
82 return x.norm();
│ │ │ +
83 }
│ │ │
84
│ │ │ -
85
│ │ │ -
87 NormalConeT() : angle_(0.0) {}
│ │ │ -
88
│ │ │ -
90 explicit NormalConeT(const Vec3& _center_normal, Scalar _angle=0.0);
│ │ │ -
91
│ │ │ -
93 Scalar max_angle(const Vec3&) const;
│ │ │ -
94
│ │ │ -
96 Scalar max_angle(const NormalConeT&) const;
│ │ │ -
97
│ │ │ -
99 void merge(const NormalConeT&);
│ │ │ -
100
│ │ │ -
102 const Vec3& center_normal() const { return center_normal_; }
│ │ │ -
103
│ │ │ -
105 inline Scalar angle() const { return angle_; }
│ │ │ -
106
│ │ │ -
107private:
│ │ │ -
108
│ │ │ -
109 Vec3 center_normal_;
│ │ │ -
110 Scalar angle_;
│ │ │ -
111};
│ │ │ -
│ │ │ -
112
│ │ │ -
113
│ │ │ -
114//=============================================================================
│ │ │ -
115} // namespace OpenMesh
│ │ │ -
116//=============================================================================
│ │ │ -
117#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C)
│ │ │ -
118#define OPENMESH_NORMALCONE_TEMPLATES
│ │ │ -
119#include "NormalConeT_impl.hh"
│ │ │ -
120#endif
│ │ │ -
121//=============================================================================
│ │ │ -
122#endif // OPENMESH_NORMALCONE_HH defined
│ │ │ -
123//=============================================================================
│ │ │ -
124
│ │ │ +
85 template <typename Derived>
│ │ │ +
86 typename Derived::Scalar sqrnorm(const MatrixBase<Derived> &x) {
│ │ │ +
87 return x.dot(x);
│ │ │ +
88 }
│ │ │ +
89
│ │ │ +
90 template <typename Derived>
│ │ │ +
91 MatrixBase<Derived> &normalize(MatrixBase<Derived> &x) {
│ │ │ +
92 x /= x.norm();
│ │ │ +
93 return x;
│ │ │ +
94 }
│ │ │ +
95
│ │ │ +
96 template <typename Derived>
│ │ │ +
97 MatrixBase<Derived> &vectorize(MatrixBase<Derived> &x,
│ │ │ +
98 typename Derived::Scalar const &val) {
│ │ │ +
99 x.fill(val);
│ │ │ +
100 return x;
│ │ │ +
101 }
│ │ │ +
102
│ │ │ +
103} // namespace Eigen
│ │ │ +
104
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
/class NormalCone NormalCone.hh <OpenMesh/Core/Geometry/NormalConeT.hh>
Definition NormalConeT.hh:78
│ │ │ -
void merge(const NormalConeT &)
merge _cone; this instance will then enclose both former cones
Definition NormalConeT_impl.hh:118
│ │ │ -
Scalar max_angle(const Vec3 &) const
return max. distance (radians) unit vector to cone (distant side)
Definition NormalConeT_impl.hh:87
│ │ │ -
Scalar angle() const
returns size of cone (radius in radians)
Definition NormalConeT.hh:105
│ │ │ -
const Vec3 & center_normal() const
returns center normal
Definition NormalConeT.hh:102
│ │ │ -
NormalConeT()
default constructor (not initialized)
Definition NormalConeT.hh:87
│ │ │ -
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:94
│ │ │ +
Helper class providing information about a vector type.
Definition vector_traits.hh:89
│ │ │ +
static const size_t size_
size/dimension of the vector
Definition vector_traits.hh:97
│ │ │ +
static size_t size()
size/dimension of the vector
Definition vector_traits.hh:100
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -NormalConeT.hh │ │ │ │ +EigenVectorT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,120 +45,86 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -42 │ │ │ │ -43// │ │ │ │ -============================================================================= │ │ │ │ -44// │ │ │ │ -45// CLASS NormalCone │ │ │ │ -46// │ │ │ │ -47// │ │ │ │ -============================================================================= │ │ │ │ -48 │ │ │ │ -49 │ │ │ │ -50#ifndef OPENMESH_NORMALCONE_HH │ │ │ │ -51#define OPENMESH_NORMALCONE_HH │ │ │ │ -52 │ │ │ │ -53 │ │ │ │ -54//== INCLUDES │ │ │ │ -================================================================= │ │ │ │ -55 │ │ │ │ -56 │ │ │ │ -57#include │ │ │ │ -58#include │ │ │ │ -59 │ │ │ │ -60 │ │ │ │ -61//== NAMESPACES │ │ │ │ -=============================================================== │ │ │ │ -62 │ │ │ │ -63 │ │ │ │ -64namespace _O_p_e_n_M_e_s_h { │ │ │ │ -65 │ │ │ │ +45#pragma once │ │ │ │ +46 │ │ │ │ +47#include │ │ │ │ +48#include │ │ │ │ +49#include │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52namespace _O_p_e_n_M_e_s_h { │ │ │ │ +53 template │ │ │ │ +_5_4 struct _v_e_c_t_o_r___t_r_a_i_t_s> { │ │ │ │ +55 static_assert(_Rows != Eigen::Dynamic && _Cols != Eigen::Dynamic, │ │ │ │ +56 "Should not use dynamic vectors."); │ │ │ │ +57 static_assert(_Rows == 1 || _Cols == 1, "Should not use matrices."); │ │ │ │ +58 │ │ │ │ +59 using vector_type = Eigen::Matrix<_Scalar, _Rows, _Cols, _Options>; │ │ │ │ +60 using value_type = _Scalar; │ │ │ │ +61 static const size_t _s_i_z_e__ = _Rows * _Cols; │ │ │ │ +62 static size_t _s_i_z_e() { return _s_i_z_e__; } │ │ │ │ +63}; │ │ │ │ +64 │ │ │ │ +65} // namespace OpenMesh │ │ │ │ 66 │ │ │ │ -67//== CLASS DEFINITION │ │ │ │ -========================================================= │ │ │ │ +67namespace Eigen { │ │ │ │ 68 │ │ │ │ -69 │ │ │ │ -76template │ │ │ │ -_7_7class _N_o_r_m_a_l_C_o_n_e_T │ │ │ │ -78{ │ │ │ │ -79public: │ │ │ │ -80 │ │ │ │ -81 // typedefs │ │ │ │ -82 typedef typename _v_e_c_t_o_r___t_r_a_i_t_s_<_V_e_c_t_o_r_>_:_:_v_a_l_u_e___t_y_p_e Scalar; │ │ │ │ -83 typedef Vector Vec3; │ │ │ │ +69 template │ │ │ │ +70 typename Derived::Scalar dot(const MatrixBase &x, │ │ │ │ +71 const MatrixBase &y) { │ │ │ │ +72 return x.dot(y); │ │ │ │ +73 } │ │ │ │ +74 │ │ │ │ +75 template │ │ │ │ +76 typename MatrixBase< Derived >::PlainObject cross(const MatrixBase │ │ │ │ +&x, const MatrixBase &y) { │ │ │ │ +77 return x.cross(y); │ │ │ │ +78 } │ │ │ │ +79 │ │ │ │ +80 template │ │ │ │ +81 typename Derived::Scalar norm(const MatrixBase &x) { │ │ │ │ +82 return x.norm(); │ │ │ │ +83 } │ │ │ │ 84 │ │ │ │ -85 │ │ │ │ -_8_7 _N_o_r_m_a_l_C_o_n_e_T() : angle_(0.0) {} │ │ │ │ -88 │ │ │ │ -90 explicit _N_o_r_m_a_l_C_o_n_e_T(const Vec3& _center_normal, Scalar _angle=0.0); │ │ │ │ -91 │ │ │ │ -93 Scalar _m_a_x___a_n_g_l_e(const Vec3&) const; │ │ │ │ -94 │ │ │ │ -96 Scalar _m_a_x___a_n_g_l_e(const _N_o_r_m_a_l_C_o_n_e_T&) const; │ │ │ │ -97 │ │ │ │ -99 void _m_e_r_g_e(const _N_o_r_m_a_l_C_o_n_e_T&); │ │ │ │ -100 │ │ │ │ -_1_0_2 const Vec3& _c_e_n_t_e_r___n_o_r_m_a_l() const { return center_normal_; } │ │ │ │ -103 │ │ │ │ -_1_0_5 inline Scalar _a_n_g_l_e() const { return angle_; } │ │ │ │ -106 │ │ │ │ -107private: │ │ │ │ -108 │ │ │ │ -109 Vec3 center_normal_; │ │ │ │ -110 Scalar angle_; │ │ │ │ -111}; │ │ │ │ -112 │ │ │ │ -113 │ │ │ │ -114// │ │ │ │ -============================================================================= │ │ │ │ -115} // namespace OpenMesh │ │ │ │ -116// │ │ │ │ -============================================================================= │ │ │ │ -117#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C) │ │ │ │ -118#define OPENMESH_NORMALCONE_TEMPLATES │ │ │ │ -119#include "NormalConeT_impl.hh" │ │ │ │ -120#endif │ │ │ │ -121// │ │ │ │ -============================================================================= │ │ │ │ -122#endif // OPENMESH_NORMALCONE_HH defined │ │ │ │ -123// │ │ │ │ -============================================================================= │ │ │ │ -124 │ │ │ │ +85 template │ │ │ │ +86 typename Derived::Scalar sqrnorm(const MatrixBase &x) { │ │ │ │ +87 return x.dot(x); │ │ │ │ +88 } │ │ │ │ +89 │ │ │ │ +90 template │ │ │ │ +91 MatrixBase &normalize(MatrixBase &x) { │ │ │ │ +92 x /= x.norm(); │ │ │ │ +93 return x; │ │ │ │ +94 } │ │ │ │ +95 │ │ │ │ +96 template │ │ │ │ +97 MatrixBase &vectorize(MatrixBase &x, │ │ │ │ +98 typename Derived::Scalar const &val) { │ │ │ │ +99 x.fill(val); │ │ │ │ +100 return x; │ │ │ │ +101 } │ │ │ │ +102 │ │ │ │ +103} // namespace Eigen │ │ │ │ +104 │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T │ │ │ │ -/class NormalCone NormalCone.hh │ │ │ │ -DDeeffiinniittiioonn NormalConeT.hh:78 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_m_e_r_g_e │ │ │ │ -void merge(const NormalConeT &) │ │ │ │ -merge _cone; this instance will then enclose both former cones │ │ │ │ -DDeeffiinniittiioonn NormalConeT_impl.hh:118 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_m_a_x___a_n_g_l_e │ │ │ │ -Scalar max_angle(const Vec3 &) const │ │ │ │ -return max. distance (radians) unit vector to cone (distant side) │ │ │ │ -DDeeffiinniittiioonn NormalConeT_impl.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_a_n_g_l_e │ │ │ │ -Scalar angle() const │ │ │ │ -returns size of cone (radius in radians) │ │ │ │ -DDeeffiinniittiioonn NormalConeT.hh:105 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_c_e_n_t_e_r___n_o_r_m_a_l │ │ │ │ -const Vec3 & center_normal() const │ │ │ │ -returns center normal │ │ │ │ -DDeeffiinniittiioonn NormalConeT.hh:102 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_N_o_r_m_a_l_C_o_n_e_T_:_:_N_o_r_m_a_l_C_o_n_e_T │ │ │ │ -NormalConeT() │ │ │ │ -default constructor (not initialized) │ │ │ │ -DDeeffiinniittiioonn NormalConeT.hh:87 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -T::value_type value_type │ │ │ │ -Type of the scalar value. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:94 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s │ │ │ │ +Helper class providing information about a vector type. │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e__ │ │ │ │ +static const size_t size_ │ │ │ │ +size/dimension of the vector │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e │ │ │ │ +static size_t size() │ │ │ │ +size/dimension of the vector │ │ │ │ +DDeeffiinniittiioonn vector_traits.hh:100 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00776_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/MathDefs.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/Geometry/Plane3d.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
MathDefs.hh
│ │ │ +
Plane3d.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -139,140 +139,89 @@ │ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │ -
45#ifndef MATHDEFS_HH
│ │ │ -
46#define MATHDEFS_HH
│ │ │ -
47
│ │ │ -
48#include <cmath>
│ │ │ -
49#include <cfloat>
│ │ │ -
50
│ │ │ -
51#ifndef M_PI
│ │ │ -
52 #define M_PI 3.14159265359
│ │ │ -
53#endif
│ │ │ -
54
│ │ │ -
55namespace OpenMesh
│ │ │ -
56{
│ │ │ -
57
│ │ │ -
60template <class T, typename Real>
│ │ │ -
│ │ │ -
61inline bool is_zero(const T& _a, Real _eps)
│ │ │ -
62{ return fabs(_a) < _eps; }
│ │ │ -
│ │ │ +
45
│ │ │ +
46//=============================================================================
│ │ │ +
47//
│ │ │ +
48// CLASS Plane3D
│ │ │ +
49//
│ │ │ +
50//=============================================================================
│ │ │ +
51
│ │ │ +
52
│ │ │ +
53#ifndef OPENMESH_PLANE3D_HH
│ │ │ +
54#define OPENMESH_PLANE3D_HH
│ │ │ +
55
│ │ │ +
56
│ │ │ +
57//== INCLUDES =================================================================
│ │ │ +
58
│ │ │ +
59#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ +
60
│ │ │ +
61
│ │ │ +
62//== FORWARDDECLARATIONS ======================================================
│ │ │
63
│ │ │ -
64template <class T1, class T2, typename Real>
│ │ │ -
65inline bool is_eq(const T1& a, const T2& b, Real _eps)
│ │ │ -
66{ return is_zero(a-b, _eps); }
│ │ │ -
67
│ │ │ -
68template <class T1, class T2, typename Real>
│ │ │ -
69inline bool is_gt(const T1& a, const T2& b, Real _eps)
│ │ │ -
70{ return (a > b) && !is_eq(a,b,_eps); }
│ │ │ -
71
│ │ │ -
72template <class T1, class T2, typename Real>
│ │ │ -
73inline bool is_ge(const T1& a, const T2& b, Real _eps)
│ │ │ -
74{ return (a > b) || is_eq(a,b,_eps); }
│ │ │ -
75
│ │ │ -
76template <class T1, class T2, typename Real>
│ │ │ -
77inline bool is_lt(const T1& a, const T2& b, Real _eps)
│ │ │ -
78{ return (a < b) && !is_eq(a,b,_eps); }
│ │ │ -
79
│ │ │ -
80template <class T1, class T2, typename Real>
│ │ │ -
81inline bool is_le(const T1& a, const T2& b, Real _eps)
│ │ │ -
82{ return (a < b) || is_eq(a,b,_eps); }
│ │ │ -
83
│ │ │ -
84/*const float flt_eps__ = 10*FLT_EPSILON;
│ │ │ -
85const double dbl_eps__ = 10*DBL_EPSILON;*/
│ │ │ -
86const float flt_eps__ = (float)1e-05;
│ │ │ -
87const double dbl_eps__ = 1e-09;
│ │ │ -
88
│ │ │ -
89inline float eps__(float)
│ │ │ -
90{ return flt_eps__; }
│ │ │ -
91
│ │ │ -
92inline double eps__(double)
│ │ │ -
93{ return dbl_eps__; }
│ │ │ -
94
│ │ │ -
95template <class T>
│ │ │ -
96inline bool is_zero(const T& a)
│ │ │ -
97{ return is_zero(a, eps__(a)); }
│ │ │ -
98
│ │ │ -
99template <class T1, class T2>
│ │ │ -
100inline bool is_eq(const T1& a, const T2& b)
│ │ │ -
101{ return is_zero(a-b); }
│ │ │ +
64//== NAMESPACES ===============================================================
│ │ │ +
65
│ │ │ +
66namespace OpenMesh {
│ │ │ +
67namespace VDPM {
│ │ │ +
68
│ │ │ +
69//== CLASS DEFINITION =========================================================
│ │ │ +
70
│ │ │ +
71
│ │ │ +
│ │ │ +
78class OPENMESHDLLEXPORT Plane3d
│ │ │ +
79{
│ │ │ +
80public:
│ │ │ +
81
│ │ │ + │ │ │ +
83 typedef vector_type::value_type value_type;
│ │ │ +
84
│ │ │ +
85public:
│ │ │ +
86
│ │ │ +
87 Plane3d()
│ │ │ +
88 : d_(0)
│ │ │ +
89 { }
│ │ │ +
90
│ │ │ +
91 Plane3d(const vector_type &_dir, const vector_type &_pnt)
│ │ │ +
92 : n_(_dir), d_(0)
│ │ │ +
93 {
│ │ │ +
94 n_.normalize();
│ │ │ +
95 d_ = -dot(n_,_pnt);
│ │ │ +
96 }
│ │ │ +
97
│ │ │ +
98 value_type signed_distance(const OpenMesh::Vec3f &_p)
│ │ │ +
99 {
│ │ │ +
100 return dot(n_ , _p) + d_;
│ │ │ +
101 }
│ │ │
102
│ │ │ -
103template <class T1, class T2>
│ │ │ -
104inline bool is_gt(const T1& a, const T2& b)
│ │ │ -
105{ return (a > b) && !is_eq(a,b); }
│ │ │ +
103 // back compatibility
│ │ │ +
104 value_type singed_distance(const OpenMesh::Vec3f &point)
│ │ │ +
105 { return signed_distance( point ); }
│ │ │
106
│ │ │ -
107template <class T1, class T2>
│ │ │ -
108inline bool is_ge(const T1& a, const T2& b)
│ │ │ -
109{ return (a > b) || is_eq(a,b); }
│ │ │ -
110
│ │ │ -
111template <class T1, class T2>
│ │ │ -
112inline bool is_lt(const T1& a, const T2& b)
│ │ │ -
113{ return (a < b) && !is_eq(a,b); }
│ │ │ -
114
│ │ │ -
115template <class T1, class T2>
│ │ │ -
116inline bool is_le(const T1& a, const T2& b)
│ │ │ -
117{ return (a < b) || is_eq(a,b); }
│ │ │ -
118
│ │ │ -
120
│ │ │ -
121template <class T>
│ │ │ -
│ │ │ -
122inline T sane_aarg(T _aarg)
│ │ │ -
123{
│ │ │ -
124 if (_aarg < -1)
│ │ │ -
125 {
│ │ │ -
126 _aarg = -1;
│ │ │ -
127 }
│ │ │ -
128 else if (_aarg > 1)
│ │ │ -
129 {
│ │ │ -
130 _aarg = 1;
│ │ │ -
131 }
│ │ │ -
132 return _aarg;
│ │ │ -
133}
│ │ │ -
│ │ │ -
134
│ │ │ -
139template <class T>
│ │ │ -
│ │ │ -
140T angle(T _cos_angle, T _sin_angle)
│ │ │ -
141{//sanity checks - otherwise acos will return nan
│ │ │ -
142 _cos_angle = sane_aarg(_cos_angle);
│ │ │ -
143 return (T) _sin_angle >= 0 ? acos(_cos_angle) : -acos(_cos_angle);
│ │ │ -
144}
│ │ │ -
│ │ │ -
145
│ │ │ -
146template <class T>
│ │ │ -
147inline T positive_angle(T _angle)
│ │ │ -
148{ return _angle < 0 ? (2*M_PI + _angle) : _angle; }
│ │ │ -
149
│ │ │ -
150template <class T>
│ │ │ -
151inline T positive_angle(T _cos_angle, T _sin_angle)
│ │ │ -
152{ return positive_angle(angle(_cos_angle, _sin_angle)); }
│ │ │ -
153
│ │ │ -
154template <class T>
│ │ │ -
155inline T deg_to_rad(const T& _angle)
│ │ │ -
156{ return M_PI*(_angle/180); }
│ │ │ -
157
│ │ │ -
158template <class T>
│ │ │ -
159inline T rad_to_deg(const T& _angle)
│ │ │ -
160{ return 180*(_angle/M_PI); }
│ │ │ -
161
│ │ │ -
162inline double log_(double _value)
│ │ │ -
163{ return log(_value); }
│ │ │ -
164
│ │ │ -
165}//namespace OpenMesh
│ │ │ -
166
│ │ │ -
167#endif//MATHDEFS_HH
│ │ │ +
107public:
│ │ │ +
108
│ │ │ +
109 vector_type n_;
│ │ │ +
110 value_type d_;
│ │ │ +
111
│ │ │ +
112};
│ │ │ +
│ │ │ +
113
│ │ │ +
114//=============================================================================
│ │ │ +
115} // namespace VDPM
│ │ │ +
116} // namespace OpenMesh
│ │ │ +
117//=============================================================================
│ │ │ +
118#endif // OPENMESH_PLANE3D_HH defined
│ │ │ +
119//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
T angle(T _cos_angle, T _sin_angle)
returns the angle determined by its cos and the sign of its sin result is positive if the angle is in...
Definition MathDefs.hh:140
│ │ │ -
bool is_zero(const T &_a, Real _eps)
comparison operators with user-selected precision control
Definition MathDefs.hh:61
│ │ │ -
T sane_aarg(T _aarg)
Trigonometry/angles - related.
Definition MathDefs.hh:122
│ │ │ +
ax + by + cz + d = 0
Definition Plane3d.hh:79
│ │ │ + │ │ │ +
Scalar value_type
the type of the scalar used in this template
Definition Vector11T.hh:96
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -MathDefs.hh │ │ │ │ +Plane3d.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -48,143 +48,100 @@ │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ -45#ifndef MATHDEFS_HH │ │ │ │ -46#define MATHDEFS_HH │ │ │ │ -47 │ │ │ │ -48#include │ │ │ │ -49#include │ │ │ │ -50 │ │ │ │ -51#ifndef M_PI │ │ │ │ -52 #define M_PI 3.14159265359 │ │ │ │ -53#endif │ │ │ │ -54 │ │ │ │ -55namespace _O_p_e_n_M_e_s_h │ │ │ │ -56{ │ │ │ │ -57 │ │ │ │ -60template │ │ │ │ -_6_1inline bool _i_s___z_e_r_o(const T& _a, Real _eps) │ │ │ │ -62{ return fabs(_a) < _eps; } │ │ │ │ +45 │ │ │ │ +46// │ │ │ │ +============================================================================= │ │ │ │ +47// │ │ │ │ +48// CLASS Plane3D │ │ │ │ +49// │ │ │ │ +50// │ │ │ │ +============================================================================= │ │ │ │ +51 │ │ │ │ +52 │ │ │ │ +53#ifndef OPENMESH_PLANE3D_HH │ │ │ │ +54#define OPENMESH_PLANE3D_HH │ │ │ │ +55 │ │ │ │ +56 │ │ │ │ +57//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +58 │ │ │ │ +59#include │ │ │ │ +60 │ │ │ │ +61 │ │ │ │ +62//== FORWARDDECLARATIONS │ │ │ │ +====================================================== │ │ │ │ 63 │ │ │ │ -64template │ │ │ │ -65inline bool is_eq(const T1& a, const T2& b, Real _eps) │ │ │ │ -66{ return _i_s___z_e_r_o(a-b, _eps); } │ │ │ │ -67 │ │ │ │ -68template │ │ │ │ -69inline bool is_gt(const T1& a, const T2& b, Real _eps) │ │ │ │ -70{ return (a > b) && !is_eq(a,b,_eps); } │ │ │ │ +64//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +65 │ │ │ │ +66namespace _O_p_e_n_M_e_s_h { │ │ │ │ +67namespace VDPM { │ │ │ │ +68 │ │ │ │ +69//== CLASS DEFINITION │ │ │ │ +========================================================= │ │ │ │ +70 │ │ │ │ 71 │ │ │ │ -72template │ │ │ │ -73inline bool is_ge(const T1& a, const T2& b, Real _eps) │ │ │ │ -74{ return (a > b) || is_eq(a,b,_eps); } │ │ │ │ -75 │ │ │ │ -76template │ │ │ │ -77inline bool is_lt(const T1& a, const T2& b, Real _eps) │ │ │ │ -78{ return (a < b) && !is_eq(a,b,_eps); } │ │ │ │ -79 │ │ │ │ -80template │ │ │ │ -81inline bool is_le(const T1& a, const T2& b, Real _eps) │ │ │ │ -82{ return (a < b) || is_eq(a,b,_eps); } │ │ │ │ -83 │ │ │ │ -84/*const float flt_eps__ = 10*FLT_EPSILON; │ │ │ │ -85const double dbl_eps__ = 10*DBL_EPSILON;*/ │ │ │ │ -86const float flt_eps__ = (float)1e-05; │ │ │ │ -87const double dbl_eps__ = 1e-09; │ │ │ │ -88 │ │ │ │ -89inline float eps__(float) │ │ │ │ -90{ return flt_eps__; } │ │ │ │ -91 │ │ │ │ -92inline double eps__(double) │ │ │ │ -93{ return dbl_eps__; } │ │ │ │ -94 │ │ │ │ -95template │ │ │ │ -96inline bool _i_s___z_e_r_o(const T& a) │ │ │ │ -97{ return _i_s___z_e_r_o(a, eps__(a)); } │ │ │ │ -98 │ │ │ │ -99template │ │ │ │ -100inline bool is_eq(const T1& a, const T2& b) │ │ │ │ -101{ return _i_s___z_e_r_o(a-b); } │ │ │ │ +_7_8class OPENMESHDLLEXPORT _P_l_a_n_e_3_d │ │ │ │ +79{ │ │ │ │ +80public: │ │ │ │ +81 │ │ │ │ +82 typedef _O_p_e_n_M_e_s_h_:_:_V_e_c_3_f _v_e_c_t_o_r___t_y_p_e; │ │ │ │ +83 typedef _v_e_c_t_o_r___t_y_p_e_:_:_v_a_l_u_e___t_y_p_e value_type; │ │ │ │ +84 │ │ │ │ +85public: │ │ │ │ +86 │ │ │ │ +87 _P_l_a_n_e_3_d() │ │ │ │ +88 : d_(0) │ │ │ │ +89 { } │ │ │ │ +90 │ │ │ │ +91 _P_l_a_n_e_3_d(const _v_e_c_t_o_r___t_y_p_e &_dir, const _v_e_c_t_o_r___t_y_p_e &_pnt) │ │ │ │ +92 : n_(_dir), d_(0) │ │ │ │ +93 { │ │ │ │ +94 n_.normalize(); │ │ │ │ +95 d_ = -dot(n_,_pnt); │ │ │ │ +96 } │ │ │ │ +97 │ │ │ │ +98 value_type signed_distance(const _O_p_e_n_M_e_s_h_:_:_V_e_c_3_f &_p) │ │ │ │ +99 { │ │ │ │ +100 return dot(n_ , _p) + d_; │ │ │ │ +101 } │ │ │ │ 102 │ │ │ │ -103template │ │ │ │ -104inline bool is_gt(const T1& a, const T2& b) │ │ │ │ -105{ return (a > b) && !is_eq(a,b); } │ │ │ │ +103 // back compatibility │ │ │ │ +104 value_type singed_distance(const _O_p_e_n_M_e_s_h_:_:_V_e_c_3_f &point) │ │ │ │ +105 { return signed_distance( point ); } │ │ │ │ 106 │ │ │ │ -107template │ │ │ │ -108inline bool is_ge(const T1& a, const T2& b) │ │ │ │ -109{ return (a > b) || is_eq(a,b); } │ │ │ │ -110 │ │ │ │ -111template │ │ │ │ -112inline bool is_lt(const T1& a, const T2& b) │ │ │ │ -113{ return (a < b) && !is_eq(a,b); } │ │ │ │ -114 │ │ │ │ -115template │ │ │ │ -116inline bool is_le(const T1& a, const T2& b) │ │ │ │ -117{ return (a < b) || is_eq(a,b); } │ │ │ │ -118 │ │ │ │ -120 │ │ │ │ -121template │ │ │ │ -_1_2_2inline T _s_a_n_e___a_a_r_g(T _aarg) │ │ │ │ -123{ │ │ │ │ -124 if (_aarg < -1) │ │ │ │ -125 { │ │ │ │ -126 _aarg = -1; │ │ │ │ -127 } │ │ │ │ -128 else if (_aarg > 1) │ │ │ │ -129 { │ │ │ │ -130 _aarg = 1; │ │ │ │ -131 } │ │ │ │ -132 return _aarg; │ │ │ │ -133} │ │ │ │ -134 │ │ │ │ -139template │ │ │ │ -_1_4_0T _a_n_g_l_e(T _cos_angle, T _sin_angle) │ │ │ │ -141{//sanity checks - otherwise acos will return nan │ │ │ │ -142 _cos_angle = _s_a_n_e___a_a_r_g(_cos_angle); │ │ │ │ -143 return (T) _sin_angle >= 0 ? acos(_cos_angle) : -acos(_cos_angle); │ │ │ │ -144} │ │ │ │ -145 │ │ │ │ -146template │ │ │ │ -147inline T positive_angle(T _angle) │ │ │ │ -148{ return _angle < 0 ? (2*M_PI + _angle) : _angle; } │ │ │ │ -149 │ │ │ │ -150template │ │ │ │ -151inline T positive_angle(T _cos_angle, T _sin_angle) │ │ │ │ -152{ return positive_angle(_a_n_g_l_e(_cos_angle, _sin_angle)); } │ │ │ │ -153 │ │ │ │ -154template │ │ │ │ -155inline T deg_to_rad(const T& _angle) │ │ │ │ -156{ return M_PI*(_angle/180); } │ │ │ │ -157 │ │ │ │ -158template │ │ │ │ -159inline T rad_to_deg(const T& _angle) │ │ │ │ -160{ return 180*(_angle/M_PI); } │ │ │ │ -161 │ │ │ │ -162inline double log_(double _value) │ │ │ │ -163{ return log(_value); } │ │ │ │ -164 │ │ │ │ -165}//namespace OpenMesh │ │ │ │ -166 │ │ │ │ -167#endif//MATHDEFS_HH │ │ │ │ +107public: │ │ │ │ +108 │ │ │ │ +109 _v_e_c_t_o_r___t_y_p_e n_; │ │ │ │ +110 value_type d_; │ │ │ │ +111 │ │ │ │ +112}; │ │ │ │ +113 │ │ │ │ +114// │ │ │ │ +============================================================================= │ │ │ │ +115} // namespace VDPM │ │ │ │ +116} // namespace OpenMesh │ │ │ │ +117// │ │ │ │ +============================================================================= │ │ │ │ +118#endif // OPENMESH_PLANE3D_HH defined │ │ │ │ +119// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_a_n_g_l_e │ │ │ │ -T angle(T _cos_angle, T _sin_angle) │ │ │ │ -returns the angle determined by its cos and the sign of its sin result is │ │ │ │ -positive if the angle is in... │ │ │ │ -DDeeffiinniittiioonn MathDefs.hh:140 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_i_s___z_e_r_o │ │ │ │ -bool is_zero(const T &_a, Real _eps) │ │ │ │ -comparison operators with user-selected precision control │ │ │ │ -DDeeffiinniittiioonn MathDefs.hh:61 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_s_a_n_e___a_a_r_g │ │ │ │ -T sane_aarg(T _aarg) │ │ │ │ -Trigonometry/angles - related. │ │ │ │ -DDeeffiinniittiioonn MathDefs.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_D_P_M_:_:_P_l_a_n_e_3_d │ │ │ │ +ax + by + cz + d = 0 │ │ │ │ +DDeeffiinniittiioonn Plane3d.hh:79 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +Scalar value_type │ │ │ │ +the type of the scalar used in this template │ │ │ │ +DDeeffiinniittiioonn Vector11T.hh:96 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00779_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/EigenVectorT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/StoreRestore.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
EigenVectorT.hh
│ │ │ +
StoreRestore.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,80 +136,123 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
45#pragma once
│ │ │ -
46
│ │ │ -
47#include <Eigen/Core>
│ │ │ -
48#include <Eigen/Dense>
│ │ │ -
49#include <Eigen/Geometry>
│ │ │ +
42
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Helper Functions for binary reading / writing
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │
50
│ │ │ -
51
│ │ │ -
52namespace OpenMesh {
│ │ │ -
53 template <typename _Scalar, int _Rows, int _Cols, int _Options>
│ │ │ -
│ │ │ -
54 struct vector_traits<Eigen::Matrix<_Scalar, _Rows, _Cols, _Options>> {
│ │ │ -
55 static_assert(_Rows != Eigen::Dynamic && _Cols != Eigen::Dynamic,
│ │ │ -
56 "Should not use dynamic vectors.");
│ │ │ -
57 static_assert(_Rows == 1 || _Cols == 1, "Should not use matrices.");
│ │ │ -
58
│ │ │ -
59 using vector_type = Eigen::Matrix<_Scalar, _Rows, _Cols, _Options>;
│ │ │ -
60 using value_type = _Scalar;
│ │ │ -
61 static const size_t size_ = _Rows * _Cols;
│ │ │ -
62 static size_t size() { return size_; }
│ │ │ -
63};
│ │ │ -
│ │ │ -
64
│ │ │ -
65} // namespace OpenMesh
│ │ │ +
51#ifndef OPENMESH_STORERESTORE_HH
│ │ │ +
52#define OPENMESH_STORERESTORE_HH
│ │ │ +
53
│ │ │ +
54
│ │ │ +
55//== INCLUDES =================================================================
│ │ │ +
56
│ │ │ +
57#include <stdexcept>
│ │ │ +
58#include <OpenMesh/Core/System/config.h>
│ │ │ +
59#include <OpenMesh/Core/IO/SR_binary.hh>
│ │ │ +
60#include <OpenMesh/Core/IO/SR_binary_spec.hh>
│ │ │ +
61
│ │ │ +
62//== NAMESPACES ===============================================================
│ │ │ +
63
│ │ │ +
64namespace OpenMesh {
│ │ │ +
65namespace IO {
│ │ │
66
│ │ │ -
67namespace Eigen {
│ │ │ -
68
│ │ │ -
69 template <typename Derived>
│ │ │ -
70 typename Derived::Scalar dot(const MatrixBase<Derived> &x,
│ │ │ -
71 const MatrixBase<Derived> &y) {
│ │ │ -
72 return x.dot(y);
│ │ │ -
73 }
│ │ │ -
74
│ │ │ -
75 template <typename Derived>
│ │ │ -
76 typename MatrixBase< Derived >::PlainObject cross(const MatrixBase<Derived> &x, const MatrixBase<Derived> &y) {
│ │ │ -
77 return x.cross(y);
│ │ │ -
78 }
│ │ │ +
67
│ │ │ +
68//=============================================================================
│ │ │ +
69
│ │ │ +
70
│ │ │ +
75
│ │ │ +
76
│ │ │ +
77//-----------------------------------------------------------------------------
│ │ │ +
78// StoreRestore definitions
│ │ │
79
│ │ │ -
80 template <typename Derived>
│ │ │ -
81 typename Derived::Scalar norm(const MatrixBase<Derived> &x) {
│ │ │ -
82 return x.norm();
│ │ │ -
83 }
│ │ │ -
84
│ │ │ -
85 template <typename Derived>
│ │ │ -
86 typename Derived::Scalar sqrnorm(const MatrixBase<Derived> &x) {
│ │ │ -
87 return x.dot(x);
│ │ │ -
88 }
│ │ │ -
89
│ │ │ -
90 template <typename Derived>
│ │ │ -
91 MatrixBase<Derived> &normalize(MatrixBase<Derived> &x) {
│ │ │ -
92 x /= x.norm();
│ │ │ -
93 return x;
│ │ │ -
94 }
│ │ │ +
80template <typename T> inline
│ │ │ +
│ │ │ +
81bool is_streamable(void)
│ │ │ + │ │ │ +
│ │ │ +
83
│ │ │ +
84template <typename T> inline
│ │ │ +
│ │ │ +
85bool is_streamable( const T& )
│ │ │ + │ │ │ +
│ │ │ +
87
│ │ │ +
88template <typename T> inline
│ │ │ +
│ │ │ +
89size_t size_of( const T& _v )
│ │ │ +
90{ return binary< T >::size_of(_v); }
│ │ │ +
│ │ │ +
91
│ │ │ +
92template <typename T> inline
│ │ │ +
│ │ │ +
93size_t size_of( const std::vector<T> & _v, bool _store_size = true)
│ │ │ +
94{ return binary< std::vector<T> >::size_of(_v, _store_size); }
│ │ │ +
│ │ │
95
│ │ │ -
96 template <typename Derived>
│ │ │ -
97 MatrixBase<Derived> &vectorize(MatrixBase<Derived> &x,
│ │ │ -
98 typename Derived::Scalar const &val) {
│ │ │ -
99 x.fill(val);
│ │ │ -
100 return x;
│ │ │ -
101 }
│ │ │ -
102
│ │ │ -
103} // namespace Eigen
│ │ │ -
104
│ │ │ +
96template <typename T> inline
│ │ │ +
│ │ │ +
97size_t size_of(void)
│ │ │ +
98{ return binary< T >::size_of(); }
│ │ │ +
│ │ │ +
99
│ │ │ +
100template <typename T> inline
│ │ │ +
│ │ │ +
101size_t size_of(bool _store_size)
│ │ │ +
102{ return binary< std::vector<T> >::size_of(_store_size); }
│ │ │ +
│ │ │ +
103
│ │ │ +
104template <typename T> inline
│ │ │ +
│ │ │ +
105size_t store( std::ostream& _os, const T& _v, bool _swap =false)
│ │ │ +
106{ return binary< T >::store( _os, _v, _swap ); }
│ │ │ +
│ │ │ +
107
│ │ │ +
108template <typename T> inline
│ │ │ +
│ │ │ +
109size_t store( std::ostream& _os, const std::vector<T>& _v, bool _swap=false, bool _store_size = true)
│ │ │ +
110{ return binary< std::vector<T> >::store( _os, _v, _swap, _store_size); }
│ │ │ +
│ │ │ +
111
│ │ │ +
112template <typename T> inline
│ │ │ +
│ │ │ +
113size_t restore( std::istream& _is, T& _v, bool _swap = false)
│ │ │ +
114{ return binary< T >::restore( _is, _v, _swap ); }
│ │ │ +
│ │ │ +
115
│ │ │ +
116template <typename T> inline
│ │ │ +
│ │ │ +
117size_t restore( std::istream& _is, std::vector<T>& _v, bool _swap=false, bool _restore_size = true)
│ │ │ +
118{ return binary< std::vector<T> >::restore( _is, _v, _swap, _restore_size); }
│ │ │ +
│ │ │ +
119
│ │ │ +
121
│ │ │ +
122
│ │ │ +
123//=============================================================================
│ │ │ +
124} // namespace IO
│ │ │ +
125} // namespace OpenMesh
│ │ │ +
126//=============================================================================
│ │ │ +
127#endif // OPENMESH_MESHREADER_HH defined
│ │ │ +
128//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
Helper class providing information about a vector type.
Definition vector_traits.hh:89
│ │ │ -
static const size_t size_
size/dimension of the vector
Definition vector_traits.hh:97
│ │ │ -
static size_t size()
size/dimension of the vector
Definition vector_traits.hh:100
│ │ │ +
size_t size_of(void)
Binary read a short from _is and perform byte swapping if _swap is true.
Definition StoreRestore.hh:97
│ │ │ +
bool is_streamable(void)
Binary read a short from _is and perform byte swapping if _swap is true.
Definition StoreRestore.hh:81
│ │ │ +
The struct defines how to store and restore the type T.
Definition SR_binary.hh:97
│ │ │ +
static size_t restore(std::istream &, value_type &, bool=false, bool=true)
Restore a value of T and return the number of bytes read.
Definition SR_binary.hh:125
│ │ │ +
static size_t store(std::ostream &, const value_type &, bool=false, bool=true)
Store a value of T and return the number of bytes written.
Definition SR_binary.hh:113
│ │ │ +
static size_t size_of(void)
What's the size of T? If it depends on the actual value (e.g. for vectors) return UnknownSize.
Definition SR_binary.hh:104
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -EigenVectorT.hh │ │ │ │ +StoreRestore.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -45,86 +45,132 @@ │ │ │ │ 36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * │ │ │ │ 37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ -45#pragma once │ │ │ │ -46 │ │ │ │ -47#include │ │ │ │ -48#include │ │ │ │ -49#include │ │ │ │ +42 │ │ │ │ +43 │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Helper Functions for binary reading / writing │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ 50 │ │ │ │ -51 │ │ │ │ -52namespace _O_p_e_n_M_e_s_h { │ │ │ │ -53 template │ │ │ │ -_5_4 struct _v_e_c_t_o_r___t_r_a_i_t_s> { │ │ │ │ -55 static_assert(_Rows != Eigen::Dynamic && _Cols != Eigen::Dynamic, │ │ │ │ -56 "Should not use dynamic vectors."); │ │ │ │ -57 static_assert(_Rows == 1 || _Cols == 1, "Should not use matrices."); │ │ │ │ -58 │ │ │ │ -59 using vector_type = Eigen::Matrix<_Scalar, _Rows, _Cols, _Options>; │ │ │ │ -60 using value_type = _Scalar; │ │ │ │ -61 static const size_t _s_i_z_e__ = _Rows * _Cols; │ │ │ │ -62 static size_t _s_i_z_e() { return _s_i_z_e__; } │ │ │ │ -63}; │ │ │ │ -64 │ │ │ │ -65} // namespace OpenMesh │ │ │ │ +51#ifndef OPENMESH_STORERESTORE_HH │ │ │ │ +52#define OPENMESH_STORERESTORE_HH │ │ │ │ +53 │ │ │ │ +54 │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ +56 │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61 │ │ │ │ +62//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +63 │ │ │ │ +64namespace _O_p_e_n_M_e_s_h { │ │ │ │ +65namespace IO { │ │ │ │ 66 │ │ │ │ -67namespace Eigen { │ │ │ │ -68 │ │ │ │ -69 template │ │ │ │ -70 typename Derived::Scalar dot(const MatrixBase &x, │ │ │ │ -71 const MatrixBase &y) { │ │ │ │ -72 return x.dot(y); │ │ │ │ -73 } │ │ │ │ -74 │ │ │ │ -75 template │ │ │ │ -76 typename MatrixBase< Derived >::PlainObject cross(const MatrixBase │ │ │ │ -&x, const MatrixBase &y) { │ │ │ │ -77 return x.cross(y); │ │ │ │ -78 } │ │ │ │ +67 │ │ │ │ +68// │ │ │ │ +============================================================================= │ │ │ │ +69 │ │ │ │ +70 │ │ │ │ +75 │ │ │ │ +76 │ │ │ │ +77//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +78// StoreRestore definitions │ │ │ │ 79 │ │ │ │ -80 template │ │ │ │ -81 typename Derived::Scalar norm(const MatrixBase &x) { │ │ │ │ -82 return x.norm(); │ │ │ │ -83 } │ │ │ │ -84 │ │ │ │ -85 template │ │ │ │ -86 typename Derived::Scalar sqrnorm(const MatrixBase &x) { │ │ │ │ -87 return x.dot(x); │ │ │ │ -88 } │ │ │ │ -89 │ │ │ │ -90 template │ │ │ │ -91 MatrixBase &normalize(MatrixBase &x) { │ │ │ │ -92 x /= x.norm(); │ │ │ │ -93 return x; │ │ │ │ -94 } │ │ │ │ +80template inline │ │ │ │ +_8_1bool _i_s___s_t_r_e_a_m_a_b_l_e(void) │ │ │ │ +82{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_i_s___s_t_r_e_a_m_a_b_l_e; } │ │ │ │ +83 │ │ │ │ +84template inline │ │ │ │ +_8_5bool _i_s___s_t_r_e_a_m_a_b_l_e( const T& ) │ │ │ │ +86{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_i_s___s_t_r_e_a_m_a_b_l_e; } │ │ │ │ +87 │ │ │ │ +88template inline │ │ │ │ +_8_9size_t _s_i_z_e___o_f( const T& _v ) │ │ │ │ +90{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_s_i_z_e___o_f(_v); } │ │ │ │ +91 │ │ │ │ +92template inline │ │ │ │ +_9_3size_t _s_i_z_e___o_f( const std::vector & _v, bool _store_size = true) │ │ │ │ +94{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >_:_:_s_i_z_e___o_f(_v, _store_size); } │ │ │ │ 95 │ │ │ │ -96 template │ │ │ │ -97 MatrixBase &vectorize(MatrixBase &x, │ │ │ │ -98 typename Derived::Scalar const &val) { │ │ │ │ -99 x.fill(val); │ │ │ │ -100 return x; │ │ │ │ -101 } │ │ │ │ -102 │ │ │ │ -103} // namespace Eigen │ │ │ │ -104 │ │ │ │ +96template inline │ │ │ │ +_9_7size_t _s_i_z_e___o_f(void) │ │ │ │ +98{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_s_i_z_e___o_f(); } │ │ │ │ +99 │ │ │ │ +100template inline │ │ │ │ +_1_0_1size_t _s_i_z_e___o_f(bool _store_size) │ │ │ │ +102{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >_:_:_s_i_z_e___o_f(_store_size); } │ │ │ │ +103 │ │ │ │ +104template inline │ │ │ │ +_1_0_5size_t store( std::ostream& _os, const T& _v, bool _swap =false) │ │ │ │ +106{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_s_t_o_r_e( _os, _v, _swap ); } │ │ │ │ +107 │ │ │ │ +108template inline │ │ │ │ +_1_0_9size_t store( std::ostream& _os, const std::vector& _v, bool _swap=false, │ │ │ │ +bool _store_size = true) │ │ │ │ +110{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >::store( _os, _v, _swap, _store_size); } │ │ │ │ +111 │ │ │ │ +112template inline │ │ │ │ +_1_1_3size_t restore( std::istream& _is, T& _v, bool _swap = false) │ │ │ │ +114{ return _b_i_n_a_r_y_<_ _T_ _>_:_:_r_e_s_t_o_r_e( _is, _v, _swap ); } │ │ │ │ +115 │ │ │ │ +116template inline │ │ │ │ +_1_1_7size_t restore( std::istream& _is, std::vector& _v, bool _swap=false, │ │ │ │ +bool _restore_size = true) │ │ │ │ +118{ return _b_i_n_a_r_y_<_ _s_t_d_:_:_v_e_c_t_o_r_<_T_> >::restore( _is, _v, _swap, _restore_size); │ │ │ │ +} │ │ │ │ +119 │ │ │ │ +121 │ │ │ │ +122 │ │ │ │ +123// │ │ │ │ +============================================================================= │ │ │ │ +124} // namespace IO │ │ │ │ +125} // namespace OpenMesh │ │ │ │ +126// │ │ │ │ +============================================================================= │ │ │ │ +127#endif // OPENMESH_MESHREADER_HH defined │ │ │ │ +128// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s │ │ │ │ -Helper class providing information about a vector type. │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:89 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e__ │ │ │ │ -static const size_t size_ │ │ │ │ -size/dimension of the vector │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:97 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_v_e_c_t_o_r___t_r_a_i_t_s_:_:_s_i_z_e │ │ │ │ -static size_t size() │ │ │ │ -size/dimension of the vector │ │ │ │ -DDeeffiinniittiioonn vector_traits.hh:100 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_s_i_z_e___o_f │ │ │ │ +size_t size_of(void) │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn StoreRestore.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_s___s_t_r_e_a_m_a_b_l_e │ │ │ │ +bool is_streamable(void) │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn StoreRestore.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y │ │ │ │ +The struct defines how to store and restore the type T. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:97 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_r_e_s_t_o_r_e │ │ │ │ +static size_t restore(std::istream &, value_type &, bool=false, bool=true) │ │ │ │ +Restore a value of T and return the number of bytes read. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:125 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_t_o_r_e │ │ │ │ +static size_t store(std::ostream &, const value_type &, bool=false, bool=true) │ │ │ │ +Store a value of T and return the number of bytes written. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:113 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_i_z_e___o_f │ │ │ │ +static size_t size_of(void) │ │ │ │ +What's the size of T? If it depends on the actual value (e.g. for vectors) │ │ │ │ +return UnknownSize. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:104 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00782_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/VectorT_inc.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/SR_binary_spec.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
VectorT_inc.hh
│ │ │ +
SR_binary_spec.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -139,704 +139,425 @@ │ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │ -
45
│ │ │ -
46// Set template keywords and class names properly when
│ │ │ -
47// parsing with doxygen. This only seems to work this way since
│ │ │ -
48// the scope of preprocessor defines is limited to one file in doxy.
│ │ │ -
49#ifdef DOXYGEN
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Helper Functions for binary reading / writing
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │
50
│ │ │ -
51// Only used for correct doxygen parsing
│ │ │ -
52#define OPENMESH_VECTOR_HH
│ │ │ +
51#ifndef OPENMESH_SR_BINARY_SPEC_HH
│ │ │ +
52#define OPENMESH_SR_BINARY_SPEC_HH
│ │ │
53
│ │ │ -
54#define DIM N
│ │ │ -
55#define TEMPLATE_HEADER template <typename Scalar, int N>
│ │ │ -
56#define CLASSNAME VectorT
│ │ │ -
57#define DERIVED VectorDataT<Scalar,N>
│ │ │ -
58#define unroll(expr) for (int i=0; i<N; ++i) expr(i)
│ │ │ -
59
│ │ │ -
60#endif
│ │ │ -
61
│ │ │ -
62#if defined( OPENMESH_VECTOR_HH )
│ │ │ -
63
│ │ │ -
64// ----------------------------------------------------------------------------
│ │ │ -
65
│ │ │ -
66TEMPLATE_HEADER
│ │ │ -
│ │ │ -
67class CLASSNAME : public DERIVED
│ │ │ -
68{
│ │ │ -
69private:
│ │ │ -
70 typedef DERIVED Base;
│ │ │ -
71public:
│ │ │ -
72
│ │ │ -
73 //---------------------------------------------------------------- class info
│ │ │ +
54//== INCLUDES =================================================================
│ │ │ +
55
│ │ │ +
56#include <OpenMesh/Core/System/config.h>
│ │ │ +
57// -------------------- STL
│ │ │ +
58#include <iterator>
│ │ │ +
59#include <string>
│ │ │ +
60#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000)
│ │ │ + │ │ │ +
62#else
│ │ │ +
63# include <limits>
│ │ │ +
64#endif
│ │ │ +
65#include <vector>
│ │ │ +
66#include <stdexcept> // logic_error
│ │ │ +
67#include <numeric> // accumulate
│ │ │ +
68// -------------------- OpenMesh
│ │ │ +
69#include <OpenMesh/Core/Geometry/VectorT.hh>
│ │ │ +
70#include <OpenMesh/Core/Mesh/Status.hh>
│ │ │ +
71#include <OpenMesh/Core/IO/SR_types.hh>
│ │ │ +
72#include <OpenMesh/Core/IO/SR_rbo.hh>
│ │ │ +
73#include <OpenMesh/Core/IO/SR_binary.hh>
│ │ │
74
│ │ │ -
76 typedef Scalar value_type;
│ │ │ +
75
│ │ │ +
76#include <OpenMesh/Core/Utils/typename.hh>
│ │ │
77
│ │ │ - │ │ │ -
80
│ │ │ -
82 static inline int dim() { return DIM; }
│ │ │ -
83
│ │ │ -
85 static inline size_t size() { return DIM; }
│ │ │ -
86
│ │ │ -
87 static const size_t size_ = DIM;
│ │ │ -
88
│ │ │ +
78#include <iostream>
│ │ │ +
79
│ │ │ +
80//== NAMESPACES ===============================================================
│ │ │ +
81
│ │ │ +
82namespace OpenMesh {
│ │ │ +
83namespace IO {
│ │ │ +
84
│ │ │ +
85
│ │ │ +
86//=============================================================================
│ │ │ +
87
│ │ │ +
88#ifndef DOXY_IGNORE_THIS
│ │ │
89
│ │ │ -
90 //-------------------------------------------------------------- constructors
│ │ │ -
91
│ │ │ -
93 inline VectorT() {}
│ │ │ -
94
│ │ │ -
│ │ │ -
96 explicit inline VectorT(const Scalar& v) {
│ │ │ -
97// assert(DIM==1);
│ │ │ -
98// values_[0] = v0;
│ │ │ -
99 vectorize(v);
│ │ │ -
100 }
│ │ │ -
│ │ │ -
101
│ │ │ -
102#if DIM == 2
│ │ │ -
104 inline VectorT(const Scalar v0, const Scalar v1) {
│ │ │ -
105 Base::values_[0] = v0; Base::values_[1] = v1;
│ │ │ -
106 }
│ │ │ -
107#endif
│ │ │ -
108
│ │ │ -
109#if DIM == 3
│ │ │ -
111 inline VectorT(const Scalar v0, const Scalar v1, const Scalar v2) {
│ │ │ -
112 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;
│ │ │ -
113 }
│ │ │ -
114#endif
│ │ │ +
90//-----------------------------------------------------------------------------
│ │ │ +
91// struct binary, helper for storing/restoring
│ │ │ +
92
│ │ │ +
93#define SIMPLE_BINARY( T ) \
│ │ │ +
94 template <> struct binary< T > { \
│ │ │ +
95 typedef T value_type; \
│ │ │ +
96 static const bool is_streamable = true; \
│ │ │ +
97 static size_t size_of(const value_type&) { return sizeof(value_type); } \
│ │ │ +
98 static size_t size_of(void) { return sizeof(value_type); } \
│ │ │ +
99 static std::string type_identifier(void) { return #T; } \
│ │ │ +
100 static size_t store( std::ostream& _os, const value_type& _val, \
│ │ │ +
101 bool _swap=false) { \
│ │ │ +
102 value_type tmp = _val; \
│ │ │ +
103 if (_swap) reverse_byte_order(tmp); \
│ │ │ +
104 _os.write( (const char*)&tmp, sizeof(value_type) ); \
│ │ │ +
105 return _os.good() ? sizeof(value_type) : 0; \
│ │ │ +
106 } \
│ │ │ +
107 \
│ │ │ +
108 static size_t restore( std::istream& _is, value_type& _val, \
│ │ │ +
109 bool _swap=false) { \
│ │ │ +
110 _is.read( (char*)&_val, sizeof(value_type) ); \
│ │ │ +
111 if (_swap) reverse_byte_order(_val); \
│ │ │ +
112 return _is.good() ? sizeof(value_type) : 0; \
│ │ │ +
113 } \
│ │ │ +
114 }
│ │ │
115
│ │ │ -
116#if DIM == 4
│ │ │ -
118 inline VectorT(const Scalar v0, const Scalar v1,
│ │ │ -
119 const Scalar v2, const Scalar v3) {
│ │ │ -
120 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3;
│ │ │ -
121 }
│ │ │ -
122
│ │ │ -
123 VectorT homogenized() const { return VectorT(Base::values_[0]/Base::values_[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); }
│ │ │ -
124#endif
│ │ │ +
116SIMPLE_BINARY(bool);
│ │ │ +
117//SIMPLE_BINARY(int);
│ │ │ +
118
│ │ │ +
119// Why is this needed? Should not be used as not 32 bit compatible
│ │ │ +
120//SIMPLE_BINARY(unsigned long);
│ │ │ +
121SIMPLE_BINARY(float);
│ │ │ +
122SIMPLE_BINARY(double);
│ │ │ +
123SIMPLE_BINARY(long double);
│ │ │ +
124SIMPLE_BINARY(char);
│ │ │
125
│ │ │ -
126#if DIM == 5
│ │ │ -
128 inline VectorT(const Scalar v0, const Scalar v1, const Scalar v2,
│ │ │ -
129 const Scalar v3, const Scalar v4) {
│ │ │ -
130 Base::values_[0]=v0; Base::values_[1]=v1;Base::values_[2]=v2; Base::values_[3]=v3; Base::values_[4]=v4;
│ │ │ -
131 }
│ │ │ -
132#endif
│ │ │ -
133
│ │ │ -
134#if DIM == 6
│ │ │ -
136 inline VectorT(const Scalar v0, const Scalar v1, const Scalar v2,
│ │ │ -
137 const Scalar v3, const Scalar v4, const Scalar v5) {
│ │ │ -
138 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;
│ │ │ -
139 Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5;
│ │ │ -
140 }
│ │ │ -
141#endif
│ │ │ -
142
│ │ │ -
│ │ │ -
144 explicit inline VectorT(const Scalar _values[DIM]) {
│ │ │ -
145 memcpy(data(), _values, DIM*sizeof(Scalar));
│ │ │ -
146 }
│ │ │ -
│ │ │ -
147
│ │ │ -
148
│ │ │ -
149#ifdef OM_CC_MIPS
│ │ │ -
151 // mipspro need this method
│ │ │ -
152 inline vector_type& operator=(const vector_type& _rhs) {
│ │ │ -
153 memcpy(Base::values_, _rhs.Base::values_, DIM*sizeof(Scalar));
│ │ │ -
154 return *this;
│ │ │ -
155 }
│ │ │ -
156#endif
│ │ │ -
157
│ │ │ -
158
│ │ │ -
160 template<typename otherScalarType>
│ │ │ -
│ │ │ -
161 explicit inline VectorT(const VectorT<otherScalarType,DIM>& _rhs) {
│ │ │ -
162 operator=(_rhs);
│ │ │ -
163 }
│ │ │ -
│ │ │ -
164
│ │ │ -
165
│ │ │ -
166
│ │ │ -
167
│ │ │ -
168 //--------------------------------------------------------------------- casts
│ │ │ -
169
│ │ │ -
171 template<typename otherScalarType>
│ │ │ -
│ │ │ - │ │ │ -
173#define expr(i) Base::values_[i] = (Scalar)_rhs[i];
│ │ │ -
174 unroll(expr);
│ │ │ -
175#undef expr
│ │ │ -
176 return *this;
│ │ │ -
177 }
│ │ │ -
│ │ │ +
126SIMPLE_BINARY(int8_t);
│ │ │ +
127SIMPLE_BINARY(int16_t);
│ │ │ +
128SIMPLE_BINARY(int32_t);
│ │ │ +
129//SIMPLE_BINARY(int64_t); // TODO: This does not work. Find out why.
│ │ │ +
130SIMPLE_BINARY(uint8_t);
│ │ │ +
131SIMPLE_BINARY(uint16_t);
│ │ │ +
132SIMPLE_BINARY(uint32_t);
│ │ │ +
133SIMPLE_BINARY(uint64_t);
│ │ │ +
134
│ │ │ +
135//handles
│ │ │ +
136SIMPLE_BINARY(FaceHandle);
│ │ │ +
137SIMPLE_BINARY(EdgeHandle);
│ │ │ +
138SIMPLE_BINARY(HalfedgeHandle);
│ │ │ +
139SIMPLE_BINARY(VertexHandle);
│ │ │ +
140SIMPLE_BINARY(MeshHandle);
│ │ │ +
141
│ │ │ +
142#undef SIMPLE_BINARY
│ │ │ +
143
│ │ │ +
144// For unsigned long which is of size 64 bit on 64 bit
│ │ │ +
145// architectures: convert into 32 bit unsigned integer value
│ │ │ +
146// in order to stay compatible between 32/64 bit architectures.
│ │ │ +
147// This allows cross reading BUT forbids storing unsigned longs
│ │ │ +
148// as data type since higher order word (4 bytes) will be truncated.
│ │ │ +
149// Does not work in case the data type that is to be stored
│ │ │ +
150// exceeds the value range of unsigned int in size, which is improbable...
│ │ │ +
151
│ │ │ +
152#define SIMPLE_BINARY( T ) \
│ │ │ +
153 template <> struct binary< T > { \
│ │ │ +
154 typedef T value_type; \
│ │ │ +
155 static const bool is_streamable = true; \
│ │ │ +
156 static size_t size_of(const value_type&) { return sizeof(value_type); } \
│ │ │ +
157 static size_t size_of(void) { return sizeof(value_type); } \
│ │ │ +
158 static std::string type_identifier(void) { return #T; } \
│ │ │ +
159 static size_t store( std::ostream& _os, const value_type& _val, \
│ │ │ +
160 bool _swap=false) { \
│ │ │ +
161 value_type tmp = _val; \
│ │ │ +
162 if (_swap) reverse_byte_order(tmp); \
│ │ │ +
163 /* Convert unsigned long to unsigned int for compatibility reasons */ \
│ │ │ +
164 unsigned int t1 = static_cast<unsigned int>(tmp); \
│ │ │ +
165 _os.write( (const char*)&t1, sizeof(unsigned int) ); \
│ │ │ +
166 return _os.good() ? sizeof(unsigned int) : 0; \
│ │ │ +
167 } \
│ │ │ +
168 \
│ │ │ +
169 static size_t restore( std::istream& _is, value_type& _val, \
│ │ │ +
170 bool _swap=false) { \
│ │ │ +
171 unsigned int t1; \
│ │ │ +
172 _is.read( (char*)&t1, sizeof(unsigned int) ); \
│ │ │ +
173 _val = t1; \
│ │ │ +
174 if (_swap) reverse_byte_order(_val); \
│ │ │ +
175 return _is.good() ? sizeof(unsigned int) : 0; \
│ │ │ +
176 } \
│ │ │ +
177 }
│ │ │
178
│ │ │ -
179// /// cast to Scalar array
│ │ │ -
180// inline operator Scalar*() { return Base::values_; }
│ │ │ -
181
│ │ │ -
182// /// cast to const Scalar array
│ │ │ -
183// inline operator const Scalar*() const { return Base::values_; }
│ │ │ -
184
│ │ │ -
186 inline Scalar* data() { return Base::values_; }
│ │ │ -
187
│ │ │ -
189 inline const Scalar*data() const { return Base::values_; }
│ │ │ -
190
│ │ │ -
191
│ │ │ -
192 //----------------------------------------------------------- element access
│ │ │ -
193
│ │ │ -
194// /// get i'th element read-write
│ │ │ -
195// inline Scalar& operator[](int _i) {
│ │ │ -
196// assert(_i>=0 && _i<DIM); return Base::values_[_i];
│ │ │ -
197// }
│ │ │ -
198
│ │ │ -
199// /// get i'th element read-only
│ │ │ -
200// inline const Scalar& operator[](int _i) const {
│ │ │ -
201// assert(_i>=0 && _i<DIM); return Base::values_[_i];
│ │ │ -
202// }
│ │ │ -
203
│ │ │ -
│ │ │ -
205 inline Scalar& operator[](size_t _i) {
│ │ │ -
206 assert(_i<DIM); return Base::values_[_i];
│ │ │ -
207 }
│ │ │ -
│ │ │ -
208
│ │ │ -
│ │ │ -
210 inline const Scalar& operator[](size_t _i) const {
│ │ │ -
211 assert(_i<DIM); return Base::values_[_i];
│ │ │ -
212 }
│ │ │ -
│ │ │ -
213
│ │ │ -
214
│ │ │ -
215
│ │ │ -
216
│ │ │ -
217 //---------------------------------------------------------------- comparsion
│ │ │ -
218
│ │ │ -
│ │ │ -
220 inline bool operator==(const vector_type& _rhs) const {
│ │ │ -
221#define expr(i) if(Base::values_[i]!=_rhs.Base::values_[i]) return false;
│ │ │ -
222 unroll(expr);
│ │ │ -
223#undef expr
│ │ │ -
224 return true;
│ │ │ -
225 }
│ │ │ -
│ │ │ -
226
│ │ │ -
│ │ │ -
228 inline bool operator!=(const vector_type& _rhs) const {
│ │ │ -
229 return !(*this == _rhs);
│ │ │ -
230 }
│ │ │ -
│ │ │ +
179SIMPLE_BINARY(unsigned long);
│ │ │ +
180
│ │ │ +
181#undef SIMPLE_BINARY
│ │ │ +
182
│ │ │ +
183#define VECTORT_BINARY( T ) \
│ │ │ +
184 template <> struct binary< T > { \
│ │ │ +
185 typedef T value_type; \
│ │ │ +
186 static const bool is_streamable = true; \
│ │ │ +
187 static size_t size_of(void) { return sizeof(value_type); } \
│ │ │ +
188 static size_t size_of(const value_type&) { return size_of(); } \
│ │ │ +
189 static std::string type_identifier(void) { return #T; } \
│ │ │ +
190 static size_t store( std::ostream& _os, const value_type& _val, \
│ │ │ +
191 bool _swap=false) { \
│ │ │ +
192 value_type tmp = _val; \
│ │ │ +
193 size_t b = size_of(_val), N = value_type::size_; \
│ │ │ +
194 if (_swap) \
│ │ │ +
195 for (size_t i=0; i<N; ++i) \
│ │ │ +
196 reverse_byte_order( tmp[i] ); \
│ │ │ +
197 _os.write( (const char*)&tmp[0], b ); \
│ │ │ +
198 return _os.good() ? b : 0; \
│ │ │ +
199 } \
│ │ │ +
200 \
│ │ │ +
201 static size_t restore( std::istream& _is, value_type& _val, \
│ │ │ +
202 bool _swap=false) { \
│ │ │ +
203 size_t N=value_type::size_; \
│ │ │ +
204 size_t b = N * sizeof(value_type::value_type); \
│ │ │ +
205 _is.read( (char*)&_val[0], b ); \
│ │ │ +
206 if (_swap) for (size_t i=0; i<N; ++i) \
│ │ │ +
207 reverse_byte_order( _val[i] ); \
│ │ │ +
208 return _is.good() ? b : 0; \
│ │ │ +
209 } \
│ │ │ +
210 }
│ │ │ +
211
│ │ │ +
212#define VECTORTS_BINARY( N ) \
│ │ │ +
213 VECTORT_BINARY( Vec##N##c ); \
│ │ │ +
214 VECTORT_BINARY( Vec##N##uc ); \
│ │ │ +
215 VECTORT_BINARY( Vec##N##s ); \
│ │ │ +
216 VECTORT_BINARY( Vec##N##us ); \
│ │ │ +
217 VECTORT_BINARY( Vec##N##i ); \
│ │ │ +
218 VECTORT_BINARY( Vec##N##ui ); \
│ │ │ +
219 VECTORT_BINARY( Vec##N##f ); \
│ │ │ +
220 VECTORT_BINARY( Vec##N##d );
│ │ │ +
221
│ │ │ +
222VECTORTS_BINARY( 1 )
│ │ │ +
223VECTORTS_BINARY( 2 )
│ │ │ +
224VECTORTS_BINARY( 3 )
│ │ │ +
225VECTORTS_BINARY( 4 )
│ │ │ +
226VECTORTS_BINARY( 5 )
│ │ │ +
227VECTORTS_BINARY( 6 )
│ │ │ +
228
│ │ │ +
229#undef VECTORTS_BINARY
│ │ │ +
230#undef VECTORT_BINARY
│ │ │
231
│ │ │ -
232
│ │ │ -
233
│ │ │ -
234
│ │ │ -
235 //---------------------------------------------------------- scalar operators
│ │ │ -
236
│ │ │ -
│ │ │ -
238 inline vector_type& operator*=(const Scalar& _s) {
│ │ │ -
239#define expr(i) Base::values_[i] *= _s;
│ │ │ -
240 unroll(expr);
│ │ │ -
241#undef expr
│ │ │ -
242 return *this;
│ │ │ -
243 }
│ │ │ -
│ │ │ -
244
│ │ │ -
│ │ │ -
247 inline vector_type& operator/=(const Scalar& _s) {
│ │ │ -
248#define expr(i) Base::values_[i] /= _s;
│ │ │ -
249 unroll(expr);
│ │ │ -
250#undef expr
│ │ │ -
251 return *this;
│ │ │ -
252 }
│ │ │ -
│ │ │ -
253
│ │ │ -
254
│ │ │ -
│ │ │ -
256 inline vector_type operator*(const Scalar& _s) const {
│ │ │ -
257#if DIM==N
│ │ │ -
258 return vector_type(*this) *= _s;
│ │ │ -
259#else
│ │ │ -
260#define expr(i) Base::values_[i] * _s
│ │ │ -
261 return vector_type(unroll_csv(expr));
│ │ │ -
262#undef expr
│ │ │ -
263#endif
│ │ │ -
264 }
│ │ │ -
│ │ │ -
265
│ │ │ -
266
│ │ │ -
│ │ │ -
268 inline vector_type operator/(const Scalar& _s) const {
│ │ │ -
269#if DIM==N
│ │ │ -
270 return vector_type(*this) /= _s;
│ │ │ -
271#else
│ │ │ -
272#define expr(i) Base::values_[i] / _s
│ │ │ -
273 return vector_type(unroll_csv(expr));
│ │ │ -
274#undef expr
│ │ │ -
275#endif
│ │ │ -
276 }
│ │ │ -
│ │ │ -
277
│ │ │ +
232template <> struct binary< std::string > {
│ │ │ +
233 typedef std::string value_type;
│ │ │ +
234 typedef uint16_t length_t;
│ │ │ +
235
│ │ │ +
236 static const bool is_streamable = true;
│ │ │ +
237
│ │ │ +
238 static size_t size_of() { return UnknownSize; }
│ │ │ +
239 static size_t size_of(const value_type &_v)
│ │ │ +
240 { return sizeof(length_t) + _v.size(); }
│ │ │ +
241 static std::string type_identifier(void) { return "std::string"; }
│ │ │ +
242 static
│ │ │ +
243 size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)
│ │ │ +
244 {
│ │ │ +
245#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000)
│ │ │ +
246 if (_v.size() < Utils::NumLimitsT<length_t>::max() )
│ │ │ +
247#else
│ │ │ +
248 if (_v.size() < std::numeric_limits<length_t>::max() )
│ │ │ +
249#endif
│ │ │ +
250 {
│ │ │ +
251 length_t len = length_t(_v.size());
│ │ │ +
252
│ │ │ +
253 size_t bytes = binary<length_t>::store( _os, len, _swap );
│ │ │ +
254 _os.write( _v.data(), len );
│ │ │ +
255 return _os.good() ? len+bytes : 0;
│ │ │ +
256 }
│ │ │ +
257 throw std::runtime_error("Cannot store string longer than 64Kb");
│ │ │ +
258 }
│ │ │ +
259
│ │ │ +
260 static
│ │ │ +
261 size_t restore(std::istream& _is, value_type& _val, bool _swap=false)
│ │ │ +
262 {
│ │ │ +
263 length_t len;
│ │ │ +
264 size_t bytes = binary<length_t>::restore( _is, len, _swap );
│ │ │ +
265 _val.resize(len);
│ │ │ +
266 _is.read( const_cast<char*>(_val.data()), len );
│ │ │ +
267
│ │ │ +
268 return _is.good() ? (len+bytes) : 0;
│ │ │ +
269 }
│ │ │ +
270};
│ │ │ +
271
│ │ │ +
272template <> struct binary<OpenMesh::Attributes::StatusInfo>
│ │ │ +
273{
│ │ │ +
274 typedef OpenMesh::Attributes::StatusInfo value_type;
│ │ │ +
275 typedef value_type::value_type status_t;
│ │ │ +
276
│ │ │ +
277 static const bool is_streamable = true;
│ │ │
278
│ │ │ -
279
│ │ │ -
280
│ │ │ +
279 static size_t size_of() { return sizeof(status_t); }
│ │ │ +
280 static size_t size_of(const value_type&) { return size_of(); }
│ │ │
281
│ │ │ -
282
│ │ │ -
283 //---------------------------------------------------------- vector operators
│ │ │ -
284
│ │ │ -
│ │ │ -
286 inline vector_type& operator*=(const vector_type& _rhs) {
│ │ │ -
287#define expr(i) Base::values_[i] *= _rhs[i];
│ │ │ -
288 unroll(expr);
│ │ │ -
289#undef expr
│ │ │ -
290 return *this;
│ │ │ +
282 static std::string type_identifier(void) { return "StatusInfo";}
│ │ │ +
283 static size_t n_bytes(size_t _n_elem)
│ │ │ +
284 { return _n_elem*sizeof(status_t); }
│ │ │ +
285
│ │ │ +
286 static
│ │ │ +
287 size_t store(std::ostream& _os, const value_type& _v, bool _swap=false)
│ │ │ +
288 {
│ │ │ +
289 status_t v=_v.bits();
│ │ │ +
290 return binary<status_t>::store(_os, v, _swap);
│ │ │
291 }
│ │ │ -
│ │ │
292
│ │ │ -
│ │ │ -
294 inline vector_type& operator/=(const vector_type& _rhs) {
│ │ │ -
295#define expr(i) Base::values_[i] /= _rhs[i];
│ │ │ -
296 unroll(expr);
│ │ │ -
297#undef expr
│ │ │ -
298 return *this;
│ │ │ -
299 }
│ │ │ -
│ │ │ -
300
│ │ │ -
│ │ │ -
302 inline vector_type& operator-=(const vector_type& _rhs) {
│ │ │ -
303#define expr(i) Base::values_[i] -= _rhs[i];
│ │ │ -
304 unroll(expr);
│ │ │ -
305#undef expr
│ │ │ -
306 return *this;
│ │ │ -
307 }
│ │ │ -
│ │ │ -
308
│ │ │ -
│ │ │ -
310 inline vector_type& operator+=(const vector_type& _rhs) {
│ │ │ -
311#define expr(i) Base::values_[i] += _rhs[i];
│ │ │ -
312 unroll(expr);
│ │ │ -
313#undef expr
│ │ │ -
314 return *this;
│ │ │ -
315 }
│ │ │ -
│ │ │ +
293 static
│ │ │ +
294 size_t restore( std::istream& _os, value_type& _v, bool _swap=false)
│ │ │ +
295 {
│ │ │ +
296 status_t v;
│ │ │ +
297 size_t b = binary<status_t>::restore(_os, v, _swap);
│ │ │ +
298 _v.set_bits(v);
│ │ │ +
299 return b;
│ │ │ +
300 }
│ │ │ +
301};
│ │ │ +
302
│ │ │ +
303
│ │ │ +
304//-----------------------------------------------------------------------------
│ │ │ +
305// std::vector<T> specializations for struct binary<>
│ │ │ +
306
│ │ │ +
307template <typename T>
│ │ │ +
308struct FunctorStore {
│ │ │ +
309 FunctorStore( std::ostream& _os, bool _swap) : os_(_os), swap_(_swap) { }
│ │ │ +
310 size_t operator () ( size_t _v1, const T& _s2 )
│ │ │ +
311 { return _v1+binary<T>::store(os_, _s2, swap_ ); }
│ │ │ +
312
│ │ │ +
313 std::ostream& os_;
│ │ │ +
314 bool swap_;
│ │ │ +
315};
│ │ │
316
│ │ │
317
│ │ │ -
│ │ │ -
319 inline vector_type operator*(const vector_type& _v) const {
│ │ │ -
320#if DIM==N
│ │ │ -
321 return vector_type(*this) *= _v;
│ │ │ -
322#else
│ │ │ -
323#define expr(i) Base::values_[i] * _v.Base::values_[i]
│ │ │ -
324 return vector_type(unroll_csv(expr));
│ │ │ -
325#undef expr
│ │ │ -
326#endif
│ │ │ -
327 }
│ │ │ -
│ │ │ -
328
│ │ │ -
329
│ │ │ -
│ │ │ -
331 inline vector_type operator/(const vector_type& _v) const {
│ │ │ -
332#if DIM==N
│ │ │ -
333 return vector_type(*this) /= _v;
│ │ │ -
334#else
│ │ │ -
335#define expr(i) Base::values_[i] / _v.Base::values_[i]
│ │ │ -
336 return vector_type(unroll_csv(expr));
│ │ │ -
337#undef expr
│ │ │ -
338#endif
│ │ │ -
339 }
│ │ │ -
│ │ │ -
340
│ │ │ -
341
│ │ │ -
│ │ │ -
343 inline vector_type operator+(const vector_type& _v) const {
│ │ │ -
344#if DIM==N
│ │ │ -
345 return vector_type(*this) += _v;
│ │ │ -
346#else
│ │ │ -
347#define expr(i) Base::values_[i] + _v.Base::values_[i]
│ │ │ -
348 return vector_type(unroll_csv(expr));
│ │ │ -
349#undef expr
│ │ │ -
350#endif
│ │ │ -
351 }
│ │ │ -
│ │ │ -
352
│ │ │ -
353
│ │ │ -
│ │ │ -
355 inline vector_type operator-(const vector_type& _v) const {
│ │ │ -
356#if DIM==N
│ │ │ -
357 return vector_type(*this) -= _v;
│ │ │ -
358#else
│ │ │ -
359#define expr(i) Base::values_[i] - _v.Base::values_[i]
│ │ │ -
360 return vector_type(unroll_csv(expr));
│ │ │ -
361#undef expr
│ │ │ -
362#endif
│ │ │ -
363 }
│ │ │ -
│ │ │ -
364
│ │ │ -
365
│ │ │ -
│ │ │ -
367 inline vector_type operator-(void) const {
│ │ │ -
368 vector_type v;
│ │ │ -
369#define expr(i) v.Base::values_[i] = -Base::values_[i];
│ │ │ -
370 unroll(expr);
│ │ │ -
371#undef expr
│ │ │ -
372 return v;
│ │ │ -
373 }
│ │ │ -
│ │ │ -
374
│ │ │ -
375
│ │ │ - │ │ │ -
379#if DIM==3
│ │ │ -
380 {
│ │ │ -
381 return
│ │ │ -
382 VectorT<Scalar,3>(Base::values_[1]*_rhs.Base::values_[2]-Base::values_[2]*_rhs.Base::values_[1],
│ │ │ -
383 Base::values_[2]*_rhs.Base::values_[0]-Base::values_[0]*_rhs.Base::values_[2],
│ │ │ -
384 Base::values_[0]*_rhs.Base::values_[1]-Base::values_[1]*_rhs.Base::values_[0]);
│ │ │ -
385 }
│ │ │ -
386#else
│ │ │ -
387 ;
│ │ │ -
388#endif
│ │ │ +
318template <typename T>
│ │ │ +
319struct FunctorRestore {
│ │ │ +
320 FunctorRestore( std::istream& _is, bool _swap) : is_(_is), swap_(_swap) { }
│ │ │ +
321 size_t operator () ( size_t _v1, T& _s2 )
│ │ │ +
322 { return _v1+binary<T>::restore(is_, _s2, swap_ ); }
│ │ │ +
323 std::istream& is_;
│ │ │ +
324 bool swap_;
│ │ │ +
325};
│ │ │ +
326
│ │ │ +
327template <typename T>
│ │ │ +
328struct binary< std::vector< T >, typename std::enable_if<std::is_default_constructible<T>::value>::type > {
│ │ │ +
329 typedef std::vector< T > value_type;
│ │ │ +
330 typedef typename value_type::value_type elem_type;
│ │ │ +
331
│ │ │ +
332 static const bool is_streamable = binary<T>::is_streamable;
│ │ │ +
333 static size_t size_of(bool /*_store_size*/ = true)
│ │ │ +
334 { return IO::UnknownSize; }
│ │ │ +
335
│ │ │ +
336 static size_t size_of(const value_type& _v, bool _store_size = true)
│ │ │ +
337 {
│ │ │ +
338 if(binary<T>::size_of() != IO::UnknownSize)
│ │ │ +
339 {
│ │ │ +
340 unsigned int N = static_cast<unsigned int>(_v.size());
│ │ │ +
341 auto res = binary<T>::size_of()*_v.size() + (_store_size? sizeof(decltype(N)) : 0);
│ │ │ +
342 return res;
│ │ │ +
343 }
│ │ │ +
344 else
│ │ │ +
345 {
│ │ │ +
346 size_t size = 0;
│ │ │ +
347 for(auto v : _v)
│ │ │ +
348 size += binary<T>::size_of(v);
│ │ │ +
349 if(_store_size)
│ │ │ + │ │ │ +
351
│ │ │ +
352 return size;
│ │ │ +
353 }
│ │ │ +
354 }
│ │ │ +
355
│ │ │ +
356 static std::string type_identifier(void) { return "std::vector<" + binary<T>::type_identifier() + ">"; }
│ │ │ +
357 static
│ │ │ +
358 size_t store(std::ostream& _os, const value_type& _v, bool _swap=false, bool _store_size = true) {
│ │ │ +
359 size_t bytes=0;
│ │ │ +
360 if(_store_size)
│ │ │ +
361 {
│ │ │ +
362 unsigned int N = static_cast<unsigned int>(_v.size());
│ │ │ +
363 bytes += binary<unsigned int>::store( _os, N, _swap );
│ │ │ +
364 }
│ │ │ +
365 if (_swap)
│ │ │ +
366 bytes += std::accumulate( _v.begin(), _v.end(), static_cast<size_t>(0),
│ │ │ +
367 FunctorStore<elem_type>(_os,_swap) );
│ │ │ +
368 else
│ │ │ +
369 {
│ │ │ +
370 auto elem_size = binary<elem_type>::size_of();
│ │ │ +
371 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type))
│ │ │ +
372 {
│ │ │ +
373 // size of all elements is known, equal, and densely packed in vector.
│ │ │ +
374 // Just store vector data
│ │ │ +
375 auto bytes_of_vec = size_of(_v, false);
│ │ │ +
376 bytes += bytes_of_vec;
│ │ │ +
377 if (_v.size() > 0)
│ │ │ +
378 _os.write( reinterpret_cast<const char*>(&_v[0]), bytes_of_vec);
│ │ │ +
379 }
│ │ │ +
380 else
│ │ │ +
381 {
│ │ │ +
382 // store individual elements
│ │ │ +
383 for (const auto& v : _v)
│ │ │ +
384 bytes += binary<elem_type>::store(_os, v, _swap);
│ │ │ +
385 }
│ │ │ +
386 }
│ │ │ +
387 return _os.good() ? bytes : 0;
│ │ │ +
388 }
│ │ │
389
│ │ │ -
390
│ │ │ -
│ │ │ -
393 inline Scalar operator|(const vector_type& _rhs) const {
│ │ │ -
394 Scalar p(0);
│ │ │ -
395#define expr(i) p += Base::values_[i] * _rhs.Base::values_[i];
│ │ │ -
396 unroll(expr);
│ │ │ -
397#undef expr
│ │ │ -
398 return p;
│ │ │ -
399 }
│ │ │ -
│ │ │ +
390 static size_t restore(std::istream& _is, value_type& _v, bool _swap=false, bool _restore_size = true) {
│ │ │ +
391
│ │ │ +
392 size_t bytes=0;
│ │ │ +
393
│ │ │ +
394 if(_restore_size)
│ │ │ +
395 {
│ │ │ +
396 unsigned int size_of_vec;
│ │ │ +
397 bytes += binary<unsigned int>::restore(_is, size_of_vec, _swap);
│ │ │ +
398 _v.resize(size_of_vec);
│ │ │ +
399 }
│ │ │
400
│ │ │ -
401
│ │ │ -
402
│ │ │ -
403
│ │ │ -
404
│ │ │ -
405 //------------------------------------------------------------ euclidean norm
│ │ │ -
406
│ │ │ -
408
│ │ │ -
409
│ │ │ -
410 inline Scalar norm() const { return (Scalar)sqrt(sqrnorm()); }
│ │ │ -
411 inline Scalar length() const { return norm(); } // OpenSG interface
│ │ │ -
412
│ │ │ -
│ │ │ -
414 inline Scalar sqrnorm() const
│ │ │ -
415 {
│ │ │ -
416#if DIM==N
│ │ │ -
417 Scalar s(0);
│ │ │ -
418#define expr(i) s += Base::values_[i] * Base::values_[i];
│ │ │ -
419 unroll(expr);
│ │ │ -
420#undef expr
│ │ │ -
421 return s;
│ │ │ -
422#else
│ │ │ -
423#define expr(i) Base::values_[i]*Base::values_[i]
│ │ │ -
424 return (unroll_comb(expr, +));
│ │ │ -
425#undef expr
│ │ │ -
426#endif
│ │ │ -
427 }
│ │ │ -
│ │ │ +
401 if ( _swap)
│ │ │ +
402 bytes += std::accumulate( _v.begin(), _v.end(), size_t(0),
│ │ │ +
403 FunctorRestore<elem_type>(_is, _swap) );
│ │ │ +
404 else
│ │ │ +
405 {
│ │ │ +
406 auto elem_size = binary<elem_type>::size_of();
│ │ │ +
407 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type))
│ │ │ +
408 {
│ │ │ +
409 // size of all elements is known, equal, and densely packed in vector.
│ │ │ +
410 // Just restore vector data
│ │ │ +
411 auto bytes_of_vec = size_of(_v, false);
│ │ │ +
412 bytes += bytes_of_vec;
│ │ │ +
413 if (_v.size() > 0)
│ │ │ +
414 _is.read( reinterpret_cast<char*>(&_v[0]), bytes_of_vec );
│ │ │ +
415 }
│ │ │ +
416 else
│ │ │ +
417 {
│ │ │ +
418 // restore individual elements
│ │ │ +
419 for (auto& v : _v)
│ │ │ +
420 bytes += binary<elem_type>::restore(_is, v, _swap);
│ │ │ +
421 }
│ │ │ +
422 }
│ │ │ +
423 return _is.good() ? bytes : 0;
│ │ │ +
424 }
│ │ │ +
425};
│ │ │ +
426
│ │ │ +
427#include <OpenMesh/Core/IO/SR_binary_vector_of_bool.hh>
│ │ │
428
│ │ │ -
│ │ │ - │ │ │ -
433 {
│ │ │ -
434 *this /= norm();
│ │ │ -
435 return *this;
│ │ │ -
436 }
│ │ │ -
│ │ │ -
437
│ │ │ -
│ │ │ -
441 inline const vector_type normalized() const
│ │ │ -
442 {
│ │ │ -
443 return *this / norm();
│ │ │ -
444 }
│ │ │ -
│ │ │ -
445
│ │ │ -
│ │ │ - │ │ │ -
449 {
│ │ │ -
450 Scalar n = norm();
│ │ │ -
451 if (n != (Scalar)0.0)
│ │ │ -
452 {
│ │ │ -
453 *this /= n;
│ │ │ -
454 }
│ │ │ -
455 return *this;
│ │ │ -
456 }
│ │ │ -
│ │ │ -
457
│ │ │ -
459
│ │ │ -
460 //------------------------------------------------------------ euclidean norm
│ │ │ -
461
│ │ │ -
463
│ │ │ -
464
│ │ │ -
│ │ │ -
466 inline Scalar l1_norm() const
│ │ │ -
467 {
│ │ │ -
468#if DIM==N
│ │ │ -
469 Scalar s(0);
│ │ │ -
470#define expr(i) s += std::abs(Base::values_[i]);
│ │ │ -
471 unroll(expr);
│ │ │ -
472#undef expr
│ │ │ -
473 return s;
│ │ │ -
474#else
│ │ │ -
475#define expr(i) std::abs(Base::values_[i])
│ │ │ -
476 return (unroll_comb(expr, +));
│ │ │ -
477#undef expr
│ │ │ -
478#endif
│ │ │ -
479 }
│ │ │ -
│ │ │ -
480
│ │ │ -
│ │ │ -
482 inline Scalar l8_norm() const
│ │ │ -
483 {
│ │ │ -
484 return max_abs();
│ │ │ -
485 }
│ │ │ -
│ │ │ -
486
│ │ │ -
488
│ │ │ -
489 //------------------------------------------------------------ max, min, mean
│ │ │ -
490
│ │ │ -
492
│ │ │ -
493
│ │ │ -
│ │ │ -
495 inline Scalar max() const
│ │ │ -
496 {
│ │ │ -
497 Scalar m(Base::values_[0]);
│ │ │ -
498 for(int i=1; i<DIM; ++i) if(Base::values_[i]>m) m=Base::values_[i];
│ │ │ -
499 return m;
│ │ │ -
500 }
│ │ │ -
│ │ │ -
501
│ │ │ -
│ │ │ -
503 inline Scalar max_abs() const
│ │ │ -
504 {
│ │ │ -
505 Scalar m(std::abs(Base::values_[0]));
│ │ │ -
506 for(int i=1; i<DIM; ++i)
│ │ │ -
507 if(std::abs(Base::values_[i])>m)
│ │ │ -
508 m=std::abs(Base::values_[i]);
│ │ │ -
509 return m;
│ │ │ -
510 }
│ │ │ -
│ │ │ -
511
│ │ │ -
512
│ │ │ -
│ │ │ -
514 inline Scalar min() const
│ │ │ -
515 {
│ │ │ -
516 Scalar m(Base::values_[0]);
│ │ │ -
517 for(int i=1; i<DIM; ++i) if(Base::values_[i]<m) m=Base::values_[i];
│ │ │ -
518 return m;
│ │ │ -
519 }
│ │ │ -
│ │ │ -
520
│ │ │ -
│ │ │ -
522 inline Scalar min_abs() const
│ │ │ -
523 {
│ │ │ -
524 Scalar m(std::abs(Base::values_[0]));
│ │ │ -
525 for(int i=1; i<DIM; ++i)
│ │ │ -
526 if(std::abs(Base::values_[i])<m)
│ │ │ -
527 m=std::abs(Base::values_[i]);
│ │ │ -
528 return m;
│ │ │ -
529 }
│ │ │ -
│ │ │ -
530
│ │ │ -
│ │ │ -
532 inline Scalar mean() const {
│ │ │ -
533 Scalar m(Base::values_[0]);
│ │ │ -
534 for(int i=1; i<DIM; ++i) m+=Base::values_[i];
│ │ │ -
535 return m/Scalar(DIM);
│ │ │ -
536 }
│ │ │ -
│ │ │ -
537
│ │ │ -
│ │ │ -
539 inline Scalar mean_abs() const {
│ │ │ -
540 Scalar m(std::abs(Base::values_[0]));
│ │ │ -
541 for(int i=1; i<DIM; ++i) m+=std::abs(Base::values_[i]);
│ │ │ -
542 return m/Scalar(DIM);
│ │ │ -
543 }
│ │ │ -
│ │ │ -
544
│ │ │ -
545
│ │ │ -
│ │ │ -
547 inline vector_type& minimize(const vector_type& _rhs) {
│ │ │ -
548#define expr(i) if (_rhs[i] < Base::values_[i]) Base::values_[i] = _rhs[i];
│ │ │ -
549 unroll(expr);
│ │ │ -
550#undef expr
│ │ │ -
551 return *this;
│ │ │ -
552 }
│ │ │ -
│ │ │ -
553
│ │ │ -
│ │ │ -
555 inline bool minimized(const vector_type& _rhs) {
│ │ │ -
556 bool result(false);
│ │ │ -
557#define expr(i) if (_rhs[i] < Base::values_[i]) { Base::values_[i] = _rhs[i]; result = true; }
│ │ │ -
558 unroll(expr);
│ │ │ -
559#undef expr
│ │ │ -
560 return result;
│ │ │ -
561 }
│ │ │ -
│ │ │ -
562
│ │ │ -
│ │ │ -
564 inline vector_type& maximize(const vector_type& _rhs) {
│ │ │ -
565#define expr(i) if (_rhs[i] > Base::values_[i]) Base::values_[i] = _rhs[i];
│ │ │ -
566 unroll(expr);
│ │ │ -
567#undef expr
│ │ │ -
568 return *this;
│ │ │ -
569 }
│ │ │ -
│ │ │ -
570
│ │ │ -
│ │ │ -
572 inline bool maximized(const vector_type& _rhs) {
│ │ │ -
573 bool result(false);
│ │ │ -
574#define expr(i) if (_rhs[i] > Base::values_[i]) { Base::values_[i] =_rhs[i]; result = true; }
│ │ │ -
575 unroll(expr);
│ │ │ -
576#undef expr
│ │ │ -
577 return result;
│ │ │ -
578 }
│ │ │ -
│ │ │ -
579
│ │ │ -
│ │ │ -
581 inline vector_type min(const vector_type& _rhs) const {
│ │ │ -
582 return vector_type(*this).minimize(_rhs);
│ │ │ -
583 }
│ │ │ -
│ │ │ -
584
│ │ │ -
│ │ │ -
586 inline vector_type max(const vector_type& _rhs) const {
│ │ │ -
587 return vector_type(*this).maximize(_rhs);
│ │ │ -
588 }
│ │ │ -
│ │ │ -
589
│ │ │ -
591
│ │ │ -
592 //------------------------------------------------------------ misc functions
│ │ │ -
593
│ │ │ -
595 template<typename Functor>
│ │ │ -
│ │ │ -
596 inline vector_type apply(const Functor& _func) const {
│ │ │ -
597 vector_type result;
│ │ │ -
598#define expr(i) result[i] = _func(Base::values_[i]);
│ │ │ -
599 unroll(expr);
│ │ │ -
600#undef expr
│ │ │ -
601 return result;
│ │ │ -
602 }
│ │ │ -
│ │ │ -
603
│ │ │ -
│ │ │ -
605 vector_type& vectorize(const Scalar& _s) {
│ │ │ -
606#define expr(i) Base::values_[i] = _s;
│ │ │ -
607 unroll(expr);
│ │ │ -
608#undef expr
│ │ │ -
609 return *this;
│ │ │ -
610 }
│ │ │ -
│ │ │ -
611
│ │ │ -
612
│ │ │ -
│ │ │ -
614 static vector_type vectorized(const Scalar& _s) {
│ │ │ -
615 return vector_type().vectorize(_s);
│ │ │ -
616 }
│ │ │ -
│ │ │ -
617
│ │ │ -
618
│ │ │ -
│ │ │ -
620 bool operator<(const vector_type& _rhs) const {
│ │ │ -
621#define expr(i) if (Base::values_[i] != _rhs.Base::values_[i]) \
│ │ │ -
622 return (Base::values_[i] < _rhs.Base::values_[i]);
│ │ │ -
623 unroll(expr);
│ │ │ -
624#undef expr
│ │ │ -
625 return false;
│ │ │ -
626 }
│ │ │ -
│ │ │ -
627};
│ │ │ -
│ │ │ -
628
│ │ │ -
629
│ │ │ -
630
│ │ │ -
632TEMPLATE_HEADER
│ │ │ -
633inline std::istream&
│ │ │ -
634operator>>(std::istream& is, VectorT<Scalar,DIM>& vec)
│ │ │ -
635{
│ │ │ -
636#define expr(i) is >> vec[i];
│ │ │ -
637 unroll(expr);
│ │ │ -
638#undef expr
│ │ │ -
639 return is;
│ │ │ -
640}
│ │ │ -
641
│ │ │ -
642
│ │ │ -
644TEMPLATE_HEADER
│ │ │ -
645inline std::ostream&
│ │ │ -
646operator<<(std::ostream& os, const VectorT<Scalar,DIM>& vec)
│ │ │ -
647{
│ │ │ -
648#if DIM==N
│ │ │ -
649 for(int i=0; i<N-1; ++i) os << vec[i] << " ";
│ │ │ -
650 os << vec[N-1];
│ │ │ -
651#else
│ │ │ -
652#define expr(i) vec[i]
│ │ │ -
653 os << unroll_comb(expr, << " " <<);
│ │ │ -
654#undef expr
│ │ │ -
655#endif
│ │ │ -
656
│ │ │ -
657 return os;
│ │ │ -
658}
│ │ │ -
659
│ │ │ -
660
│ │ │ -
661// ----------------------------------------------------------------------------
│ │ │ -
662#endif // included by VectorT.hh
│ │ │ -
663//=============================================================================
│ │ │ -
Definition VectorT_inc.hh:68
│ │ │ -
Scalar mean() const
return arithmetic mean
Definition VectorT_inc.hh:532
│ │ │ -
VectorT< Scalar, N > vector_type
type of this vector
Definition VectorT_inc.hh:79
│ │ │ -
bool maximized(const vector_type &_rhs)
maximize values and signalize coordinate maximization
Definition VectorT_inc.hh:572
│ │ │ -
Scalar min() const
return the minimal component
Definition VectorT_inc.hh:514
│ │ │ -
static int dim()
returns dimension of the vector (deprecated)
Definition VectorT_inc.hh:82
│ │ │ -
Scalar length() const
compute euclidean norm
Definition VectorT_inc.hh:411
│ │ │ -
vector_type operator-(const vector_type &_v) const
component-wise vector difference
Definition VectorT_inc.hh:355
│ │ │ -
vector_type min(const vector_type &_rhs) const
component-wise min
Definition VectorT_inc.hh:581
│ │ │ -
vector_type & operator/=(const vector_type &_rhs)
component-wise self-division
Definition VectorT_inc.hh:294
│ │ │ -
const Scalar * data() const
access to const Scalar array
Definition VectorT_inc.hh:189
│ │ │ -
static size_t size()
returns dimension of the vector
Definition VectorT_inc.hh:85
│ │ │ -
Scalar * data()
access to Scalar array
Definition VectorT_inc.hh:186
│ │ │ -
vector_type & operator-=(const vector_type &_rhs)
vector difference from this
Definition VectorT_inc.hh:302
│ │ │ -
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition VectorT_inc.hh:564
│ │ │ -
Scalar value_type
the type of the scalar used in this template
Definition VectorT_inc.hh:76
│ │ │ -
vector_type operator/(const vector_type &_v) const
component-wise vector division
Definition VectorT_inc.hh:331
│ │ │ -
const vector_type normalized() const
return normalized vector
Definition VectorT_inc.hh:441
│ │ │ -
vector_type operator+(const vector_type &_v) const
component-wise vector addition
Definition VectorT_inc.hh:343
│ │ │ -
Scalar mean_abs() const
return absolute arithmetic mean
Definition VectorT_inc.hh:539
│ │ │ -
bool minimized(const vector_type &_rhs)
minimize values and signalize coordinate minimization
Definition VectorT_inc.hh:555
│ │ │ -
VectorT(const Scalar &v)
special constructor for 1D vectors
Definition VectorT_inc.hh:96
│ │ │ -
Scalar max_abs() const
return the maximal absolute component
Definition VectorT_inc.hh:503
│ │ │ -
VectorT< Scalar, 3 > operator%(const VectorT< Scalar, 3 > &_rhs) const
cross product: only defined for Vec3* as specialization
│ │ │ -
vector_type max(const vector_type &_rhs) const
component-wise max
Definition VectorT_inc.hh:586
│ │ │ -
Scalar norm() const
compute euclidean norm
Definition VectorT_inc.hh:410
│ │ │ -
vector_type & operator/=(const Scalar &_s)
component-wise self-division by scalar
Definition VectorT_inc.hh:247
│ │ │ -
vector_type & operator+=(const vector_type &_rhs)
vector self-addition
Definition VectorT_inc.hh:310
│ │ │ -
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition VectorT_inc.hh:605
│ │ │ -
Scalar min_abs() const
return the minimal absolute component
Definition VectorT_inc.hh:522
│ │ │ -
Scalar sqrnorm() const
compute squared euclidean norm
Definition VectorT_inc.hh:414
│ │ │ -
vector_type operator/(const Scalar &_s) const
component-wise division by with scalar
Definition VectorT_inc.hh:268
│ │ │ -
VectorT(const Scalar _values[N])
construct from a value array (explicit)
Definition VectorT_inc.hh:144
│ │ │ -
Scalar l8_norm() const
compute l8_norm
Definition VectorT_inc.hh:482
│ │ │ -
bool operator==(const vector_type &_rhs) const
component-wise comparison
Definition VectorT_inc.hh:220
│ │ │ -
static vector_type vectorized(const Scalar &_s)
store the same value in each component
Definition VectorT_inc.hh:614
│ │ │ -
bool operator!=(const vector_type &_rhs) const
component-wise comparison
Definition VectorT_inc.hh:228
│ │ │ -
VectorT(const VectorT< otherScalarType, N > &_rhs)
copy & cast constructor (explicit)
Definition VectorT_inc.hh:161
│ │ │ -
const Scalar & operator[](size_t _i) const
get i'th element read-only
Definition VectorT_inc.hh:210
│ │ │ -
bool operator<(const vector_type &_rhs) const
lexicographical comparison
Definition VectorT_inc.hh:620
│ │ │ -
vector_type & normalize()
normalize vector, return normalized vector
Definition VectorT_inc.hh:432
│ │ │ -
vector_type operator-(void) const
unary minus
Definition VectorT_inc.hh:367
│ │ │ -
Scalar operator|(const vector_type &_rhs) const
compute scalar product
Definition VectorT_inc.hh:393
│ │ │ -
vector_type & operator=(const VectorT< otherScalarType, N > &_rhs)
cast from vector with a different scalar type
Definition VectorT_inc.hh:172
│ │ │ -
vector_type operator*(const Scalar &_s) const
component-wise multiplication with scalar
Definition VectorT_inc.hh:256
│ │ │ -
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition VectorT_inc.hh:547
│ │ │ -
vector_type & operator*=(const Scalar &_s)
component-wise self-multiplication with scalar
Definition VectorT_inc.hh:238
│ │ │ -
VectorT()
default constructor creates uninitialized values.
Definition VectorT_inc.hh:93
│ │ │ -
vector_type & normalize_cond()
normalize vector, return normalized vector and avoids div by zero
Definition VectorT_inc.hh:448
│ │ │ -
vector_type & operator*=(const vector_type &_rhs)
component-wise self-multiplication
Definition VectorT_inc.hh:286
│ │ │ -
Scalar l1_norm() const
compute L1 (Manhattan) norm
Definition VectorT_inc.hh:466
│ │ │ -
Scalar max() const
return the maximal component
Definition VectorT_inc.hh:495
│ │ │ -
Scalar & operator[](size_t _i)
get i'th element read-write
Definition VectorT_inc.hh:205
│ │ │ -
vector_type operator*(const vector_type &_v) const
component-wise vector multiplication
Definition VectorT_inc.hh:319
│ │ │ -
vector_type apply(const Functor &_func) const
component-wise apply function object with Scalar operator()(Scalar).
Definition VectorT_inc.hh:596
│ │ │ +
429// ----------------------------------------------------------------------------
│ │ │ +
430
│ │ │ +
431#endif // DOXY_IGNORE_THIS
│ │ │ +
432
│ │ │ +
433//=============================================================================
│ │ │ +
434} // namespace IO
│ │ │ +
435} // namespace OpenMesh
│ │ │ +
436//=============================================================================
│ │ │ +
437#endif // OPENMESH_SR_BINARY_SPEC_HH defined
│ │ │ +
438//=============================================================================
│ │ │ +
439
│ │ │ +
Temporary solution until std::numeric_limits is standard.
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
signed char int8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ +
short int16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ +
unsigned long long uint64_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:89
│ │ │ +
unsigned int uint32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ +
unsigned short uint16_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:81
│ │ │ +
int int32_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:85
│ │ │ +
unsigned char uint8_t
Binary read a short from _is and perform byte swapping if _swap is true.
Definition SR_types.hh:80
│ │ │ +
static size_t restore(std::istream &, value_type &, bool=false, bool=true)
Restore a value of T and return the number of bytes read.
Definition SR_binary.hh:125
│ │ │ +
static const bool is_streamable
Can we store T? Set this to true in your specialization.
Definition SR_binary.hh:101
│ │ │ +
static size_t store(std::ostream &, const value_type &, bool=false, bool=true)
Store a value of T and return the number of bytes written.
Definition SR_binary.hh:113
│ │ │ +
static std::string type_identifier(void)
A string that identifies the type of T.
Definition SR_binary.hh:109
│ │ │ +
static size_t size_of(void)
What's the size of T? If it depends on the actual value (e.g. for vectors) return UnknownSize.
Definition SR_binary.hh:104
│ │ │ +
Add status information to a base class.
Definition Status.hh:95
│ │ │ +
static Scalar max()
Return the maximum absolte value a scalar type can store.
Definition NumLimitsT.hh:97
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -VectorT_inc.hh │ │ │ │ +SR_binary_spec.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -48,795 +48,483 @@ │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ -45 │ │ │ │ -46// Set template keywords and class names properly when │ │ │ │ -47// parsing with doxygen. This only seems to work this way since │ │ │ │ -48// the scope of preprocessor defines is limited to one file in doxy. │ │ │ │ -49#ifdef DOXYGEN │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Helper Functions for binary reading / writing │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ 50 │ │ │ │ -51// Only used for correct doxygen parsing │ │ │ │ -52#define OPENMESH_VECTOR_HH │ │ │ │ +51#ifndef OPENMESH_SR_BINARY_SPEC_HH │ │ │ │ +52#define OPENMESH_SR_BINARY_SPEC_HH │ │ │ │ 53 │ │ │ │ -54#define DIM N │ │ │ │ -55#define TEMPLATE_HEADER template │ │ │ │ -56#define CLASSNAME VectorT │ │ │ │ -57#define DERIVED VectorDataT │ │ │ │ -58#define unroll(expr) for (int i=0; i │ │ │ │ +57// -------------------- STL │ │ │ │ +58#include │ │ │ │ +59#include │ │ │ │ +60#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) │ │ │ │ +61# include <_O_p_e_n_M_e_s_h_/_T_o_o_l_s_/_U_t_i_l_s_/_N_u_m_L_i_m_i_t_s_T_._h_h> │ │ │ │ +62#else │ │ │ │ +63# include │ │ │ │ +64#endif │ │ │ │ +65#include │ │ │ │ +66#include // logic_error │ │ │ │ +67#include // accumulate │ │ │ │ +68// -------------------- OpenMesh │ │ │ │ +69#include │ │ │ │ +70#include │ │ │ │ +71#include │ │ │ │ +72#include │ │ │ │ +73#include │ │ │ │ 74 │ │ │ │ -_7_6 typedef Scalar _v_a_l_u_e___t_y_p_e; │ │ │ │ +75 │ │ │ │ +76#include │ │ │ │ 77 │ │ │ │ -_7_9 typedef _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_D_I_M_> _v_e_c_t_o_r___t_y_p_e; │ │ │ │ -80 │ │ │ │ -_8_2 static inline int _d_i_m() { return DIM; } │ │ │ │ -83 │ │ │ │ -_8_5 static inline size_t _s_i_z_e() { return DIM; } │ │ │ │ -86 │ │ │ │ -87 static const size_t size_ = DIM; │ │ │ │ -88 │ │ │ │ +78#include │ │ │ │ +79 │ │ │ │ +80//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +81 │ │ │ │ +82namespace _O_p_e_n_M_e_s_h { │ │ │ │ +83namespace IO { │ │ │ │ +84 │ │ │ │ +85 │ │ │ │ +86// │ │ │ │ +============================================================================= │ │ │ │ +87 │ │ │ │ +88#ifndef DOXY_IGNORE_THIS │ │ │ │ 89 │ │ │ │ -90 //------------------------------------------------------------- │ │ │ │ -- constructors │ │ │ │ -91 │ │ │ │ -_9_3 inline _V_e_c_t_o_r_T() {} │ │ │ │ -94 │ │ │ │ -_9_6 explicit inline _V_e_c_t_o_r_T(const Scalar& v) { │ │ │ │ -97// assert(DIM==1); │ │ │ │ -98// values_[0] = v0; │ │ │ │ -99 vectorize(v); │ │ │ │ -100 } │ │ │ │ -101 │ │ │ │ -102#if DIM == 2 │ │ │ │ -104 inline _V_e_c_t_o_r_T(const Scalar v0, const Scalar v1) { │ │ │ │ -105 Base::values_[0] = v0; Base::values_[1] = v1; │ │ │ │ -106 } │ │ │ │ -107#endif │ │ │ │ -108 │ │ │ │ -109#if DIM == 3 │ │ │ │ -111 inline _V_e_c_t_o_r_T(const Scalar v0, const Scalar v1, const Scalar v2) { │ │ │ │ -112 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; │ │ │ │ -113 } │ │ │ │ -114#endif │ │ │ │ +90//--------------------------------------------------------------------------- │ │ │ │ +-- │ │ │ │ +91// struct binary, helper for storing/restoring │ │ │ │ +92 │ │ │ │ +93#define SIMPLE_BINARY( T ) \ │ │ │ │ +94 template <> struct binary< T > { \ │ │ │ │ +95 typedef T value_type; \ │ │ │ │ +96 static const bool is_streamable = true; \ │ │ │ │ +97 static size_t size_of(const value_type&) { return sizeof(value_type); } \ │ │ │ │ +98 static size_t size_of(void) { return sizeof(value_type); } \ │ │ │ │ +99 static std::string type_identifier(void) { return #T; } \ │ │ │ │ +100 static size_t store( std::ostream& _os, const value_type& _val, \ │ │ │ │ +101 bool _swap=false) { \ │ │ │ │ +102 value_type tmp = _val; \ │ │ │ │ +103 if (_swap) reverse_byte_order(tmp); \ │ │ │ │ +104 _os.write( (const char*)&tmp, sizeof(value_type) ); \ │ │ │ │ +105 return _os.good() ? sizeof(value_type) : 0; \ │ │ │ │ +106 } \ │ │ │ │ +107 \ │ │ │ │ +108 static size_t restore( std::istream& _is, value_type& _val, \ │ │ │ │ +109 bool _swap=false) { \ │ │ │ │ +110 _is.read( (char*)&_val, sizeof(value_type) ); \ │ │ │ │ +111 if (_swap) reverse_byte_order(_val); \ │ │ │ │ +112 return _is.good() ? sizeof(value_type) : 0; \ │ │ │ │ +113 } \ │ │ │ │ +114 } │ │ │ │ 115 │ │ │ │ -116#if DIM == 4 │ │ │ │ -118 inline _V_e_c_t_o_r_T(const Scalar v0, const Scalar v1, │ │ │ │ -119 const Scalar v2, const Scalar v3) { │ │ │ │ -120 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base:: │ │ │ │ -values_[3]=v3; │ │ │ │ -121 } │ │ │ │ -122 │ │ │ │ -123 _V_e_c_t_o_r_T homogenized() const { return _V_e_c_t_o_r_T(Base::values_[0]/Base::values_ │ │ │ │ -[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); │ │ │ │ -} │ │ │ │ -124#endif │ │ │ │ +116SIMPLE_BINARY(bool); │ │ │ │ +117//SIMPLE_BINARY(int); │ │ │ │ +118 │ │ │ │ +119// Why is this needed? Should not be used as not 32 bit compatible │ │ │ │ +120//SIMPLE_BINARY(unsigned long); │ │ │ │ +121SIMPLE_BINARY(float); │ │ │ │ +122SIMPLE_BINARY(double); │ │ │ │ +123SIMPLE_BINARY(long double); │ │ │ │ +124SIMPLE_BINARY(char); │ │ │ │ 125 │ │ │ │ -126#if DIM == 5 │ │ │ │ -128 inline _V_e_c_t_o_r_T(const Scalar v0, const Scalar v1, const Scalar v2, │ │ │ │ -129 const Scalar v3, const Scalar v4) { │ │ │ │ -130 Base::values_[0]=v0; Base::values_[1]=v1;Base::values_[2]=v2; Base::values_ │ │ │ │ -[3]=v3; Base::values_[4]=v4; │ │ │ │ -131 } │ │ │ │ -132#endif │ │ │ │ -133 │ │ │ │ -134#if DIM == 6 │ │ │ │ -136 inline _V_e_c_t_o_r_T(const Scalar v0, const Scalar v1, const Scalar v2, │ │ │ │ -137 const Scalar v3, const Scalar v4, const Scalar v5) { │ │ │ │ -138 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; │ │ │ │ -139 Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5; │ │ │ │ -140 } │ │ │ │ -141#endif │ │ │ │ -142 │ │ │ │ -_1_4_4 explicit inline _V_e_c_t_o_r_T(const Scalar _values[DIM]) { │ │ │ │ -145 memcpy(data(), _values, DIM*sizeof(Scalar)); │ │ │ │ -146 } │ │ │ │ -147 │ │ │ │ -148 │ │ │ │ -149#ifdef OM_CC_MIPS │ │ │ │ -151 // mipspro need this method │ │ │ │ -152 inline vector_type& operator=(const vector_type& _rhs) { │ │ │ │ -153 memcpy(Base::values_, _rhs.Base::values_, DIM*sizeof(Scalar)); │ │ │ │ -154 return *this; │ │ │ │ -155 } │ │ │ │ -156#endif │ │ │ │ -157 │ │ │ │ -158 │ │ │ │ -160 template │ │ │ │ -_1_6_1 explicit inline _V_e_c_t_o_r_T(const _V_e_c_t_o_r_T_<_o_t_h_e_r_S_c_a_l_a_r_T_y_p_e_,_D_I_M_>& _rhs) { │ │ │ │ -162 operator=(_rhs); │ │ │ │ -163 } │ │ │ │ -164 │ │ │ │ -165 │ │ │ │ -166 │ │ │ │ -167 │ │ │ │ -168 //-------------------------------------------------------------------- │ │ │ │ -- casts │ │ │ │ -169 │ │ │ │ -171 template │ │ │ │ -_1_7_2 inline _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_=(const _V_e_c_t_o_r_T_<_o_t_h_e_r_S_c_a_l_a_r_T_y_p_e_,_D_I_M_>& _rhs) { │ │ │ │ -173#define expr(i) Base::values_[i] = (Scalar)_rhs[i]; │ │ │ │ -174 unroll(expr); │ │ │ │ -175#undef expr │ │ │ │ -176 return *this; │ │ │ │ +126SIMPLE_BINARY(_i_n_t_8___t); │ │ │ │ +127SIMPLE_BINARY(_i_n_t_1_6___t); │ │ │ │ +128SIMPLE_BINARY(_i_n_t_3_2___t); │ │ │ │ +129//SIMPLE_BINARY(int64_t); // TODO: This does not work. Find out why. │ │ │ │ +130SIMPLE_BINARY(_u_i_n_t_8___t); │ │ │ │ +131SIMPLE_BINARY(_u_i_n_t_1_6___t); │ │ │ │ +132SIMPLE_BINARY(_u_i_n_t_3_2___t); │ │ │ │ +133SIMPLE_BINARY(_u_i_n_t_6_4___t); │ │ │ │ +134 │ │ │ │ +135//handles │ │ │ │ +136SIMPLE_BINARY(FaceHandle); │ │ │ │ +137SIMPLE_BINARY(EdgeHandle); │ │ │ │ +138SIMPLE_BINARY(HalfedgeHandle); │ │ │ │ +139SIMPLE_BINARY(VertexHandle); │ │ │ │ +140SIMPLE_BINARY(MeshHandle); │ │ │ │ +141 │ │ │ │ +142#undef SIMPLE_BINARY │ │ │ │ +143 │ │ │ │ +144// For unsigned long which is of size 64 bit on 64 bit │ │ │ │ +145// architectures: convert into 32 bit unsigned integer value │ │ │ │ +146// in order to stay compatible between 32/64 bit architectures. │ │ │ │ +147// This allows cross reading BUT forbids storing unsigned longs │ │ │ │ +148// as data type since higher order word (4 bytes) will be truncated. │ │ │ │ +149// Does not work in case the data type that is to be stored │ │ │ │ +150// exceeds the value range of unsigned int in size, which is improbable... │ │ │ │ +151 │ │ │ │ +152#define SIMPLE_BINARY( T ) \ │ │ │ │ +153 template <> struct binary< T > { \ │ │ │ │ +154 typedef T value_type; \ │ │ │ │ +155 static const bool is_streamable = true; \ │ │ │ │ +156 static size_t size_of(const value_type&) { return sizeof(value_type); } \ │ │ │ │ +157 static size_t size_of(void) { return sizeof(value_type); } \ │ │ │ │ +158 static std::string type_identifier(void) { return #T; } \ │ │ │ │ +159 static size_t store( std::ostream& _os, const value_type& _val, \ │ │ │ │ +160 bool _swap=false) { \ │ │ │ │ +161 value_type tmp = _val; \ │ │ │ │ +162 if (_swap) reverse_byte_order(tmp); \ │ │ │ │ +163 /* Convert unsigned long to unsigned int for compatibility reasons */ \ │ │ │ │ +164 unsigned int t1 = static_cast(tmp); \ │ │ │ │ +165 _os.write( (const char*)&t1, sizeof(unsigned int) ); \ │ │ │ │ +166 return _os.good() ? sizeof(unsigned int) : 0; \ │ │ │ │ +167 } \ │ │ │ │ +168 \ │ │ │ │ +169 static size_t restore( std::istream& _is, value_type& _val, \ │ │ │ │ +170 bool _swap=false) { \ │ │ │ │ +171 unsigned int t1; \ │ │ │ │ +172 _is.read( (char*)&t1, sizeof(unsigned int) ); \ │ │ │ │ +173 _val = t1; \ │ │ │ │ +174 if (_swap) reverse_byte_order(_val); \ │ │ │ │ +175 return _is.good() ? sizeof(unsigned int) : 0; \ │ │ │ │ +176 } \ │ │ │ │ 177 } │ │ │ │ 178 │ │ │ │ -179// /// cast to Scalar array │ │ │ │ -180// inline operator Scalar*() { return Base::values_; } │ │ │ │ -181 │ │ │ │ -182// /// cast to const Scalar array │ │ │ │ -183// inline operator const Scalar*() const { return Base::values_; } │ │ │ │ -184 │ │ │ │ -_1_8_6 inline Scalar* _d_a_t_a() { return Base::values_; } │ │ │ │ -187 │ │ │ │ -_1_8_9 inline const Scalar*_d_a_t_a() const { return Base::values_; } │ │ │ │ -190 │ │ │ │ -191 │ │ │ │ -192 //----------------------------------------------------------- element │ │ │ │ -access │ │ │ │ -193 │ │ │ │ -194// /// get i'th element read-write │ │ │ │ -195// inline Scalar& operator[](int _i) { │ │ │ │ -196// assert(_i>=0 && _i=0 && _i struct binary< T > { \ │ │ │ │ +185 typedef T value_type; \ │ │ │ │ +186 static const bool is_streamable = true; \ │ │ │ │ +187 static size_t size_of(void) { return sizeof(value_type); } \ │ │ │ │ +188 static size_t size_of(const value_type&) { return size_of(); } \ │ │ │ │ +189 static std::string type_identifier(void) { return #T; } \ │ │ │ │ +190 static size_t store( std::ostream& _os, const value_type& _val, \ │ │ │ │ +191 bool _swap=false) { \ │ │ │ │ +192 value_type tmp = _val; \ │ │ │ │ +193 size_t b = size_of(_val), N = value_type::size_; \ │ │ │ │ +194 if (_swap) \ │ │ │ │ +195 for (size_t i=0; i struct binary< std::string > { │ │ │ │ +233 typedef std::string value_type; │ │ │ │ +234 typedef _u_i_n_t_1_6___t length_t; │ │ │ │ +235 │ │ │ │ +236 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = true; │ │ │ │ +237 │ │ │ │ +238 static size_t _s_i_z_e___o_f() { return UnknownSize; } │ │ │ │ +239 static size_t _s_i_z_e___o_f(const value_type &_v) │ │ │ │ +240 { return sizeof(length_t) + _v.size(); } │ │ │ │ +241 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r(void) { return "std::string"; } │ │ │ │ +242 static │ │ │ │ +243 size_t _s_t_o_r_e(std::ostream& _os, const value_type& _v, bool _swap=false) │ │ │ │ +244 { │ │ │ │ +245#if defined(OM_CC_GCC) && (OM_CC_VERSION < 30000) │ │ │ │ +246 if (_v.size() < _U_t_i_l_s_:_:_N_u_m_L_i_m_i_t_s_T_<_l_e_n_g_t_h___t_>_:_:_m_a_x() ) │ │ │ │ +247#else │ │ │ │ +248 if (_v.size() < std::numeric_limits::max() ) │ │ │ │ +249#endif │ │ │ │ +250 { │ │ │ │ +251 length_t len = length_t(_v.size()); │ │ │ │ +252 │ │ │ │ +253 size_t bytes = _b_i_n_a_r_y_<_l_e_n_g_t_h___t_>_:_:_s_t_o_r_e( _os, len, _swap ); │ │ │ │ +254 _os.write( _v.data(), len ); │ │ │ │ +255 return _os.good() ? len+bytes : 0; │ │ │ │ +256 } │ │ │ │ +257 throw std::runtime_error("Cannot store string longer than 64Kb"); │ │ │ │ +258 } │ │ │ │ +259 │ │ │ │ +260 static │ │ │ │ +261 size_t _r_e_s_t_o_r_e(std::istream& _is, value_type& _val, bool _swap=false) │ │ │ │ +262 { │ │ │ │ +263 length_t len; │ │ │ │ +264 size_t bytes = _b_i_n_a_r_y_<_l_e_n_g_t_h___t_>_:_:_r_e_s_t_o_r_e( _is, len, _swap ); │ │ │ │ +265 _val.resize(len); │ │ │ │ +266 _is.read( const_cast(_val.data()), len ); │ │ │ │ +267 │ │ │ │ +268 return _is.good() ? (len+bytes) : 0; │ │ │ │ +269 } │ │ │ │ +270}; │ │ │ │ +271 │ │ │ │ +272template <> struct binary<_O_p_e_n_M_e_s_h::Attributes::StatusInfo> │ │ │ │ +273{ │ │ │ │ +274 typedef _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o value_type; │ │ │ │ +275 typedef value_type::value_type status_t; │ │ │ │ +276 │ │ │ │ +277 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = true; │ │ │ │ 278 │ │ │ │ -279 │ │ │ │ -280 │ │ │ │ +279 static size_t _s_i_z_e___o_f() { return sizeof(status_t); } │ │ │ │ +280 static size_t _s_i_z_e___o_f(const value_type&) { return _s_i_z_e___o_f(); } │ │ │ │ 281 │ │ │ │ -282 │ │ │ │ -283 //---------------------------------------------------------- vector │ │ │ │ -operators │ │ │ │ -284 │ │ │ │ -_2_8_6 inline _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_*_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -287#define expr(i) Base::values_[i] *= _rhs[i]; │ │ │ │ -288 unroll(expr); │ │ │ │ -289#undef expr │ │ │ │ -290 return *this; │ │ │ │ +282 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r(void) { return "StatusInfo";} │ │ │ │ +283 static size_t n_bytes(size_t _n_elem) │ │ │ │ +284 { return _n_elem*sizeof(status_t); } │ │ │ │ +285 │ │ │ │ +286 static │ │ │ │ +287 size_t _s_t_o_r_e(std::ostream& _os, const value_type& _v, bool _swap=false) │ │ │ │ +288 { │ │ │ │ +289 status_t v=_v.bits(); │ │ │ │ +290 return _b_i_n_a_r_y_<_s_t_a_t_u_s___t_>_:_:_s_t_o_r_e(_os, v, _swap); │ │ │ │ 291 } │ │ │ │ 292 │ │ │ │ -_2_9_4 inline _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_/_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -295#define expr(i) Base::values_[i] /= _rhs[i]; │ │ │ │ -296 unroll(expr); │ │ │ │ -297#undef expr │ │ │ │ -298 return *this; │ │ │ │ -299 } │ │ │ │ -300 │ │ │ │ -_3_0_2 inline _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_-_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -303#define expr(i) Base::values_[i] -= _rhs[i]; │ │ │ │ -304 unroll(expr); │ │ │ │ -305#undef expr │ │ │ │ -306 return *this; │ │ │ │ -307 } │ │ │ │ -308 │ │ │ │ -_3_1_0 inline _v_e_c_t_o_r___t_y_p_e& _o_p_e_r_a_t_o_r_+_=(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -311#define expr(i) Base::values_[i] += _rhs[i]; │ │ │ │ -312 unroll(expr); │ │ │ │ -313#undef expr │ │ │ │ -314 return *this; │ │ │ │ -315 } │ │ │ │ +293 static │ │ │ │ +294 size_t _r_e_s_t_o_r_e( std::istream& _os, value_type& _v, bool _swap=false) │ │ │ │ +295 { │ │ │ │ +296 status_t v; │ │ │ │ +297 size_t b = _b_i_n_a_r_y_<_s_t_a_t_u_s___t_>_:_:_r_e_s_t_o_r_e(_os, v, _swap); │ │ │ │ +298 _v.set_bits(v); │ │ │ │ +299 return b; │ │ │ │ +300 } │ │ │ │ +301}; │ │ │ │ +302 │ │ │ │ +303 │ │ │ │ +304//-------------------------------------------------------------------------- │ │ │ │ +--- │ │ │ │ +305// std::vector specializations for struct binary<> │ │ │ │ +306 │ │ │ │ +307template │ │ │ │ +308struct FunctorStore { │ │ │ │ +309 FunctorStore( std::ostream& _os, bool _swap) : os_(_os), swap_(_swap) { } │ │ │ │ +310 size_t operator () ( size_t _v1, const T& _s2 ) │ │ │ │ +311 { return _v1+binary::store(os_, _s2, swap_ ); } │ │ │ │ +312 │ │ │ │ +313 std::ostream& os_; │ │ │ │ +314 bool swap_; │ │ │ │ +315}; │ │ │ │ 316 │ │ │ │ 317 │ │ │ │ -_3_1_9 inline _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_*(const _v_e_c_t_o_r___t_y_p_e& _v) const { │ │ │ │ -320#if DIM==N │ │ │ │ -321 return _v_e_c_t_o_r___t_y_p_e(*this) *= _v; │ │ │ │ -322#else │ │ │ │ -323#define expr(i) Base::values_[i] * _v.Base::values_[i] │ │ │ │ -324 return _v_e_c_t_o_r___t_y_p_e(unroll_csv(expr)); │ │ │ │ -325#undef expr │ │ │ │ -326#endif │ │ │ │ -327 } │ │ │ │ -328 │ │ │ │ -329 │ │ │ │ -_3_3_1 inline _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_/(const _v_e_c_t_o_r___t_y_p_e& _v) const { │ │ │ │ -332#if DIM==N │ │ │ │ -333 return _v_e_c_t_o_r___t_y_p_e(*this) /= _v; │ │ │ │ -334#else │ │ │ │ -335#define expr(i) Base::values_[i] / _v.Base::values_[i] │ │ │ │ -336 return _v_e_c_t_o_r___t_y_p_e(unroll_csv(expr)); │ │ │ │ -337#undef expr │ │ │ │ -338#endif │ │ │ │ -339 } │ │ │ │ -340 │ │ │ │ -341 │ │ │ │ -_3_4_3 inline _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_+(const _v_e_c_t_o_r___t_y_p_e& _v) const { │ │ │ │ -344#if DIM==N │ │ │ │ -345 return _v_e_c_t_o_r___t_y_p_e(*this) += _v; │ │ │ │ -346#else │ │ │ │ -347#define expr(i) Base::values_[i] + _v.Base::values_[i] │ │ │ │ -348 return _v_e_c_t_o_r___t_y_p_e(unroll_csv(expr)); │ │ │ │ -349#undef expr │ │ │ │ -350#endif │ │ │ │ -351 } │ │ │ │ -352 │ │ │ │ -353 │ │ │ │ -_3_5_5 inline _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_-(const _v_e_c_t_o_r___t_y_p_e& _v) const { │ │ │ │ -356#if DIM==N │ │ │ │ -357 return _v_e_c_t_o_r___t_y_p_e(*this) -= _v; │ │ │ │ -358#else │ │ │ │ -359#define expr(i) Base::values_[i] - _v.Base::values_[i] │ │ │ │ -360 return _v_e_c_t_o_r___t_y_p_e(unroll_csv(expr)); │ │ │ │ -361#undef expr │ │ │ │ -362#endif │ │ │ │ -363 } │ │ │ │ -364 │ │ │ │ -365 │ │ │ │ -_3_6_7 inline _v_e_c_t_o_r___t_y_p_e _o_p_e_r_a_t_o_r_-(void) const { │ │ │ │ -368 _v_e_c_t_o_r___t_y_p_e v; │ │ │ │ -369#define expr(i) v.Base::values_[i] = -Base::values_[i]; │ │ │ │ -370 unroll(expr); │ │ │ │ -371#undef expr │ │ │ │ -372 return v; │ │ │ │ -373 } │ │ │ │ -374 │ │ │ │ -375 │ │ │ │ -_3_7_8 inline _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_3_> _o_p_e_r_a_t_o_r_%(const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_3_>& _rhs) const │ │ │ │ -379#if DIM==3 │ │ │ │ -380 { │ │ │ │ -381 return │ │ │ │ -382 _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_3_>(Base::values_[1]*_rhs.Base::values_[2]-Base::values_ │ │ │ │ -[2]*_rhs.Base::values_[1], │ │ │ │ -383 Base::values_[2]*_rhs.Base::values_[0]-Base::values_[0]*_rhs.Base::values_ │ │ │ │ -[2], │ │ │ │ -384 Base::values_[0]*_rhs.Base::values_[1]-Base::values_[1]*_rhs.Base::values_ │ │ │ │ -[0]); │ │ │ │ +318template │ │ │ │ +319struct FunctorRestore { │ │ │ │ +320 FunctorRestore( std::istream& _is, bool _swap) : is_(_is), swap_(_swap) { } │ │ │ │ +321 size_t operator () ( size_t _v1, T& _s2 ) │ │ │ │ +322 { return _v1+binary::restore(is_, _s2, swap_ ); } │ │ │ │ +323 std::istream& is_; │ │ │ │ +324 bool swap_; │ │ │ │ +325}; │ │ │ │ +326 │ │ │ │ +327template │ │ │ │ +328struct binary< std::vector< T >, typename std::enable_if::value>::type > { │ │ │ │ +329 typedef std::vector< T > value_type; │ │ │ │ +330 typedef typename value_type::value_type elem_type; │ │ │ │ +331 │ │ │ │ +332 static const bool _i_s___s_t_r_e_a_m_a_b_l_e = _b_i_n_a_r_y_<_T_>_:_:_i_s___s_t_r_e_a_m_a_b_l_e; │ │ │ │ +333 static size_t _s_i_z_e___o_f(bool /*_store_size*/ = true) │ │ │ │ +334 { return IO::UnknownSize; } │ │ │ │ +335 │ │ │ │ +336 static size_t _s_i_z_e___o_f(const value_type& _v, bool _store_size = true) │ │ │ │ +337 { │ │ │ │ +338 if(_b_i_n_a_r_y_<_T_>_:_:_s_i_z_e___o_f() != IO::UnknownSize) │ │ │ │ +339 { │ │ │ │ +340 unsigned int N = static_cast(_v.size()); │ │ │ │ +341 auto res = _b_i_n_a_r_y_<_T_>_:_:_s_i_z_e___o_f()*_v.size() + (_store_size? sizeof(decltype │ │ │ │ +(N)) : 0); │ │ │ │ +342 return res; │ │ │ │ +343 } │ │ │ │ +344 else │ │ │ │ +345 { │ │ │ │ +346 size_t size = 0; │ │ │ │ +347 for(auto v : _v) │ │ │ │ +348 size += binary::_s_i_z_e___o_f(v); │ │ │ │ +349 if(_store_size) │ │ │ │ +350 size += _b_i_n_a_r_y_<_u_n_s_i_g_n_e_d_ _i_n_t_>_:_:_s_i_z_e___o_f(); │ │ │ │ +351 │ │ │ │ +352 return size; │ │ │ │ +353 } │ │ │ │ +354 } │ │ │ │ +355 │ │ │ │ +356 static std::string _t_y_p_e___i_d_e_n_t_i_f_i_e_r(void) { return "std::vector<" + │ │ │ │ +_b_i_n_a_r_y_<_T_>_:_:_t_y_p_e___i_d_e_n_t_i_f_i_e_r() + ">"; } │ │ │ │ +357 static │ │ │ │ +358 size_t _s_t_o_r_e(std::ostream& _os, const value_type& _v, bool _swap=false, │ │ │ │ +bool _store_size = true) { │ │ │ │ +359 size_t bytes=0; │ │ │ │ +360 if(_store_size) │ │ │ │ +361 { │ │ │ │ +362 unsigned int N = static_cast(_v.size()); │ │ │ │ +363 bytes += _b_i_n_a_r_y_<_u_n_s_i_g_n_e_d_ _i_n_t_>_:_:_s_t_o_r_e( _os, N, _swap ); │ │ │ │ +364 } │ │ │ │ +365 if (_swap) │ │ │ │ +366 bytes += std::accumulate( _v.begin(), _v.end(), static_cast(0), │ │ │ │ +367 FunctorStore(_os,_swap) ); │ │ │ │ +368 else │ │ │ │ +369 { │ │ │ │ +370 auto elem_size = _b_i_n_a_r_y_<_e_l_e_m___t_y_p_e_>_:_:_s_i_z_e___o_f(); │ │ │ │ +371 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type)) │ │ │ │ +372 { │ │ │ │ +373 // size of all elements is known, equal, and densely packed in vector. │ │ │ │ +374 // Just store vector data │ │ │ │ +375 auto bytes_of_vec = _s_i_z_e___o_f(_v, false); │ │ │ │ +376 bytes += bytes_of_vec; │ │ │ │ +377 if (_v.size() > 0) │ │ │ │ +378 _os.write( reinterpret_cast(&_v[0]), bytes_of_vec); │ │ │ │ +379 } │ │ │ │ +380 else │ │ │ │ +381 { │ │ │ │ +382 // store individual elements │ │ │ │ +383 for (const auto& v : _v) │ │ │ │ +384 bytes += binary::_s_t_o_r_e(_os, v, _swap); │ │ │ │ 385 } │ │ │ │ -386#else │ │ │ │ -387 ; │ │ │ │ -388#endif │ │ │ │ +386 } │ │ │ │ +387 return _os.good() ? bytes : 0; │ │ │ │ +388 } │ │ │ │ 389 │ │ │ │ -390 │ │ │ │ -_3_9_3 inline Scalar _o_p_e_r_a_t_o_r_|(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -394 Scalar p(0); │ │ │ │ -395#define expr(i) p += Base::values_[i] * _rhs.Base::values_[i]; │ │ │ │ -396 unroll(expr); │ │ │ │ -397#undef expr │ │ │ │ -398 return p; │ │ │ │ +390 static size_t _r_e_s_t_o_r_e(std::istream& _is, value_type& _v, bool _swap=false, │ │ │ │ +bool _restore_size = true) { │ │ │ │ +391 │ │ │ │ +392 size_t bytes=0; │ │ │ │ +393 │ │ │ │ +394 if(_restore_size) │ │ │ │ +395 { │ │ │ │ +396 unsigned int size_of_vec; │ │ │ │ +397 bytes += _b_i_n_a_r_y_<_u_n_s_i_g_n_e_d_ _i_n_t_>_:_:_r_e_s_t_o_r_e(_is, size_of_vec, _swap); │ │ │ │ +398 _v.resize(size_of_vec); │ │ │ │ 399 } │ │ │ │ 400 │ │ │ │ -401 │ │ │ │ -402 │ │ │ │ -403 │ │ │ │ -404 │ │ │ │ -405 //------------------------------------------------------------ euclidean │ │ │ │ -norm │ │ │ │ -406 │ │ │ │ -408 │ │ │ │ -409 │ │ │ │ -_4_1_0 inline Scalar _n_o_r_m() const { return (Scalar)sqrt(sqrnorm()); } │ │ │ │ -_4_1_1 inline Scalar _l_e_n_g_t_h() const { return norm(); } // OpenSG interface │ │ │ │ -412 │ │ │ │ -_4_1_4 inline Scalar _s_q_r_n_o_r_m() const │ │ │ │ -415 { │ │ │ │ -416#if DIM==N │ │ │ │ -417 Scalar s(0); │ │ │ │ -418#define expr(i) s += Base::values_[i] * Base::values_[i]; │ │ │ │ -419 unroll(expr); │ │ │ │ -420#undef expr │ │ │ │ -421 return s; │ │ │ │ -422#else │ │ │ │ -423#define expr(i) Base::values_[i]*Base::values_[i] │ │ │ │ -424 return (unroll_comb(expr, +)); │ │ │ │ -425#undef expr │ │ │ │ -426#endif │ │ │ │ -427 } │ │ │ │ +401 if ( _swap) │ │ │ │ +402 bytes += std::accumulate( _v.begin(), _v.end(), size_t(0), │ │ │ │ +403 FunctorRestore(_is, _swap) ); │ │ │ │ +404 else │ │ │ │ +405 { │ │ │ │ +406 auto elem_size = _b_i_n_a_r_y_<_e_l_e_m___t_y_p_e_>_:_:_s_i_z_e___o_f(); │ │ │ │ +407 if (elem_size != IO::UnknownSize && elem_size == sizeof(elem_type)) │ │ │ │ +408 { │ │ │ │ +409 // size of all elements is known, equal, and densely packed in vector. │ │ │ │ +410 // Just restore vector data │ │ │ │ +411 auto bytes_of_vec = _s_i_z_e___o_f(_v, false); │ │ │ │ +412 bytes += bytes_of_vec; │ │ │ │ +413 if (_v.size() > 0) │ │ │ │ +414 _is.read( reinterpret_cast(&_v[0]), bytes_of_vec ); │ │ │ │ +415 } │ │ │ │ +416 else │ │ │ │ +417 { │ │ │ │ +418 // restore individual elements │ │ │ │ +419 for (auto& v : _v) │ │ │ │ +420 bytes += binary::_r_e_s_t_o_r_e(_is, v, _swap); │ │ │ │ +421 } │ │ │ │ +422 } │ │ │ │ +423 return _is.good() ? bytes : 0; │ │ │ │ +424 } │ │ │ │ +425}; │ │ │ │ +426 │ │ │ │ +427#include │ │ │ │ 428 │ │ │ │ -_4_3_2 inline _v_e_c_t_o_r___t_y_p_e& _n_o_r_m_a_l_i_z_e() │ │ │ │ -433 { │ │ │ │ -434 *this /= norm(); │ │ │ │ -435 return *this; │ │ │ │ -436 } │ │ │ │ -437 │ │ │ │ -_4_4_1 inline const _v_e_c_t_o_r___t_y_p_e _n_o_r_m_a_l_i_z_e_d() const │ │ │ │ -442 { │ │ │ │ -443 return *this / norm(); │ │ │ │ -444 } │ │ │ │ -445 │ │ │ │ -_4_4_8 inline _v_e_c_t_o_r___t_y_p_e& _n_o_r_m_a_l_i_z_e___c_o_n_d() │ │ │ │ -449 { │ │ │ │ -450 Scalar n = norm(); │ │ │ │ -451 if (n != (Scalar)0.0) │ │ │ │ -452 { │ │ │ │ -453 *this /= n; │ │ │ │ -454 } │ │ │ │ -455 return *this; │ │ │ │ -456 } │ │ │ │ -457 │ │ │ │ -459 │ │ │ │ -460 //------------------------------------------------------------ euclidean │ │ │ │ -norm │ │ │ │ -461 │ │ │ │ -463 │ │ │ │ -464 │ │ │ │ -_4_6_6 inline Scalar _l_1___n_o_r_m() const │ │ │ │ -467 { │ │ │ │ -468#if DIM==N │ │ │ │ -469 Scalar s(0); │ │ │ │ -470#define expr(i) s += std::abs(Base::values_[i]); │ │ │ │ -471 unroll(expr); │ │ │ │ -472#undef expr │ │ │ │ -473 return s; │ │ │ │ -474#else │ │ │ │ -475#define expr(i) std::abs(Base::values_[i]) │ │ │ │ -476 return (unroll_comb(expr, +)); │ │ │ │ -477#undef expr │ │ │ │ -478#endif │ │ │ │ -479 } │ │ │ │ -480 │ │ │ │ -_4_8_2 inline Scalar _l_8___n_o_r_m() const │ │ │ │ -483 { │ │ │ │ -484 return max_abs(); │ │ │ │ -485 } │ │ │ │ -486 │ │ │ │ -488 │ │ │ │ -489 //------------------------------------------------------------ max, min, │ │ │ │ -mean │ │ │ │ -490 │ │ │ │ -492 │ │ │ │ -493 │ │ │ │ -_4_9_5 inline Scalar _m_a_x() const │ │ │ │ -496 { │ │ │ │ -497 Scalar m(Base::values_[0]); │ │ │ │ -498 for(int i=1; im) m=Base::values_[i]; │ │ │ │ -499 return m; │ │ │ │ -500 } │ │ │ │ -501 │ │ │ │ -_5_0_3 inline Scalar _m_a_x___a_b_s() const │ │ │ │ -504 { │ │ │ │ -505 Scalar m(std::abs(Base::values_[0])); │ │ │ │ -506 for(int i=1; im) │ │ │ │ -508 m=std::abs(Base::values_[i]); │ │ │ │ -509 return m; │ │ │ │ -510 } │ │ │ │ -511 │ │ │ │ -512 │ │ │ │ -_5_1_4 inline Scalar _m_i_n() const │ │ │ │ -515 { │ │ │ │ -516 Scalar m(Base::values_[0]); │ │ │ │ -517 for(int i=1; i Base::values_[i]) Base::values_[i] = _rhs[i]; │ │ │ │ -566 unroll(expr); │ │ │ │ -567#undef expr │ │ │ │ -568 return *this; │ │ │ │ -569 } │ │ │ │ -570 │ │ │ │ -_5_7_2 inline bool _m_a_x_i_m_i_z_e_d(const _v_e_c_t_o_r___t_y_p_e& _rhs) { │ │ │ │ -573 bool result(false); │ │ │ │ -574#define expr(i) if (_rhs[i] > Base::values_[i]) { Base::values_[i] =_rhs[i]; │ │ │ │ -result = true; } │ │ │ │ -575 unroll(expr); │ │ │ │ -576#undef expr │ │ │ │ -577 return result; │ │ │ │ -578 } │ │ │ │ -579 │ │ │ │ -_5_8_1 inline _v_e_c_t_o_r___t_y_p_e _m_i_n(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -582 return _v_e_c_t_o_r___t_y_p_e(*this)._m_i_n_i_m_i_z_e(_rhs); │ │ │ │ -583 } │ │ │ │ -584 │ │ │ │ -_5_8_6 inline _v_e_c_t_o_r___t_y_p_e _m_a_x(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -587 return _v_e_c_t_o_r___t_y_p_e(*this)._m_a_x_i_m_i_z_e(_rhs); │ │ │ │ -588 } │ │ │ │ -589 │ │ │ │ -591 │ │ │ │ -592 //------------------------------------------------------------ misc │ │ │ │ -functions │ │ │ │ -593 │ │ │ │ -595 template │ │ │ │ -_5_9_6 inline _v_e_c_t_o_r___t_y_p_e _a_p_p_l_y(const Functor& _func) const { │ │ │ │ -597 _v_e_c_t_o_r___t_y_p_e result; │ │ │ │ -598#define expr(i) result[i] = _func(Base::values_[i]); │ │ │ │ -599 unroll(expr); │ │ │ │ -600#undef expr │ │ │ │ -601 return result; │ │ │ │ -602 } │ │ │ │ -603 │ │ │ │ -_6_0_5 _v_e_c_t_o_r___t_y_p_e& _v_e_c_t_o_r_i_z_e(const Scalar& _s) { │ │ │ │ -606#define expr(i) Base::values_[i] = _s; │ │ │ │ -607 unroll(expr); │ │ │ │ -608#undef expr │ │ │ │ -609 return *this; │ │ │ │ -610 } │ │ │ │ -611 │ │ │ │ -612 │ │ │ │ -_6_1_4 static _v_e_c_t_o_r___t_y_p_e _v_e_c_t_o_r_i_z_e_d(const Scalar& _s) { │ │ │ │ -615 return _v_e_c_t_o_r___t_y_p_e()._v_e_c_t_o_r_i_z_e(_s); │ │ │ │ -616 } │ │ │ │ -617 │ │ │ │ -618 │ │ │ │ -_6_2_0 bool _o_p_e_r_a_t_o_r_<(const _v_e_c_t_o_r___t_y_p_e& _rhs) const { │ │ │ │ -621#define expr(i) if (Base::values_[i] != _rhs.Base::values_[i]) \ │ │ │ │ -622 return (Base::values_[i] < _rhs.Base::values_[i]); │ │ │ │ -623 unroll(expr); │ │ │ │ -624#undef expr │ │ │ │ -625 return false; │ │ │ │ -626 } │ │ │ │ -627}; │ │ │ │ -628 │ │ │ │ -629 │ │ │ │ -630 │ │ │ │ -632TEMPLATE_HEADER │ │ │ │ -633inline std::istream& │ │ │ │ -634operator>>(std::istream& is, _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_D_I_M_>& vec) │ │ │ │ -635{ │ │ │ │ -636#define expr(i) is >> vec[i]; │ │ │ │ -637 unroll(expr); │ │ │ │ -638#undef expr │ │ │ │ -639 return is; │ │ │ │ -640} │ │ │ │ -641 │ │ │ │ -642 │ │ │ │ -644TEMPLATE_HEADER │ │ │ │ -645inline std::ostream& │ │ │ │ -646operator<<(std::ostream& os, const _V_e_c_t_o_r_T_<_S_c_a_l_a_r_,_D_I_M_>& vec) │ │ │ │ -647{ │ │ │ │ -648#if DIM==N │ │ │ │ -649 for(int i=0; i vector_type │ │ │ │ -type of this vector │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:79 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e_d │ │ │ │ -bool maximized(const vector_type &_rhs) │ │ │ │ -maximize values and signalize coordinate maximization │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:572 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ -Scalar min() const │ │ │ │ -return the minimal component │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:514 │ │ │ │ -_V_e_c_t_o_r_T_:_:_d_i_m │ │ │ │ -static int dim() │ │ │ │ -returns dimension of the vector (deprecated) │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:82 │ │ │ │ -_V_e_c_t_o_r_T_:_:_l_e_n_g_t_h │ │ │ │ -Scalar length() const │ │ │ │ -compute euclidean norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:411 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ -vector_type operator-(const vector_type &_v) const │ │ │ │ -component-wise vector difference │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:355 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_i_n │ │ │ │ -vector_type min(const vector_type &_rhs) const │ │ │ │ -component-wise min │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:581 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ -vector_type & operator/=(const vector_type &_rhs) │ │ │ │ -component-wise self-division │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:294 │ │ │ │ -_V_e_c_t_o_r_T_:_:_d_a_t_a │ │ │ │ -const Scalar * data() const │ │ │ │ -access to const Scalar array │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:189 │ │ │ │ -_V_e_c_t_o_r_T_:_:_s_i_z_e │ │ │ │ -static size_t size() │ │ │ │ -returns dimension of the vector │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:85 │ │ │ │ -_V_e_c_t_o_r_T_:_:_d_a_t_a │ │ │ │ -Scalar * data() │ │ │ │ -access to Scalar array │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:186 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ -vector_type & operator-=(const vector_type &_rhs) │ │ │ │ -vector difference from this │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:302 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_a_x_i_m_i_z_e │ │ │ │ -vector_type & maximize(const vector_type &_rhs) │ │ │ │ -maximize values: same as *this = max(*this, _rhs), but faster │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:564 │ │ │ │ -_V_e_c_t_o_r_T_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ -Scalar value_type │ │ │ │ -the type of the scalar used in this template │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:76 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ -vector_type operator/(const vector_type &_v) const │ │ │ │ -component-wise vector division │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:331 │ │ │ │ -_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e_d │ │ │ │ -const vector_type normalized() const │ │ │ │ -return normalized vector │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:441 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+ │ │ │ │ -vector_type operator+(const vector_type &_v) const │ │ │ │ -component-wise vector addition │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:343 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_e_a_n___a_b_s │ │ │ │ -Scalar mean_abs() const │ │ │ │ -return absolute arithmetic mean │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:539 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e_d │ │ │ │ -bool minimized(const vector_type &_rhs) │ │ │ │ -minimize values and signalize coordinate minimization │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:555 │ │ │ │ -_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(const Scalar &v) │ │ │ │ -special constructor for 1D vectors │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:96 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_a_x___a_b_s │ │ │ │ -Scalar max_abs() const │ │ │ │ -return the maximal absolute component │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:503 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_% │ │ │ │ -VectorT< Scalar, 3 > operator%(const VectorT< Scalar, 3 > &_rhs) const │ │ │ │ -cross product: only defined for Vec3* as specialization │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ -vector_type max(const vector_type &_rhs) const │ │ │ │ -component-wise max │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:586 │ │ │ │ -_V_e_c_t_o_r_T_:_:_n_o_r_m │ │ │ │ -Scalar norm() const │ │ │ │ -compute euclidean norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:410 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ -vector_type & operator/=(const Scalar &_s) │ │ │ │ -component-wise self-division by scalar │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:247 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ -vector_type & operator+=(const vector_type &_rhs) │ │ │ │ -vector self-addition │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:310 │ │ │ │ -_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e │ │ │ │ -vector_type & vectorize(const Scalar &_s) │ │ │ │ -store the same value in each component (e.g. to clear all entries) │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:605 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_i_n___a_b_s │ │ │ │ -Scalar min_abs() const │ │ │ │ -return the minimal absolute component │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:522 │ │ │ │ -_V_e_c_t_o_r_T_:_:_s_q_r_n_o_r_m │ │ │ │ -Scalar sqrnorm() const │ │ │ │ -compute squared euclidean norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:414 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_/ │ │ │ │ -vector_type operator/(const Scalar &_s) const │ │ │ │ -component-wise division by with scalar │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:268 │ │ │ │ -_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(const Scalar _values[N]) │ │ │ │ -construct from a value array (explicit) │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:144 │ │ │ │ -_V_e_c_t_o_r_T_:_:_l_8___n_o_r_m │ │ │ │ -Scalar l8_norm() const │ │ │ │ -compute l8_norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:482 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ -bool operator==(const vector_type &_rhs) const │ │ │ │ -component-wise comparison │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:220 │ │ │ │ -_V_e_c_t_o_r_T_:_:_v_e_c_t_o_r_i_z_e_d │ │ │ │ -static vector_type vectorized(const Scalar &_s) │ │ │ │ -store the same value in each component │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:614 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ -bool operator!=(const vector_type &_rhs) const │ │ │ │ -component-wise comparison │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:228 │ │ │ │ -_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT(const VectorT< otherScalarType, N > &_rhs) │ │ │ │ -copy & cast constructor (explicit) │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:161 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ -const Scalar & operator[](size_t _i) const │ │ │ │ -get i'th element read-only │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:210 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ -bool operator<(const vector_type &_rhs) const │ │ │ │ -lexicographical comparison │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:620 │ │ │ │ -_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e │ │ │ │ -vector_type & normalize() │ │ │ │ -normalize vector, return normalized vector │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:432 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ -vector_type operator-(void) const │ │ │ │ -unary minus │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:367 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_| │ │ │ │ -Scalar operator|(const vector_type &_rhs) const │ │ │ │ -compute scalar product │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:393 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ -vector_type & operator=(const VectorT< otherScalarType, N > &_rhs) │ │ │ │ -cast from vector with a different scalar type │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:172 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -vector_type operator*(const Scalar &_s) const │ │ │ │ -component-wise multiplication with scalar │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:256 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_i_n_i_m_i_z_e │ │ │ │ -vector_type & minimize(const vector_type &_rhs) │ │ │ │ -minimize values: same as *this = min(*this, _rhs), but faster │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:547 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ -vector_type & operator*=(const Scalar &_s) │ │ │ │ -component-wise self-multiplication with scalar │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:238 │ │ │ │ -_V_e_c_t_o_r_T_:_:_V_e_c_t_o_r_T │ │ │ │ -VectorT() │ │ │ │ -default constructor creates uninitialized values. │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:93 │ │ │ │ -_V_e_c_t_o_r_T_:_:_n_o_r_m_a_l_i_z_e___c_o_n_d │ │ │ │ -vector_type & normalize_cond() │ │ │ │ -normalize vector, return normalized vector and avoids div by zero │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:448 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ -vector_type & operator*=(const vector_type &_rhs) │ │ │ │ -component-wise self-multiplication │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:286 │ │ │ │ -_V_e_c_t_o_r_T_:_:_l_1___n_o_r_m │ │ │ │ -Scalar l1_norm() const │ │ │ │ -compute L1 (Manhattan) norm │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:466 │ │ │ │ -_V_e_c_t_o_r_T_:_:_m_a_x │ │ │ │ -Scalar max() const │ │ │ │ -return the maximal component │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:495 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ -Scalar & operator[](size_t _i) │ │ │ │ -get i'th element read-write │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:205 │ │ │ │ -_V_e_c_t_o_r_T_:_:_o_p_e_r_a_t_o_r_* │ │ │ │ -vector_type operator*(const vector_type &_v) const │ │ │ │ -component-wise vector multiplication │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:319 │ │ │ │ -_V_e_c_t_o_r_T_:_:_a_p_p_l_y │ │ │ │ -vector_type apply(const Functor &_func) const │ │ │ │ -component-wise apply function object with Scalar operator()(Scalar). │ │ │ │ -DDeeffiinniittiioonn VectorT_inc.hh:596 │ │ │ │ +439 │ │ │ │ +_N_u_m_L_i_m_i_t_s_T_._h_h │ │ │ │ +Temporary solution until std::numeric_limits is standard. │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_8___t │ │ │ │ +signed char int8_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_1_6___t │ │ │ │ +short int16_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_6_4___t │ │ │ │ +unsigned long long uint64_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:89 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_3_2___t │ │ │ │ +unsigned int uint32_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_1_6___t │ │ │ │ +unsigned short uint16_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_i_n_t_3_2___t │ │ │ │ +int int32_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:85 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_u_i_n_t_8___t │ │ │ │ +unsigned char uint8_t │ │ │ │ +Binary read a short from _is and perform byte swapping if _swap is true. │ │ │ │ +DDeeffiinniittiioonn SR_types.hh:80 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_r_e_s_t_o_r_e │ │ │ │ +static size_t restore(std::istream &, value_type &, bool=false, bool=true) │ │ │ │ +Restore a value of T and return the number of bytes read. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:125 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_i_s___s_t_r_e_a_m_a_b_l_e │ │ │ │ +static const bool is_streamable │ │ │ │ +Can we store T? Set this to true in your specialization. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:101 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_t_o_r_e │ │ │ │ +static size_t store(std::ostream &, const value_type &, bool=false, bool=true) │ │ │ │ +Store a value of T and return the number of bytes written. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:113 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_t_y_p_e___i_d_e_n_t_i_f_i_e_r │ │ │ │ +static std::string type_identifier(void) │ │ │ │ +A string that identifies the type of T. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:109 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y_:_:_s_i_z_e___o_f │ │ │ │ +static size_t size_of(void) │ │ │ │ +What's the size of T? If it depends on the actual value (e.g. for vectors) │ │ │ │ +return UnknownSize. │ │ │ │ +DDeeffiinniittiioonn SR_binary.hh:104 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ +Add status information to a base class. │ │ │ │ +DDeeffiinniittiioonn Status.hh:95 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_U_t_i_l_s_:_:_N_u_m_L_i_m_i_t_s_T_:_:_m_a_x │ │ │ │ +static Scalar max() │ │ │ │ +Return the maximum absolte value a scalar type can store. │ │ │ │ +DDeeffiinniittiioonn NumLimitsT.hh:97 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00788_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/Geometry/LoopSchemeMaskT.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/OMFormatT_impl.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
LoopSchemeMaskT.hh
│ │ │ +
OMFormatT_impl.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -139,158 +139,211 @@ │ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │ -
45#ifndef LOOPSCHEMEMASKT_HH
│ │ │ -
46#define LOOPSCHEMEMASKT_HH
│ │ │ -
47
│ │ │ -
48#include <cmath>
│ │ │ -
49#include <vector>
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Helper Functions for binary reading / writing
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │
50
│ │ │ -
51#include <OpenMesh/Core/System/config.h>
│ │ │ -
52#include <OpenMesh/Core/Utils/SingletonT.hh>
│ │ │ +
51
│ │ │ +
52#define OPENMESH_IO_OMFORMAT_CC
│ │ │
53
│ │ │ -
54namespace OpenMesh
│ │ │ -
55{
│ │ │ +
54
│ │ │ +
55//== INCLUDES =================================================================
│ │ │
56
│ │ │ -
65template <class T_, unsigned int cache_size_ = 100>
│ │ │ -
│ │ │ - │ │ │ -
67{
│ │ │ -
68public:
│ │ │ -
69 enum { cache_size = cache_size_ };
│ │ │ -
70 typedef T_ Scalar;
│ │ │ -
71
│ │ │ -
72protected:
│ │ │ -
73
│ │ │ -
74 Scalar proj_weights_[cache_size];
│ │ │ -
75 Scalar limit_weights_[cache_size];
│ │ │ -
76 Scalar step_weights_[cache_size];
│ │ │ -
77 std::vector<Scalar> tang0_weights_[cache_size];
│ │ │ -
78 std::vector<Scalar> tang1_weights_[cache_size];
│ │ │ -
79
│ │ │ -
80protected:
│ │ │ -
81
│ │ │ -
82 inline static Scalar compute_proj_weight(uint _valence)
│ │ │ -
83 {
│ │ │ -
84 //return pow(3.0 / 2.0 + cos(2.0 * M_PI / _valence), 2) / 2.0 - 1.0;
│ │ │ -
85 double denom = (3.0 + 2.0*cos(2.0*M_PI/(double)_valence));
│ │ │ -
86 double weight = (64.0*_valence)/(40.0 - denom*denom) - _valence;
│ │ │ -
87 return (Scalar) weight;
│ │ │ -
88 }
│ │ │ -
89
│ │ │ -
90 inline static Scalar compute_limit_weight(uint _valence)
│ │ │ -
91 {
│ │ │ -
92 double proj_weight_value = compute_proj_weight(_valence);
│ │ │ -
93 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);//normalize the proj_weight
│ │ │ -
94 double weight = (3.0/8.0)/(1.0 - proj_weight_value + (3.0/8.0));
│ │ │ -
95 return (Scalar)weight;
│ │ │ -
96 }
│ │ │ -
97
│ │ │ -
98 inline static Scalar compute_step_weight(uint _valence)
│ │ │ -
99 {
│ │ │ -
100 double proj_weight_value = compute_proj_weight(_valence);
│ │ │ -
101 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);//normalize the proj_weight
│ │ │ -
102 double weight = proj_weight_value - (3.0/8.0);
│ │ │ -
103 return (Scalar)weight;
│ │ │ -
104 }
│ │ │ -
105
│ │ │ -
106 inline static Scalar compute_tang0_weight(uint _valence, uint _ver_id)
│ │ │ -
107 {
│ │ │ -
108 return (Scalar)cos(2.0*M_PI*(double)_ver_id/(double)_valence);
│ │ │ -
109 }
│ │ │ -
110
│ │ │ -
111 inline static Scalar compute_tang1_weight(uint _valence, uint _ver_id)
│ │ │ -
112 {
│ │ │ -
113 return (Scalar)sin(2.0*M_PI*(double)_ver_id/(double)_valence);
│ │ │ -
114 }
│ │ │ -
115
│ │ │ -
116 void cache_weights()
│ │ │ -
117 {
│ │ │ -
118 proj_weights_[0] = 1;
│ │ │ -
119 for (uint k = 1; k < cache_size; ++k)
│ │ │ -
120 {
│ │ │ -
121 proj_weights_[k] = compute_proj_weight(k);
│ │ │ -
122 limit_weights_[k] = compute_limit_weight(k);
│ │ │ -
123 step_weights_[k] = compute_step_weight(k);
│ │ │ -
124 tang0_weights_[k].resize(k);
│ │ │ -
125 tang1_weights_[k].resize(k);
│ │ │ -
126 for (uint i = 0; i < k; ++i)
│ │ │ -
127 {
│ │ │ -
128 tang0_weights_[k][i] = compute_tang0_weight(k,i);
│ │ │ -
129 tang1_weights_[k][i] = compute_tang1_weight(k,i);
│ │ │ -
130 }
│ │ │ -
131 }
│ │ │ -
132 }
│ │ │ -
133
│ │ │ -
134public:
│ │ │ -
135
│ │ │ - │ │ │ -
137 {
│ │ │ -
138 cache_weights();
│ │ │ -
139 }
│ │ │ -
140
│ │ │ -
141 inline Scalar proj_weight(uint _valence) const
│ │ │ -
142 {
│ │ │ -
143 assert(_valence < cache_size );
│ │ │ -
144 return proj_weights_[_valence];
│ │ │ -
145 }
│ │ │ -
146
│ │ │ -
147 inline Scalar limit_weight(uint _valence) const
│ │ │ -
148 {
│ │ │ -
149 assert(_valence < cache_size );
│ │ │ -
150 return limit_weights_[_valence];
│ │ │ -
151 }
│ │ │ -
152
│ │ │ -
153 inline Scalar step_weight(uint _valence, uint _step) const
│ │ │ -
154 {
│ │ │ -
155 assert(_valence < cache_size);
│ │ │ -
156 return pow(step_weights_[_valence], (int)_step);//can be precomputed
│ │ │ -
157 }
│ │ │ -
158
│ │ │ -
159 inline Scalar tang0_weight(uint _valence, uint _ver_id) const
│ │ │ -
160 {
│ │ │ -
161 assert(_valence < cache_size );
│ │ │ -
162 assert(_ver_id < _valence);
│ │ │ -
163 return tang0_weights_[_valence][_ver_id];
│ │ │ -
164 }
│ │ │ -
165
│ │ │ -
166 inline Scalar tang1_weight(uint _valence, uint _ver_id) const
│ │ │ -
167 {
│ │ │ -
168 assert(_valence < cache_size );
│ │ │ -
169 assert(_ver_id < _valence);
│ │ │ -
170 return tang1_weights_[_valence][_ver_id];
│ │ │ -
171 }
│ │ │ -
172
│ │ │ -
173 void dump(uint _max_valency = cache_size - 1) const
│ │ │ -
174 {
│ │ │ -
175 assert(_max_valency <= cache_size - 1);
│ │ │ -
176 //CConsole::printf("(k : pw_k, lw_k): ");
│ │ │ -
177 for (uint i = 0; i <= _max_valency; ++i)
│ │ │ -
178 {
│ │ │ -
179 //CConsole::stream() << "(" << i << " : " << proj_weight(i) << ", " << limit_weight(i) << ", " << step_weight(i,1) << "), ";
│ │ │ -
180 }
│ │ │ -
181 //CConsole::printf("\n");
│ │ │ -
182 }
│ │ │ -
183};
│ │ │ -
│ │ │ -
184
│ │ │ - │ │ │ - │ │ │ -
187
│ │ │ -
188}//namespace OpenMesh
│ │ │ +
57#include <OpenMesh/Core/IO/OMFormat.hh>
│ │ │ +
58#include <algorithm>
│ │ │ +
59#include <iomanip>
│ │ │ +
60
│ │ │ +
61//== NAMESPACES ===============================================================
│ │ │ +
62
│ │ │ +
63namespace OpenMesh {
│ │ │ +
64namespace IO {
│ │ │ +
65
│ │ │ +
66 // helper to store a an integer
│ │ │ +
67 template< typename T >
│ │ │ +
68 size_t
│ │ │ +
69 store( std::ostream& _os,
│ │ │ +
70 const T& _val,
│ │ │ +
71 OMFormat::Chunk::Integer_Size _b,
│ │ │ +
72 bool _swap,
│ │ │ +
73 t_signed)
│ │ │ +
74 {
│ │ │ +
75 assert( OMFormat::is_integer( _val ) );
│ │ │ +
76
│ │ │ +
77 switch( _b )
│ │ │ +
78 {
│ │ │ +
79 case OMFormat::Chunk::Integer_8:
│ │ │ +
80 {
│ │ │ +
81 OMFormat::int8 v = static_cast<OMFormat::int8>(_val);
│ │ │ +
82 return store( _os, v, _swap );
│ │ │ +
83 }
│ │ │ +
84 case OMFormat::Chunk::Integer_16:
│ │ │ +
85 {
│ │ │ +
86 OMFormat::int16 v = static_cast<OMFormat::int16>(_val);
│ │ │ +
87 return store( _os, v, _swap );
│ │ │ +
88 }
│ │ │ +
89 case OMFormat::Chunk::Integer_32:
│ │ │ +
90 {
│ │ │ +
91 OMFormat::int32 v = static_cast<OMFormat::int32>(_val);
│ │ │ +
92 return store( _os, v, _swap );
│ │ │ +
93 }
│ │ │ +
94 case OMFormat::Chunk::Integer_64:
│ │ │ +
95 {
│ │ │ +
96 OMFormat::int64 v = static_cast<OMFormat::int64>(_val);
│ │ │ +
97 return store( _os, v, _swap );
│ │ │ +
98 }
│ │ │ +
99 }
│ │ │ +
100 return 0;
│ │ │ +
101 }
│ │ │ +
102
│ │ │ +
103
│ │ │ +
104 // helper to store a an unsigned integer
│ │ │ +
105 template< typename T >
│ │ │ +
106 size_t
│ │ │ +
107 store( std::ostream& _os,
│ │ │ +
108 const T& _val,
│ │ │ +
109 OMFormat::Chunk::Integer_Size _b,
│ │ │ +
110 bool _swap,
│ │ │ +
111 t_unsigned)
│ │ │ +
112 {
│ │ │ +
113 assert( OMFormat::is_integer( _val ) );
│ │ │ +
114
│ │ │ +
115 switch( _b )
│ │ │ +
116 {
│ │ │ +
117 case OMFormat::Chunk::Integer_8:
│ │ │ +
118 {
│ │ │ +
119 OMFormat::uint8 v = static_cast<OMFormat::uint8>(_val);
│ │ │ +
120 return store( _os, v, _swap );
│ │ │ +
121 }
│ │ │ +
122 case OMFormat::Chunk::Integer_16:
│ │ │ +
123 {
│ │ │ +
124 OMFormat::uint16 v = static_cast<OMFormat::uint16>(_val);
│ │ │ +
125 return store( _os, v, _swap );
│ │ │ +
126 }
│ │ │ +
127 case OMFormat::Chunk::Integer_32:
│ │ │ +
128 {
│ │ │ +
129 OMFormat::uint32 v = static_cast<OMFormat::uint32>(_val);
│ │ │ +
130 return store( _os, v, _swap );
│ │ │ +
131 }
│ │ │ +
132
│ │ │ +
133 case OMFormat::Chunk::Integer_64:
│ │ │ +
134 {
│ │ │ +
135 OMFormat::uint64 v = static_cast<OMFormat::uint64>(_val);
│ │ │ +
136 return store( _os, v, _swap );
│ │ │ +
137 }
│ │ │ +
138 }
│ │ │ +
139 return 0;
│ │ │ +
140 }
│ │ │ +
141
│ │ │ +
142
│ │ │ +
143 // helper to restore a an integer
│ │ │ +
144 template< typename T >
│ │ │ +
145 size_t
│ │ │ +
146 restore( std::istream& _is,
│ │ │ +
147 T& _val,
│ │ │ +
148 OMFormat::Chunk::Integer_Size _b,
│ │ │ +
149 bool _swap,
│ │ │ +
150 t_signed)
│ │ │ +
151 {
│ │ │ +
152 assert( OMFormat::is_integer( _val ) );
│ │ │ +
153 size_t bytes = 0;
│ │ │ +
154
│ │ │ +
155 switch( _b )
│ │ │ +
156 {
│ │ │ +
157 case OMFormat::Chunk::Integer_8:
│ │ │ +
158 {
│ │ │ +
159 OMFormat::int8 v;
│ │ │ +
160 bytes = restore( _is, v, _swap );
│ │ │ +
161 _val = static_cast<T>(v);
│ │ │ +
162 break;
│ │ │ +
163 }
│ │ │ +
164 case OMFormat::Chunk::Integer_16:
│ │ │ +
165 {
│ │ │ +
166 OMFormat::int16 v;
│ │ │ +
167 bytes = restore( _is, v, _swap );
│ │ │ +
168 _val = static_cast<T>(v);
│ │ │ +
169 break;
│ │ │ +
170 }
│ │ │ +
171 case OMFormat::Chunk::Integer_32:
│ │ │ +
172 {
│ │ │ +
173 OMFormat::int32 v;
│ │ │ +
174 bytes = restore( _is, v, _swap );
│ │ │ +
175 _val = static_cast<T>(v);
│ │ │ +
176 break;
│ │ │ +
177 }
│ │ │ +
178 case OMFormat::Chunk::Integer_64:
│ │ │ +
179 {
│ │ │ +
180 OMFormat::int64 v;
│ │ │ +
181 bytes = restore( _is, v, _swap );
│ │ │ +
182 _val = static_cast<T>(v);
│ │ │ +
183 break;
│ │ │ +
184 }
│ │ │ +
185 }
│ │ │ +
186 return bytes;
│ │ │ +
187 }
│ │ │ +
188
│ │ │
189
│ │ │ -
190#endif//LOOPSCHEMEMASKT_HH
│ │ │ -
191
│ │ │ +
190 // helper to restore a an unsigned integer
│ │ │ +
191 template< typename T >
│ │ │ +
192 size_t
│ │ │ +
193 restore( std::istream& _is,
│ │ │ +
194 T& _val,
│ │ │ +
195 OMFormat::Chunk::Integer_Size _b,
│ │ │ +
196 bool _swap,
│ │ │ +
197 t_unsigned)
│ │ │ +
198 {
│ │ │ +
199 assert( OMFormat::is_integer( _val ) );
│ │ │ +
200 size_t bytes = 0;
│ │ │ +
201
│ │ │ +
202 switch( _b )
│ │ │ +
203 {
│ │ │ +
204 case OMFormat::Chunk::Integer_8:
│ │ │ +
205 {
│ │ │ +
206 OMFormat::uint8 v;
│ │ │ +
207 bytes = restore( _is, v, _swap );
│ │ │ +
208 _val = static_cast<T>(v);
│ │ │ +
209 break;
│ │ │ +
210 }
│ │ │ +
211 case OMFormat::Chunk::Integer_16:
│ │ │ +
212 {
│ │ │ +
213 OMFormat::uint16 v;
│ │ │ +
214 bytes = restore( _is, v, _swap );
│ │ │ +
215 _val = static_cast<T>(v);
│ │ │ +
216 break;
│ │ │ +
217 }
│ │ │ +
218 case OMFormat::Chunk::Integer_32:
│ │ │ +
219 {
│ │ │ +
220 OMFormat::uint32 v;
│ │ │ +
221 bytes = restore( _is, v, _swap );
│ │ │ +
222 _val = static_cast<T>(v);
│ │ │ +
223 break;
│ │ │ +
224 }
│ │ │ +
225
│ │ │ +
226 case OMFormat::Chunk::Integer_64:
│ │ │ +
227 {
│ │ │ +
228 OMFormat::uint64 v;
│ │ │ +
229 bytes = restore( _is, v, _swap );
│ │ │ +
230 _val = static_cast<T>(v);
│ │ │ +
231 break;
│ │ │ +
232 }
│ │ │ +
233 }
│ │ │ +
234 return bytes;
│ │ │ +
235 }
│ │ │ +
236
│ │ │ +
237//=============================================================================
│ │ │ +
238} // namespace IO
│ │ │ +
239} // namespace OpenMesh
│ │ │ +
240//=============================================================================
│ │ │
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ -
implements cache for the weights of the original Loop scheme supported:
Definition LoopSchemeMaskT.hh:67
│ │ │ -
A simple singleton template.
Definition SingletonT.hh:77
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -LoopSchemeMaskT.hh │ │ │ │ +OMFormatT_impl.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -48,162 +48,216 @@ │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ -45#ifndef LOOPSCHEMEMASKT_HH │ │ │ │ -46#define LOOPSCHEMEMASKT_HH │ │ │ │ -47 │ │ │ │ -48#include │ │ │ │ -49#include │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Helper Functions for binary reading / writing │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ 50 │ │ │ │ -51#include │ │ │ │ -52#include │ │ │ │ +51 │ │ │ │ +52#define OPENMESH_IO_OMFORMAT_CC │ │ │ │ 53 │ │ │ │ -54namespace _O_p_e_n_M_e_s_h │ │ │ │ -55{ │ │ │ │ +54 │ │ │ │ +55//== INCLUDES │ │ │ │ +================================================================= │ │ │ │ 56 │ │ │ │ -65template │ │ │ │ -_6_6class _L_o_o_p_S_c_h_e_m_e_M_a_s_k_T │ │ │ │ -67{ │ │ │ │ -68public: │ │ │ │ -69 enum { cache_size = cache_size_ }; │ │ │ │ -70 typedef T_ Scalar; │ │ │ │ -71 │ │ │ │ -72protected: │ │ │ │ -73 │ │ │ │ -74 Scalar proj_weights_[cache_size]; │ │ │ │ -75 Scalar limit_weights_[cache_size]; │ │ │ │ -76 Scalar step_weights_[cache_size]; │ │ │ │ -77 std::vector tang0_weights_[cache_size]; │ │ │ │ -78 std::vector tang1_weights_[cache_size]; │ │ │ │ -79 │ │ │ │ -80protected: │ │ │ │ -81 │ │ │ │ -82 inline static Scalar compute_proj_weight(uint _valence) │ │ │ │ -83 { │ │ │ │ -84 //return pow(3.0 / 2.0 + cos(2.0 * M_PI / _valence), 2) / 2.0 - 1.0; │ │ │ │ -85 double denom = (3.0 + 2.0*cos(2.0*M_PI/(double)_valence)); │ │ │ │ -86 double weight = (64.0*_valence)/(40.0 - denom*denom) - _valence; │ │ │ │ -87 return (Scalar) weight; │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59#include │ │ │ │ +60 │ │ │ │ +61//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +62 │ │ │ │ +63namespace _O_p_e_n_M_e_s_h { │ │ │ │ +64namespace IO { │ │ │ │ +65 │ │ │ │ +66 // helper to store a an integer │ │ │ │ +67 template< typename T > │ │ │ │ +68 size_t │ │ │ │ +69 store( std::ostream& _os, │ │ │ │ +70 const T& _val, │ │ │ │ +71 OMFormat::Chunk::Integer_Size _b, │ │ │ │ +72 bool _swap, │ │ │ │ +73 t_signed) │ │ │ │ +74 { │ │ │ │ +75 assert( OMFormat::is_integer( _val ) ); │ │ │ │ +76 │ │ │ │ +77 switch( _b ) │ │ │ │ +78 { │ │ │ │ +79 case OMFormat::Chunk::Integer_8: │ │ │ │ +80 { │ │ │ │ +81 OMFormat::int8 v = static_cast(_val); │ │ │ │ +82 return store( _os, v, _swap ); │ │ │ │ +83 } │ │ │ │ +84 case OMFormat::Chunk::Integer_16: │ │ │ │ +85 { │ │ │ │ +86 OMFormat::int16 v = static_cast(_val); │ │ │ │ +87 return store( _os, v, _swap ); │ │ │ │ 88 } │ │ │ │ -89 │ │ │ │ -90 inline static Scalar compute_limit_weight(uint _valence) │ │ │ │ -91 { │ │ │ │ -92 double proj_weight_value = compute_proj_weight(_valence); │ │ │ │ -93 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);// │ │ │ │ -normalize the proj_weight │ │ │ │ -94 double weight = (3.0/8.0)/(1.0 - proj_weight_value + (3.0/8.0)); │ │ │ │ -95 return (Scalar)weight; │ │ │ │ -96 } │ │ │ │ -97 │ │ │ │ -98 inline static Scalar compute_step_weight(uint _valence) │ │ │ │ -99 { │ │ │ │ -100 double proj_weight_value = compute_proj_weight(_valence); │ │ │ │ -101 proj_weight_value = proj_weight_value/(proj_weight_value + _valence);// │ │ │ │ -normalize the proj_weight │ │ │ │ -102 double weight = proj_weight_value - (3.0/8.0); │ │ │ │ -103 return (Scalar)weight; │ │ │ │ -104 } │ │ │ │ -105 │ │ │ │ -106 inline static Scalar compute_tang0_weight(uint _valence, uint _ver_id) │ │ │ │ -107 { │ │ │ │ -108 return (Scalar)cos(2.0*M_PI*(double)_ver_id/(double)_valence); │ │ │ │ -109 } │ │ │ │ -110 │ │ │ │ -111 inline static Scalar compute_tang1_weight(uint _valence, uint _ver_id) │ │ │ │ +89 case OMFormat::Chunk::Integer_32: │ │ │ │ +90 { │ │ │ │ +91 OMFormat::int32 v = static_cast(_val); │ │ │ │ +92 return store( _os, v, _swap ); │ │ │ │ +93 } │ │ │ │ +94 case OMFormat::Chunk::Integer_64: │ │ │ │ +95 { │ │ │ │ +96 OMFormat::int64 v = static_cast(_val); │ │ │ │ +97 return store( _os, v, _swap ); │ │ │ │ +98 } │ │ │ │ +99 } │ │ │ │ +100 return 0; │ │ │ │ +101 } │ │ │ │ +102 │ │ │ │ +103 │ │ │ │ +104 // helper to store a an unsigned integer │ │ │ │ +105 template< typename T > │ │ │ │ +106 size_t │ │ │ │ +107 store( std::ostream& _os, │ │ │ │ +108 const T& _val, │ │ │ │ +109 OMFormat::Chunk::Integer_Size _b, │ │ │ │ +110 bool _swap, │ │ │ │ +111 t_unsigned) │ │ │ │ 112 { │ │ │ │ -113 return (Scalar)sin(2.0*M_PI*(double)_ver_id/(double)_valence); │ │ │ │ -114 } │ │ │ │ -115 │ │ │ │ -116 void cache_weights() │ │ │ │ -117 { │ │ │ │ -118 proj_weights_[0] = 1; │ │ │ │ -119 for (uint k = 1; k < cache_size; ++k) │ │ │ │ -120 { │ │ │ │ -121 proj_weights_[k] = compute_proj_weight(k); │ │ │ │ -122 limit_weights_[k] = compute_limit_weight(k); │ │ │ │ -123 step_weights_[k] = compute_step_weight(k); │ │ │ │ -124 tang0_weights_[k].resize(k); │ │ │ │ -125 tang1_weights_[k].resize(k); │ │ │ │ -126 for (uint i = 0; i < k; ++i) │ │ │ │ -127 { │ │ │ │ -128 tang0_weights_[k][i] = compute_tang0_weight(k,i); │ │ │ │ -129 tang1_weights_[k][i] = compute_tang1_weight(k,i); │ │ │ │ -130 } │ │ │ │ +113 assert( OMFormat::is_integer( _val ) ); │ │ │ │ +114 │ │ │ │ +115 switch( _b ) │ │ │ │ +116 { │ │ │ │ +117 case OMFormat::Chunk::Integer_8: │ │ │ │ +118 { │ │ │ │ +119 OMFormat::uint8 v = static_cast(_val); │ │ │ │ +120 return store( _os, v, _swap ); │ │ │ │ +121 } │ │ │ │ +122 case OMFormat::Chunk::Integer_16: │ │ │ │ +123 { │ │ │ │ +124 OMFormat::uint16 v = static_cast(_val); │ │ │ │ +125 return store( _os, v, _swap ); │ │ │ │ +126 } │ │ │ │ +127 case OMFormat::Chunk::Integer_32: │ │ │ │ +128 { │ │ │ │ +129 OMFormat::uint32 v = static_cast(_val); │ │ │ │ +130 return store( _os, v, _swap ); │ │ │ │ 131 } │ │ │ │ -132 } │ │ │ │ -133 │ │ │ │ -134public: │ │ │ │ -135 │ │ │ │ -136 _L_o_o_p_S_c_h_e_m_e_M_a_s_k_T() │ │ │ │ -137 { │ │ │ │ -138 cache_weights(); │ │ │ │ -139 } │ │ │ │ -140 │ │ │ │ -141 inline Scalar proj_weight(uint _valence) const │ │ │ │ -142 { │ │ │ │ -143 assert(_valence < cache_size ); │ │ │ │ -144 return proj_weights_[_valence]; │ │ │ │ -145 } │ │ │ │ -146 │ │ │ │ -147 inline Scalar limit_weight(uint _valence) const │ │ │ │ -148 { │ │ │ │ -149 assert(_valence < cache_size ); │ │ │ │ -150 return limit_weights_[_valence]; │ │ │ │ -151 } │ │ │ │ -152 │ │ │ │ -153 inline Scalar step_weight(uint _valence, uint _step) const │ │ │ │ -154 { │ │ │ │ -155 assert(_valence < cache_size); │ │ │ │ -156 return pow(step_weights_[_valence], (int)_step);//can be precomputed │ │ │ │ -157 } │ │ │ │ -158 │ │ │ │ -159 inline Scalar tang0_weight(uint _valence, uint _ver_id) const │ │ │ │ -160 { │ │ │ │ -161 assert(_valence < cache_size ); │ │ │ │ -162 assert(_ver_id < _valence); │ │ │ │ -163 return tang0_weights_[_valence][_ver_id]; │ │ │ │ -164 } │ │ │ │ -165 │ │ │ │ -166 inline Scalar tang1_weight(uint _valence, uint _ver_id) const │ │ │ │ -167 { │ │ │ │ -168 assert(_valence < cache_size ); │ │ │ │ -169 assert(_ver_id < _valence); │ │ │ │ -170 return tang1_weights_[_valence][_ver_id]; │ │ │ │ -171 } │ │ │ │ -172 │ │ │ │ -173 void dump(uint _max_valency = cache_size - 1) const │ │ │ │ -174 { │ │ │ │ -175 assert(_max_valency <= cache_size - 1); │ │ │ │ -176 //CConsole::printf("(k : pw_k, lw_k): "); │ │ │ │ -177 for (uint i = 0; i <= _max_valency; ++i) │ │ │ │ -178 { │ │ │ │ -179 //CConsole::stream() << "(" << i << " : " << proj_weight(i) << ", " << │ │ │ │ -limit_weight(i) << ", " << step_weight(i,1) << "), "; │ │ │ │ -180 } │ │ │ │ -181 //CConsole::printf("\n"); │ │ │ │ -182 } │ │ │ │ -183}; │ │ │ │ -184 │ │ │ │ -185typedef _L_o_o_p_S_c_h_e_m_e_M_a_s_k_T_<_d_o_u_b_l_e_,_ _1_0_0_> _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e; │ │ │ │ -186typedef _S_i_n_g_l_e_t_o_n_T_<_L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e_> _L_o_o_p_S_c_h_e_m_e_M_a_s_k_D_o_u_b_l_e_S_i_n_g_l_e_t_o_n; │ │ │ │ -187 │ │ │ │ -188}//namespace OpenMesh │ │ │ │ +132 │ │ │ │ +133 case OMFormat::Chunk::Integer_64: │ │ │ │ +134 { │ │ │ │ +135 OMFormat::uint64 v = static_cast(_val); │ │ │ │ +136 return store( _os, v, _swap ); │ │ │ │ +137 } │ │ │ │ +138 } │ │ │ │ +139 return 0; │ │ │ │ +140 } │ │ │ │ +141 │ │ │ │ +142 │ │ │ │ +143 // helper to restore a an integer │ │ │ │ +144 template< typename T > │ │ │ │ +145 size_t │ │ │ │ +146 restore( std::istream& _is, │ │ │ │ +147 T& _val, │ │ │ │ +148 OMFormat::Chunk::Integer_Size _b, │ │ │ │ +149 bool _swap, │ │ │ │ +150 t_signed) │ │ │ │ +151 { │ │ │ │ +152 assert( OMFormat::is_integer( _val ) ); │ │ │ │ +153 size_t bytes = 0; │ │ │ │ +154 │ │ │ │ +155 switch( _b ) │ │ │ │ +156 { │ │ │ │ +157 case OMFormat::Chunk::Integer_8: │ │ │ │ +158 { │ │ │ │ +159 OMFormat::int8 v; │ │ │ │ +160 bytes = restore( _is, v, _swap ); │ │ │ │ +161 _val = static_cast(v); │ │ │ │ +162 break; │ │ │ │ +163 } │ │ │ │ +164 case OMFormat::Chunk::Integer_16: │ │ │ │ +165 { │ │ │ │ +166 OMFormat::int16 v; │ │ │ │ +167 bytes = restore( _is, v, _swap ); │ │ │ │ +168 _val = static_cast(v); │ │ │ │ +169 break; │ │ │ │ +170 } │ │ │ │ +171 case OMFormat::Chunk::Integer_32: │ │ │ │ +172 { │ │ │ │ +173 OMFormat::int32 v; │ │ │ │ +174 bytes = restore( _is, v, _swap ); │ │ │ │ +175 _val = static_cast(v); │ │ │ │ +176 break; │ │ │ │ +177 } │ │ │ │ +178 case OMFormat::Chunk::Integer_64: │ │ │ │ +179 { │ │ │ │ +180 OMFormat::int64 v; │ │ │ │ +181 bytes = restore( _is, v, _swap ); │ │ │ │ +182 _val = static_cast(v); │ │ │ │ +183 break; │ │ │ │ +184 } │ │ │ │ +185 } │ │ │ │ +186 return bytes; │ │ │ │ +187 } │ │ │ │ +188 │ │ │ │ 189 │ │ │ │ -190#endif//LOOPSCHEMEMASKT_HH │ │ │ │ -191 │ │ │ │ +190 // helper to restore a an unsigned integer │ │ │ │ +191 template< typename T > │ │ │ │ +192 size_t │ │ │ │ +193 restore( std::istream& _is, │ │ │ │ +194 T& _val, │ │ │ │ +195 OMFormat::Chunk::Integer_Size _b, │ │ │ │ +196 bool _swap, │ │ │ │ +197 t_unsigned) │ │ │ │ +198 { │ │ │ │ +199 assert( OMFormat::is_integer( _val ) ); │ │ │ │ +200 size_t bytes = 0; │ │ │ │ +201 │ │ │ │ +202 switch( _b ) │ │ │ │ +203 { │ │ │ │ +204 case OMFormat::Chunk::Integer_8: │ │ │ │ +205 { │ │ │ │ +206 OMFormat::uint8 v; │ │ │ │ +207 bytes = restore( _is, v, _swap ); │ │ │ │ +208 _val = static_cast(v); │ │ │ │ +209 break; │ │ │ │ +210 } │ │ │ │ +211 case OMFormat::Chunk::Integer_16: │ │ │ │ +212 { │ │ │ │ +213 OMFormat::uint16 v; │ │ │ │ +214 bytes = restore( _is, v, _swap ); │ │ │ │ +215 _val = static_cast(v); │ │ │ │ +216 break; │ │ │ │ +217 } │ │ │ │ +218 case OMFormat::Chunk::Integer_32: │ │ │ │ +219 { │ │ │ │ +220 OMFormat::uint32 v; │ │ │ │ +221 bytes = restore( _is, v, _swap ); │ │ │ │ +222 _val = static_cast(v); │ │ │ │ +223 break; │ │ │ │ +224 } │ │ │ │ +225 │ │ │ │ +226 case OMFormat::Chunk::Integer_64: │ │ │ │ +227 { │ │ │ │ +228 OMFormat::uint64 v; │ │ │ │ +229 bytes = restore( _is, v, _swap ); │ │ │ │ +230 _val = static_cast(v); │ │ │ │ +231 break; │ │ │ │ +232 } │ │ │ │ +233 } │ │ │ │ +234 return bytes; │ │ │ │ +235 } │ │ │ │ +236 │ │ │ │ +237// │ │ │ │ +============================================================================= │ │ │ │ +238} // namespace IO │ │ │ │ +239} // namespace OpenMesh │ │ │ │ +240// │ │ │ │ +============================================================================= │ │ │ │ _O_p_e_n_M_e_s_h │ │ │ │ Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ different mesh kernels ... │ │ │ │ DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_L_o_o_p_S_c_h_e_m_e_M_a_s_k_T │ │ │ │ -implements cache for the weights of the original Loop scheme supported: │ │ │ │ -DDeeffiinniittiioonn LoopSchemeMaskT.hh:67 │ │ │ │ -_O_p_e_n_M_e_s_h_:_:_S_i_n_g_l_e_t_o_n_T │ │ │ │ -A simple singleton template. │ │ │ │ -DDeeffiinniittiioonn SingletonT.hh:77 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00791_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/System/config.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/importer/ImporterT.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
config.hh
│ │ │ +
ImporterT.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -138,15 +138,483 @@ │ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │ -
44#include <OpenMesh/Core/System/config.h>
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Implements an importer module for arbitrary OpenMesh meshes
│ │ │ +
48//
│ │ │ +
49//=============================================================================
│ │ │ +
50
│ │ │ +
51
│ │ │ +
52#ifndef __IMPORTERT_HH__
│ │ │ +
53#define __IMPORTERT_HH__
│ │ │ +
54
│ │ │ +
55
│ │ │ +
56//=== INCLUDES ================================================================
│ │ │ +
57
│ │ │ +
58
│ │ │ +
59#include <OpenMesh/Core/IO/importer/BaseImporter.hh>
│ │ │ +
60#include <OpenMesh/Core/Utils/vector_cast.hh>
│ │ │ +
61#include <OpenMesh/Core/Utils/color_cast.hh>
│ │ │ + │ │ │ + │ │ │ +
64
│ │ │ +
65
│ │ │ +
66//== NAMESPACES ===============================================================
│ │ │ +
67
│ │ │ +
68
│ │ │ +
69namespace OpenMesh {
│ │ │ +
70namespace IO {
│ │ │ +
71
│ │ │ +
72
│ │ │ +
73//=== IMPLEMENTATION ==========================================================
│ │ │ +
74
│ │ │ +
75
│ │ │ +
79template <class Mesh>
│ │ │ +
│ │ │ +
80class ImporterT : public BaseImporter
│ │ │ +
81{
│ │ │ +
82public:
│ │ │ +
83
│ │ │ +
84 typedef typename Mesh::Point Point;
│ │ │ +
85 typedef typename Mesh::Normal Normal;
│ │ │ +
86 typedef typename Mesh::Color Color;
│ │ │ +
87 typedef typename Mesh::TexCoord2D TexCoord2D;
│ │ │ +
88 typedef typename Mesh::TexCoord3D TexCoord3D;
│ │ │ +
89 typedef std::vector<VertexHandle> VHandles;
│ │ │ +
90
│ │ │ +
91
│ │ │ +
92 explicit ImporterT(Mesh& _mesh) : mesh_(_mesh), halfedgeNormals_() {}
│ │ │ +
93
│ │ │ +
94
│ │ │ +
95 virtual VertexHandle add_vertex(const Vec3f& _point) override
│ │ │ +
96 {
│ │ │ +
97 return mesh_.add_vertex(vector_cast<Point>(_point));
│ │ │ +
98 }
│ │ │ +
99
│ │ │ +
100 virtual VertexHandle add_vertex(const Vec3d& _point) override
│ │ │ +
101 {
│ │ │ +
102 return mesh_.add_vertex(vector_cast<Point>(_point));
│ │ │ +
103 }
│ │ │ +
104
│ │ │ +
105 virtual VertexHandle add_vertex() override
│ │ │ +
106 {
│ │ │ +
107 return mesh_.new_vertex();
│ │ │ +
108 }
│ │ │ +
109
│ │ │ +
110 virtual HalfedgeHandle add_edge(VertexHandle _vh0, VertexHandle _vh1) override
│ │ │ +
111 {
│ │ │ +
112 return mesh_.new_edge(_vh0, _vh1);
│ │ │ +
113 }
│ │ │ +
114
│ │ │ +
115 virtual FaceHandle add_face(const VHandles& _indices) override
│ │ │ +
116 {
│ │ │ +
117 FaceHandle fh;
│ │ │ +
118
│ │ │ +
119 if (_indices.size() > 2)
│ │ │ +
120 {
│ │ │ +
121 VHandles::const_iterator it, it2, end(_indices.end());
│ │ │ +
122
│ │ │ +
123
│ │ │ +
124 // Test if all vertex handles are valid. If not, we throw an error.
│ │ │ +
125 if ( std::any_of(_indices.begin(),_indices.end(),[this](const VertexHandle& vh){ return !mesh_.is_valid_handle(vh); } ) )
│ │ │ +
126 {
│ │ │ +
127 omerr() << "ImporterT: Face contains invalid vertex index\n";
│ │ │ +
128 return fh;
│ │ │ +
129 }
│ │ │ +
130
│ │ │ +
131 // don't allow double vertices
│ │ │ +
132 for (it=_indices.begin(); it!=end; ++it)
│ │ │ +
133 for (it2=it+1; it2!=end; ++it2)
│ │ │ +
134 if (*it == *it2)
│ │ │ +
135 {
│ │ │ +
136 omerr() << "ImporterT: Face has equal vertices\n";
│ │ │ +
137 return fh;
│ │ │ +
138 }
│ │ │ +
139
│ │ │ +
140
│ │ │ +
141 // try to add face
│ │ │ +
142 fh = mesh_.add_face(_indices);
│ │ │ +
143 // separate non-manifold faces and mark them
│ │ │ +
144 if (!fh.is_valid())
│ │ │ +
145 {
│ │ │ +
146 VHandles vhandles(_indices.size());
│ │ │ +
147
│ │ │ +
148 // double vertices
│ │ │ +
149 for (unsigned int j=0; j<_indices.size(); ++j)
│ │ │ +
150 {
│ │ │ +
151 // DO STORE p, reference may not work since vertex array
│ │ │ +
152 // may be relocated after adding a new vertex !
│ │ │ +
153 Point p = mesh_.point(_indices[j]);
│ │ │ +
154 vhandles[j] = mesh_.add_vertex(p);
│ │ │ +
155
│ │ │ +
156 // Mark vertices of failed face as non-manifold
│ │ │ +
157 if (mesh_.has_vertex_status()) {
│ │ │ +
158 mesh_.status(vhandles[j]).set_fixed_nonmanifold(true);
│ │ │ +
159 }
│ │ │ +
160 }
│ │ │ +
161
│ │ │ +
162 // add face
│ │ │ +
163 fh = mesh_.add_face(vhandles);
│ │ │ +
164
│ │ │ +
165 // Mark failed face as non-manifold
│ │ │ +
166 if (mesh_.has_face_status())
│ │ │ +
167 mesh_.status(fh).set_fixed_nonmanifold(true);
│ │ │ +
168
│ │ │ +
169 // Mark edges of failed face as non-two-manifold
│ │ │ +
170 if (mesh_.has_edge_status()) {
│ │ │ +
171 typename Mesh::FaceEdgeIter fe_it = mesh_.fe_iter(fh);
│ │ │ +
172 for(; fe_it.is_valid(); ++fe_it) {
│ │ │ +
173 mesh_.status(*fe_it).set_fixed_nonmanifold(true);
│ │ │ +
174 }
│ │ │ +
175 }
│ │ │ +
176 }
│ │ │ +
177
│ │ │ +
178 //write the half edge normals
│ │ │ +
179 if (mesh_.has_halfedge_normals())
│ │ │ +
180 {
│ │ │ +
181 //iterate over all incoming haldedges of the added face
│ │ │ +
182 for (typename Mesh::FaceHalfedgeIter fh_iter = mesh_.fh_begin(fh);
│ │ │ +
183 fh_iter != mesh_.fh_end(fh); ++fh_iter)
│ │ │ +
184 {
│ │ │ +
185 //and write the normals to it
│ │ │ +
186 typename Mesh::HalfedgeHandle heh = *fh_iter;
│ │ │ +
187 typename Mesh::VertexHandle vh = mesh_.to_vertex_handle(heh);
│ │ │ +
188 typename std::map<VertexHandle,Normal>::iterator it_heNs = halfedgeNormals_.find(vh);
│ │ │ +
189 if (it_heNs != halfedgeNormals_.end())
│ │ │ +
190 mesh_.set_normal(heh,it_heNs->second);
│ │ │ +
191 }
│ │ │ +
192 halfedgeNormals_.clear();
│ │ │ +
193 }
│ │ │ +
194 }
│ │ │ +
195 return fh;
│ │ │ +
196 }
│ │ │ +
197
│ │ │ +
198 virtual FaceHandle add_face(HalfedgeHandle _heh) override
│ │ │ +
199 {
│ │ │ +
200 auto fh = mesh_.new_face();
│ │ │ +
201 mesh_.set_halfedge_handle(fh, _heh);
│ │ │ +
202 return fh;
│ │ │ +
203 }
│ │ │ +
204
│ │ │ +
205 // vertex attributes
│ │ │ +
206
│ │ │ +
207 virtual void set_point(VertexHandle _vh, const Vec3f& _point) override
│ │ │ +
208 {
│ │ │ +
209 mesh_.set_point(_vh,vector_cast<Point>(_point));
│ │ │ +
210 }
│ │ │ +
211
│ │ │ +
212 virtual void set_halfedge(VertexHandle _vh, HalfedgeHandle _heh) override
│ │ │ +
213 {
│ │ │ +
214 mesh_.set_halfedge_handle(_vh, _heh);
│ │ │ +
215 }
│ │ │ +
216
│ │ │ +
217 virtual void set_normal(VertexHandle _vh, const Vec3f& _normal) override
│ │ │ +
218 {
│ │ │ +
219 if (mesh_.has_vertex_normals())
│ │ │ +
220 mesh_.set_normal(_vh, vector_cast<Normal>(_normal));
│ │ │ +
221
│ │ │ +
222 //saves normals for half edges.
│ │ │ +
223 //they will be written, when the face is added
│ │ │ +
224 if (mesh_.has_halfedge_normals())
│ │ │ +
225 halfedgeNormals_[_vh] = vector_cast<Normal>(_normal);
│ │ │ +
226 }
│ │ │ +
227
│ │ │ +
228 virtual void set_normal(VertexHandle _vh, const Vec3d& _normal) override
│ │ │ +
229 {
│ │ │ +
230 if (mesh_.has_vertex_normals())
│ │ │ +
231 mesh_.set_normal(_vh, vector_cast<Normal>(_normal));
│ │ │ +
232
│ │ │ +
233 //saves normals for half edges.
│ │ │ +
234 //they will be written, when the face is added
│ │ │ +
235 if (mesh_.has_halfedge_normals())
│ │ │ +
236 halfedgeNormals_[_vh] = vector_cast<Normal>(_normal);
│ │ │ +
237 }
│ │ │ +
238
│ │ │ +
239 virtual void set_color(VertexHandle _vh, const Vec4uc& _color) override
│ │ │ +
240 {
│ │ │ +
241 if (mesh_.has_vertex_colors())
│ │ │ +
242 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ +
243 }
│ │ │ +
244
│ │ │ +
245 virtual void set_color(VertexHandle _vh, const Vec3uc& _color) override
│ │ │ +
246 {
│ │ │ +
247 if (mesh_.has_vertex_colors())
│ │ │ +
248 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ +
249 }
│ │ │ +
250
│ │ │ +
251 virtual void set_color(VertexHandle _vh, const Vec4f& _color) override
│ │ │ +
252 {
│ │ │ +
253 if (mesh_.has_vertex_colors())
│ │ │ +
254 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ +
255 }
│ │ │ +
256
│ │ │ +
257 virtual void set_color(VertexHandle _vh, const Vec3f& _color) override
│ │ │ +
258 {
│ │ │ +
259 if (mesh_.has_vertex_colors())
│ │ │ +
260 mesh_.set_color(_vh, color_cast<Color>(_color));
│ │ │ +
261 }
│ │ │ +
262
│ │ │ +
263 virtual void set_texcoord(VertexHandle _vh, const Vec2f& _texcoord) override
│ │ │ +
264 {
│ │ │ +
265 if (mesh_.has_vertex_texcoords2D())
│ │ │ +
266 mesh_.set_texcoord2D(_vh, vector_cast<TexCoord2D>(_texcoord));
│ │ │ +
267 }
│ │ │ +
268
│ │ │ +
269 virtual void set_status(VertexHandle _vh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ +
270 {
│ │ │ +
271 if (!mesh_.has_vertex_status())
│ │ │ +
272 mesh_.request_vertex_status();
│ │ │ +
273 mesh_.status(_vh) = _status;
│ │ │ +
274 }
│ │ │ +
275
│ │ │ +
276 virtual void set_next(HalfedgeHandle _heh, HalfedgeHandle _next) override
│ │ │ +
277 {
│ │ │ +
278 mesh_.set_next_halfedge_handle(_heh, _next);
│ │ │ +
279 }
│ │ │ +
280
│ │ │ +
281 virtual void set_face(HalfedgeHandle _heh, FaceHandle _fh) override
│ │ │ +
282 {
│ │ │ +
283 mesh_.set_face_handle(_heh, _fh);
│ │ │ +
284 }
│ │ │ +
285
│ │ │ +
286 virtual void request_face_texcoords2D() override
│ │ │ +
287 {
│ │ │ +
288 if(!mesh_.has_halfedge_texcoords2D())
│ │ │ +
289 mesh_.request_halfedge_texcoords2D();
│ │ │ +
290 }
│ │ │ +
291
│ │ │ +
292 virtual void set_texcoord(HalfedgeHandle _heh, const Vec2f& _texcoord) override
│ │ │ +
293 {
│ │ │ +
294 if (mesh_.has_halfedge_texcoords2D())
│ │ │ +
295 mesh_.set_texcoord2D(_heh, vector_cast<TexCoord2D>(_texcoord));
│ │ │ +
296 }
│ │ │ +
297
│ │ │ +
298 virtual void set_texcoord(VertexHandle _vh, const Vec3f& _texcoord) override
│ │ │ +
299 {
│ │ │ +
300 if (mesh_.has_vertex_texcoords3D())
│ │ │ +
301 mesh_.set_texcoord3D(_vh, vector_cast<TexCoord3D>(_texcoord));
│ │ │ +
302 }
│ │ │ +
303
│ │ │ +
304 virtual void set_texcoord(HalfedgeHandle _heh, const Vec3f& _texcoord) override
│ │ │ +
305 {
│ │ │ +
306 if (mesh_.has_halfedge_texcoords3D())
│ │ │ +
307 mesh_.set_texcoord3D(_heh, vector_cast<TexCoord3D>(_texcoord));
│ │ │ +
308 }
│ │ │ +
309
│ │ │ +
310 virtual void set_status(HalfedgeHandle _heh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ +
311 {
│ │ │ +
312 if (!mesh_.has_halfedge_status())
│ │ │ +
313 mesh_.request_halfedge_status();
│ │ │ +
314 mesh_.status(_heh) = _status;
│ │ │ +
315 }
│ │ │ +
316
│ │ │ +
317 // edge attributes
│ │ │ +
318
│ │ │ +
319 virtual void set_color(EdgeHandle _eh, const Vec4uc& _color) override
│ │ │ +
320 {
│ │ │ +
321 if (mesh_.has_edge_colors())
│ │ │ +
322 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ +
323 }
│ │ │ +
324
│ │ │ +
325 virtual void set_color(EdgeHandle _eh, const Vec3uc& _color) override
│ │ │ +
326 {
│ │ │ +
327 if (mesh_.has_edge_colors())
│ │ │ +
328 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ +
329 }
│ │ │ +
330
│ │ │ +
331 virtual void set_color(EdgeHandle _eh, const Vec4f& _color) override
│ │ │ +
332 {
│ │ │ +
333 if (mesh_.has_edge_colors())
│ │ │ +
334 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ +
335 }
│ │ │ +
336
│ │ │ +
337 virtual void set_color(EdgeHandle _eh, const Vec3f& _color) override
│ │ │ +
338 {
│ │ │ +
339 if (mesh_.has_edge_colors())
│ │ │ +
340 mesh_.set_color(_eh, color_cast<Color>(_color));
│ │ │ +
341 }
│ │ │ +
342
│ │ │ +
343 virtual void set_status(EdgeHandle _eh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ +
344 {
│ │ │ +
345 if (!mesh_.has_edge_status())
│ │ │ +
346 mesh_.request_edge_status();
│ │ │ +
347 mesh_.status(_eh) = _status;
│ │ │ +
348 }
│ │ │ +
349
│ │ │ +
350 // face attributes
│ │ │ +
351
│ │ │ +
352 virtual void set_normal(FaceHandle _fh, const Vec3f& _normal) override
│ │ │ +
353 {
│ │ │ +
354 if (mesh_.has_face_normals())
│ │ │ +
355 mesh_.set_normal(_fh, vector_cast<Normal>(_normal));
│ │ │ +
356 }
│ │ │ +
357
│ │ │ +
358 virtual void set_normal(FaceHandle _fh, const Vec3d& _normal) override
│ │ │ +
359 {
│ │ │ +
360 if (mesh_.has_face_normals())
│ │ │ +
361 mesh_.set_normal(_fh, vector_cast<Normal>(_normal));
│ │ │ +
362 }
│ │ │ +
363
│ │ │ +
364 virtual void set_color(FaceHandle _fh, const Vec3uc& _color) override
│ │ │ +
365 {
│ │ │ +
366 if (mesh_.has_face_colors())
│ │ │ +
367 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ +
368 }
│ │ │ +
369
│ │ │ +
370 virtual void set_color(FaceHandle _fh, const Vec4uc& _color) override
│ │ │ +
371 {
│ │ │ +
372 if (mesh_.has_face_colors())
│ │ │ +
373 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ +
374 }
│ │ │ +
375
│ │ │ +
376 virtual void set_color(FaceHandle _fh, const Vec3f& _color) override
│ │ │ +
377 {
│ │ │ +
378 if (mesh_.has_face_colors())
│ │ │ +
379 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ +
380 }
│ │ │ +
381
│ │ │ +
382 virtual void set_color(FaceHandle _fh, const Vec4f& _color) override
│ │ │ +
383 {
│ │ │ +
384 if (mesh_.has_face_colors())
│ │ │ +
385 mesh_.set_color(_fh, color_cast<Color>(_color));
│ │ │ +
386 }
│ │ │ +
387
│ │ │ +
388 virtual void set_status(FaceHandle _fh, const OpenMesh::Attributes::StatusInfo& _status) override
│ │ │ +
389 {
│ │ │ +
390 if (!mesh_.has_face_status())
│ │ │ +
391 mesh_.request_face_status();
│ │ │ +
392 mesh_.status(_fh) = _status;
│ │ │ +
393 }
│ │ │ +
394
│ │ │ +
395 virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec2f>& _face_texcoords) override
│ │ │ +
396 {
│ │ │ +
397 // get first halfedge handle
│ │ │ +
398 HalfedgeHandle cur_heh = mesh_.halfedge_handle(_fh);
│ │ │ +
399 HalfedgeHandle end_heh = mesh_.prev_halfedge_handle(cur_heh);
│ │ │ +
400
│ │ │ +
401 // find start heh
│ │ │ +
402 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh )
│ │ │ +
403 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ +
404
│ │ │ +
405 for(unsigned int i=0; i<_face_texcoords.size(); ++i)
│ │ │ +
406 {
│ │ │ +
407 set_texcoord( cur_heh, _face_texcoords[i]);
│ │ │ +
408 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ +
409 }
│ │ │ +
410 }
│ │ │ +
411
│ │ │ +
412 virtual void add_face_texcoords( FaceHandle _fh, VertexHandle _vh, const std::vector<Vec3f>& _face_texcoords) override
│ │ │ +
413 {
│ │ │ +
414 // get first halfedge handle
│ │ │ +
415 HalfedgeHandle cur_heh = mesh_.halfedge_handle(_fh);
│ │ │ +
416 HalfedgeHandle end_heh = mesh_.prev_halfedge_handle(cur_heh);
│ │ │ +
417
│ │ │ +
418 // find start heh
│ │ │ +
419 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh )
│ │ │ +
420 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ +
421
│ │ │ +
422 for(unsigned int i=0; i<_face_texcoords.size(); ++i)
│ │ │ +
423 {
│ │ │ +
424 set_texcoord( cur_heh, _face_texcoords[i]);
│ │ │ +
425 cur_heh = mesh_.next_halfedge_handle( cur_heh);
│ │ │ +
426 }
│ │ │ +
427 }
│ │ │ +
428
│ │ │ +
429 virtual void set_face_texindex( FaceHandle _fh, int _texId ) override
│ │ │ +
430 {
│ │ │ +
431 if ( mesh_.has_face_texture_index() ) {
│ │ │ +
432 mesh_.set_texture_index(_fh , _texId);
│ │ │ +
433 }
│ │ │ +
434 }
│ │ │ +
435
│ │ │ +
436 virtual void add_texture_information( int _id , std::string _name ) override
│ │ │ +
437 {
│ │ │ + │ │ │ +
439
│ │ │ +
440 if ( !mesh_.get_property_handle(property,"TextureMapping") ) {
│ │ │ +
441 mesh_.add_property(property,"TextureMapping");
│ │ │ +
442 }
│ │ │ +
443
│ │ │ +
444 if ( mesh_.property(property).find( _id ) == mesh_.property(property).end() ) {
│ │ │ +
445 mesh_.property(property)[_id] = _name;
│ │ │ +
446 }
│ │ │ +
447 }
│ │ │ +
448
│ │ │ +
449 // low-level access to mesh
│ │ │ +
450
│ │ │ +
451 virtual BaseKernel* kernel() override { return &mesh_; }
│ │ │ +
452
│ │ │ +
453 bool is_triangle_mesh() const override
│ │ │ +
454 { return Mesh::is_triangles(); }
│ │ │ +
455
│ │ │ +
456 void reserve(unsigned int nV, unsigned int nE, unsigned int nF) override
│ │ │ +
457 {
│ │ │ +
458 mesh_.reserve(nV, nE, nF);
│ │ │ +
459 }
│ │ │ +
460
│ │ │ +
461 // query number of faces, vertices, normals, texcoords
│ │ │ +
462 size_t n_vertices() const override { return mesh_.n_vertices(); }
│ │ │ +
463 size_t n_faces() const override { return mesh_.n_faces(); }
│ │ │ +
464 size_t n_edges() const override { return mesh_.n_edges(); }
│ │ │ +
465
│ │ │ +
466
│ │ │ +
467 void prepare() override{ }
│ │ │ +
468
│ │ │ +
469
│ │ │ +
470 void finish() override { }
│ │ │ +
471
│ │ │ +
472
│ │ │ +
473private:
│ │ │ +
474
│ │ │ +
475 Mesh& mesh_;
│ │ │ +
476 // stores normals for halfedges of the next face
│ │ │ +
477 std::map<VertexHandle,Normal> halfedgeNormals_;
│ │ │ +
478};
│ │ │ +
│ │ │ +
479
│ │ │ +
480
│ │ │ +
481//=============================================================================
│ │ │ +
482} // namespace IO
│ │ │ +
483} // namespace OpenMesh
│ │ │ +
484//=============================================================================
│ │ │ +
485#endif
│ │ │ +
486//=============================================================================
│ │ │ +
This file provides some macros containing attribute usage.
│ │ │ +
This file provides the streams omlog, omout, and omerr.
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ + │ │ │ + │ │ │ +
Base class for importer modules.
Definition BaseImporter.hh:84
│ │ │ +
This class template provides an importer module for OpenMesh meshes.
Definition ImporterT.hh:81
│ │ │ +
This class provides low-level property management like adding/removing properties and access to prope...
Definition BaseKernel.hh:98
│ │ │ +
bool is_valid() const
The handle is valid iff the index is not negative.
Definition Handles.hh:72
│ │ │ +
Handle for a vertex entity.
Definition Handles.hh:121
│ │ │ +
Handle for a halfedge entity.
Definition Handles.hh:128
│ │ │ +
Handle for a edge entity.
Definition Handles.hh:135
│ │ │ +
Handle for a face entity.
Definition Handles.hh:142
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │ +
Kernel::FaceEdgeIter FaceEdgeIter
Circulator.
Definition PolyMeshT.hh:169
│ │ │ +
Kernel::VertexHandle VertexHandle
Handle for referencing the corresponding item.
Definition PolyMeshT.hh:136
│ │ │ +
Kernel::Normal Normal
Normal type.
Definition PolyMeshT.hh:114
│ │ │ +
SmartVertexHandle new_vertex()
Uses default copy and assignment operator.
Definition PolyMeshT.hh:201
│ │ │ +
Kernel::TexCoord2D TexCoord2D
TexCoord2D type.
Definition PolyMeshT.hh:120
│ │ │ +
Kernel::TexCoord3D TexCoord3D
TexCoord3D type.
Definition PolyMeshT.hh:122
│ │ │ +
SmartVertexHandle add_vertex(const Point _p)
Alias for new_vertex(const Point&).
Definition PolyMeshT.hh:238
│ │ │ +
Kernel::HalfedgeHandle HalfedgeHandle
Scalar type.
Definition PolyMeshT.hh:137
│ │ │ +
Kernel::FaceHalfedgeIter FaceHalfedgeIter
Circulator.
Definition PolyMeshT.hh:168
│ │ │ +
Kernel::Point Point
Coordinate type.
Definition PolyMeshT.hh:112
│ │ │ +
Kernel::Color Color
Color type.
Definition PolyMeshT.hh:116
│ │ │ +
Add status information to a base class.
Definition Status.hh:95
│ │ │ +
Handle representing a mesh property.
Definition Property.hh:477
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -config.hh │ │ │ │ +ImporterT.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -47,11 +47,562 @@ │ │ │ │ 38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ -44#include │ │ │ │ +44 │ │ │ │ +45// │ │ │ │ +============================================================================= │ │ │ │ +46// │ │ │ │ +47// Implements an importer module for arbitrary OpenMesh meshes │ │ │ │ +48// │ │ │ │ +49// │ │ │ │ +============================================================================= │ │ │ │ +50 │ │ │ │ +51 │ │ │ │ +52#ifndef __IMPORTERT_HH__ │ │ │ │ +53#define __IMPORTERT_HH__ │ │ │ │ +54 │ │ │ │ +55 │ │ │ │ +56//=== INCLUDES │ │ │ │ +================================================================ │ │ │ │ +57 │ │ │ │ +58 │ │ │ │ +59#include │ │ │ │ +60#include │ │ │ │ +61#include │ │ │ │ +62#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_M_e_s_h_/_A_t_t_r_i_b_u_t_e_s_._h_h> │ │ │ │ +63#include <_O_p_e_n_M_e_s_h_/_C_o_r_e_/_S_y_s_t_e_m_/_o_m_s_t_r_e_a_m_._h_h> │ │ │ │ +64 │ │ │ │ +65 │ │ │ │ +66//== NAMESPACES │ │ │ │ +=============================================================== │ │ │ │ +67 │ │ │ │ +68 │ │ │ │ +69namespace _O_p_e_n_M_e_s_h { │ │ │ │ +70namespace IO { │ │ │ │ +71 │ │ │ │ +72 │ │ │ │ +73//=== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ +74 │ │ │ │ +75 │ │ │ │ +79template │ │ │ │ +_8_0class _I_m_p_o_r_t_e_r_T : public _B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ +81{ │ │ │ │ +82public: │ │ │ │ +83 │ │ │ │ +84 typedef typename _M_e_s_h_:_:_P_o_i_n_t Point; │ │ │ │ +85 typedef typename _M_e_s_h_:_:_N_o_r_m_a_l Normal; │ │ │ │ +86 typedef typename _M_e_s_h_:_:_C_o_l_o_r Color; │ │ │ │ +87 typedef typename _M_e_s_h_:_:_T_e_x_C_o_o_r_d_2_D TexCoord2D; │ │ │ │ +88 typedef typename _M_e_s_h_:_:_T_e_x_C_o_o_r_d_3_D TexCoord3D; │ │ │ │ +89 typedef std::vector VHandles; │ │ │ │ +90 │ │ │ │ +91 │ │ │ │ +92 explicit _I_m_p_o_r_t_e_r_T(_M_e_s_h& _mesh) : mesh_(_mesh), halfedgeNormals_() {} │ │ │ │ +93 │ │ │ │ +94 │ │ │ │ +95 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex(const _V_e_c_3_f& _point) override │ │ │ │ +96 { │ │ │ │ +97 return mesh_._a_d_d___v_e_r_t_e_x(vector_cast(_point)); │ │ │ │ +98 } │ │ │ │ +99 │ │ │ │ +100 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex(const _V_e_c_3_d& _point) override │ │ │ │ +101 { │ │ │ │ +102 return mesh_._a_d_d___v_e_r_t_e_x(vector_cast(_point)); │ │ │ │ +103 } │ │ │ │ +104 │ │ │ │ +105 virtual _V_e_r_t_e_x_H_a_n_d_l_e add_vertex() override │ │ │ │ +106 { │ │ │ │ +107 return mesh_._n_e_w___v_e_r_t_e_x(); │ │ │ │ +108 } │ │ │ │ +109 │ │ │ │ +110 virtual _H_a_l_f_e_d_g_e_H_a_n_d_l_e add_edge(_V_e_r_t_e_x_H_a_n_d_l_e _vh0, _V_e_r_t_e_x_H_a_n_d_l_e _vh1) │ │ │ │ +override │ │ │ │ +111 { │ │ │ │ +112 return mesh_.new_edge(_vh0, _vh1); │ │ │ │ +113 } │ │ │ │ +114 │ │ │ │ +115 virtual _F_a_c_e_H_a_n_d_l_e add_face(const VHandles& _indices) override │ │ │ │ +116 { │ │ │ │ +117 _F_a_c_e_H_a_n_d_l_e fh; │ │ │ │ +118 │ │ │ │ +119 if (_indices.size() > 2) │ │ │ │ +120 { │ │ │ │ +121 VHandles::const_iterator it, it2, end(_indices.end()); │ │ │ │ +122 │ │ │ │ +123 │ │ │ │ +124 // Test if all vertex handles are valid. If not, we throw an error. │ │ │ │ +125 if ( std::any_of(_indices.begin(),_indices.end(),[this](const _V_e_r_t_e_x_H_a_n_d_l_e& │ │ │ │ +vh){ return !mesh_.is_valid_handle(vh); } ) ) │ │ │ │ +126 { │ │ │ │ +127 omerr() << "ImporterT: Face contains invalid vertex index\n"; │ │ │ │ +128 return fh; │ │ │ │ +129 } │ │ │ │ +130 │ │ │ │ +131 // don't allow double vertices │ │ │ │ +132 for (it=_indices.begin(); it!=end; ++it) │ │ │ │ +133 for (it2=it+1; it2!=end; ++it2) │ │ │ │ +134 if (*it == *it2) │ │ │ │ +135 { │ │ │ │ +136 omerr() << "ImporterT: Face has equal vertices\n"; │ │ │ │ +137 return fh; │ │ │ │ +138 } │ │ │ │ +139 │ │ │ │ +140 │ │ │ │ +141 // try to add face │ │ │ │ +142 fh = mesh_.add_face(_indices); │ │ │ │ +143 // separate non-manifold faces and mark them │ │ │ │ +144 if (!fh._i_s___v_a_l_i_d()) │ │ │ │ +145 { │ │ │ │ +146 VHandles vhandles(_indices.size()); │ │ │ │ +147 │ │ │ │ +148 // double vertices │ │ │ │ +149 for (unsigned int j=0; j<_indices.size(); ++j) │ │ │ │ +150 { │ │ │ │ +151 // DO STORE p, reference may not work since vertex array │ │ │ │ +152 // may be relocated after adding a new vertex ! │ │ │ │ +153 Point p = mesh_.point(_indices[j]); │ │ │ │ +154 vhandles[j] = mesh_._a_d_d___v_e_r_t_e_x(p); │ │ │ │ +155 │ │ │ │ +156 // Mark vertices of failed face as non-manifold │ │ │ │ +157 if (mesh_.has_vertex_status()) { │ │ │ │ +158 mesh_.status(vhandles[j]).set_fixed_nonmanifold(true); │ │ │ │ +159 } │ │ │ │ +160 } │ │ │ │ +161 │ │ │ │ +162 // add face │ │ │ │ +163 fh = mesh_.add_face(vhandles); │ │ │ │ +164 │ │ │ │ +165 // Mark failed face as non-manifold │ │ │ │ +166 if (mesh_.has_face_status()) │ │ │ │ +167 mesh_.status(fh).set_fixed_nonmanifold(true); │ │ │ │ +168 │ │ │ │ +169 // Mark edges of failed face as non-two-manifold │ │ │ │ +170 if (mesh_.has_edge_status()) { │ │ │ │ +171 typename _M_e_s_h_:_:_F_a_c_e_E_d_g_e_I_t_e_r fe_it = mesh_.fe_iter(fh); │ │ │ │ +172 for(; fe_it.is_valid(); ++fe_it) { │ │ │ │ +173 mesh_.status(*fe_it).set_fixed_nonmanifold(true); │ │ │ │ +174 } │ │ │ │ +175 } │ │ │ │ +176 } │ │ │ │ +177 │ │ │ │ +178 //write the half edge normals │ │ │ │ +179 if (mesh_.has_halfedge_normals()) │ │ │ │ +180 { │ │ │ │ +181 //iterate over all incoming haldedges of the added face │ │ │ │ +182 for (typename _M_e_s_h_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r fh_iter = mesh_.fh_begin(fh); │ │ │ │ +183 fh_iter != mesh_.fh_end(fh); ++fh_iter) │ │ │ │ +184 { │ │ │ │ +185 //and write the normals to it │ │ │ │ +186 typename _M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e heh = *fh_iter; │ │ │ │ +187 typename _M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e vh = mesh_.to_vertex_handle(heh); │ │ │ │ +188 typename std::map::iterator it_heNs = │ │ │ │ +halfedgeNormals_.find(vh); │ │ │ │ +189 if (it_heNs != halfedgeNormals_.end()) │ │ │ │ +190 mesh_.set_normal(heh,it_heNs->second); │ │ │ │ +191 } │ │ │ │ +192 halfedgeNormals_.clear(); │ │ │ │ +193 } │ │ │ │ +194 } │ │ │ │ +195 return fh; │ │ │ │ +196 } │ │ │ │ +197 │ │ │ │ +198 virtual _F_a_c_e_H_a_n_d_l_e add_face(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ +199 { │ │ │ │ +200 auto fh = mesh_.new_face(); │ │ │ │ +201 mesh_.set_halfedge_handle(fh, _heh); │ │ │ │ +202 return fh; │ │ │ │ +203 } │ │ │ │ +204 │ │ │ │ +205 // vertex attributes │ │ │ │ +206 │ │ │ │ +207 virtual void set_point(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _point) override │ │ │ │ +208 { │ │ │ │ +209 mesh_.set_point(_vh,vector_cast(_point)); │ │ │ │ +210 } │ │ │ │ +211 │ │ │ │ +212 virtual void set_halfedge(_V_e_r_t_e_x_H_a_n_d_l_e _vh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh) override │ │ │ │ +213 { │ │ │ │ +214 mesh_.set_halfedge_handle(_vh, _heh); │ │ │ │ +215 } │ │ │ │ +216 │ │ │ │ +217 virtual void set_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _normal) override │ │ │ │ +218 { │ │ │ │ +219 if (mesh_.has_vertex_normals()) │ │ │ │ +220 mesh_.set_normal(_vh, vector_cast(_normal)); │ │ │ │ +221 │ │ │ │ +222 //saves normals for half edges. │ │ │ │ +223 //they will be written, when the face is added │ │ │ │ +224 if (mesh_.has_halfedge_normals()) │ │ │ │ +225 halfedgeNormals_[_vh] = vector_cast(_normal); │ │ │ │ +226 } │ │ │ │ +227 │ │ │ │ +228 virtual void set_normal(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_d& _normal) override │ │ │ │ +229 { │ │ │ │ +230 if (mesh_.has_vertex_normals()) │ │ │ │ +231 mesh_.set_normal(_vh, vector_cast(_normal)); │ │ │ │ +232 │ │ │ │ +233 //saves normals for half edges. │ │ │ │ +234 //they will be written, when the face is added │ │ │ │ +235 if (mesh_.has_halfedge_normals()) │ │ │ │ +236 halfedgeNormals_[_vh] = vector_cast(_normal); │ │ │ │ +237 } │ │ │ │ +238 │ │ │ │ +239 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_4_u_c& _color) override │ │ │ │ +240 { │ │ │ │ +241 if (mesh_.has_vertex_colors()) │ │ │ │ +242 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ +243 } │ │ │ │ +244 │ │ │ │ +245 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_u_c& _color) override │ │ │ │ +246 { │ │ │ │ +247 if (mesh_.has_vertex_colors()) │ │ │ │ +248 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ +249 } │ │ │ │ +250 │ │ │ │ +251 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_4_f& _color) override │ │ │ │ +252 { │ │ │ │ +253 if (mesh_.has_vertex_colors()) │ │ │ │ +254 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ +255 } │ │ │ │ +256 │ │ │ │ +257 virtual void set_color(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _color) override │ │ │ │ +258 { │ │ │ │ +259 if (mesh_.has_vertex_colors()) │ │ │ │ +260 mesh_.set_color(_vh, color_cast(_color)); │ │ │ │ +261 } │ │ │ │ +262 │ │ │ │ +263 virtual void set_texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_2_f& _texcoord) │ │ │ │ +override │ │ │ │ +264 { │ │ │ │ +265 if (mesh_.has_vertex_texcoords2D()) │ │ │ │ +266 mesh_.set_texcoord2D(_vh, vector_cast(_texcoord)); │ │ │ │ +267 } │ │ │ │ +268 │ │ │ │ +269 virtual void set_status(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ +_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ +270 { │ │ │ │ +271 if (!mesh_.has_vertex_status()) │ │ │ │ +272 mesh_.request_vertex_status(); │ │ │ │ +273 mesh_.status(_vh) = _status; │ │ │ │ +274 } │ │ │ │ +275 │ │ │ │ +276 virtual void set_next(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _H_a_l_f_e_d_g_e_H_a_n_d_l_e _next) override │ │ │ │ +277 { │ │ │ │ +278 mesh_.set_next_halfedge_handle(_heh, _next); │ │ │ │ +279 } │ │ │ │ +280 │ │ │ │ +281 virtual void set_face(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, _F_a_c_e_H_a_n_d_l_e _fh) override │ │ │ │ +282 { │ │ │ │ +283 mesh_.set_face_handle(_heh, _fh); │ │ │ │ +284 } │ │ │ │ +285 │ │ │ │ +286 virtual void request_face_texcoords2D() override │ │ │ │ +287 { │ │ │ │ +288 if(!mesh_.has_halfedge_texcoords2D()) │ │ │ │ +289 mesh_.request_halfedge_texcoords2D(); │ │ │ │ +290 } │ │ │ │ +291 │ │ │ │ +292 virtual void set_texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _V_e_c_2_f& _texcoord) │ │ │ │ +override │ │ │ │ +293 { │ │ │ │ +294 if (mesh_.has_halfedge_texcoords2D()) │ │ │ │ +295 mesh_.set_texcoord2D(_heh, vector_cast(_texcoord)); │ │ │ │ +296 } │ │ │ │ +297 │ │ │ │ +298 virtual void set_texcoord(_V_e_r_t_e_x_H_a_n_d_l_e _vh, const _V_e_c_3_f& _texcoord) │ │ │ │ +override │ │ │ │ +299 { │ │ │ │ +300 if (mesh_.has_vertex_texcoords3D()) │ │ │ │ +301 mesh_.set_texcoord3D(_vh, vector_cast(_texcoord)); │ │ │ │ +302 } │ │ │ │ +303 │ │ │ │ +304 virtual void set_texcoord(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _V_e_c_3_f& _texcoord) │ │ │ │ +override │ │ │ │ +305 { │ │ │ │ +306 if (mesh_.has_halfedge_texcoords3D()) │ │ │ │ +307 mesh_.set_texcoord3D(_heh, vector_cast(_texcoord)); │ │ │ │ +308 } │ │ │ │ +309 │ │ │ │ +310 virtual void set_status(_H_a_l_f_e_d_g_e_H_a_n_d_l_e _heh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ +_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ +311 { │ │ │ │ +312 if (!mesh_.has_halfedge_status()) │ │ │ │ +313 mesh_.request_halfedge_status(); │ │ │ │ +314 mesh_.status(_heh) = _status; │ │ │ │ +315 } │ │ │ │ +316 │ │ │ │ +317 // edge attributes │ │ │ │ +318 │ │ │ │ +319 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_4_u_c& _color) override │ │ │ │ +320 { │ │ │ │ +321 if (mesh_.has_edge_colors()) │ │ │ │ +322 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ +323 } │ │ │ │ +324 │ │ │ │ +325 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_3_u_c& _color) override │ │ │ │ +326 { │ │ │ │ +327 if (mesh_.has_edge_colors()) │ │ │ │ +328 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ +329 } │ │ │ │ +330 │ │ │ │ +331 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_4_f& _color) override │ │ │ │ +332 { │ │ │ │ +333 if (mesh_.has_edge_colors()) │ │ │ │ +334 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ +335 } │ │ │ │ +336 │ │ │ │ +337 virtual void set_color(_E_d_g_e_H_a_n_d_l_e _eh, const _V_e_c_3_f& _color) override │ │ │ │ +338 { │ │ │ │ +339 if (mesh_.has_edge_colors()) │ │ │ │ +340 mesh_.set_color(_eh, color_cast(_color)); │ │ │ │ +341 } │ │ │ │ +342 │ │ │ │ +343 virtual void set_status(_E_d_g_e_H_a_n_d_l_e _eh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ +_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ +344 { │ │ │ │ +345 if (!mesh_.has_edge_status()) │ │ │ │ +346 mesh_.request_edge_status(); │ │ │ │ +347 mesh_.status(_eh) = _status; │ │ │ │ +348 } │ │ │ │ +349 │ │ │ │ +350 // face attributes │ │ │ │ +351 │ │ │ │ +352 virtual void set_normal(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_f& _normal) override │ │ │ │ +353 { │ │ │ │ +354 if (mesh_.has_face_normals()) │ │ │ │ +355 mesh_.set_normal(_fh, vector_cast(_normal)); │ │ │ │ +356 } │ │ │ │ +357 │ │ │ │ +358 virtual void set_normal(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_d& _normal) override │ │ │ │ +359 { │ │ │ │ +360 if (mesh_.has_face_normals()) │ │ │ │ +361 mesh_.set_normal(_fh, vector_cast(_normal)); │ │ │ │ +362 } │ │ │ │ +363 │ │ │ │ +364 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_u_c& _color) override │ │ │ │ +365 { │ │ │ │ +366 if (mesh_.has_face_colors()) │ │ │ │ +367 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ +368 } │ │ │ │ +369 │ │ │ │ +370 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_4_u_c& _color) override │ │ │ │ +371 { │ │ │ │ +372 if (mesh_.has_face_colors()) │ │ │ │ +373 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ +374 } │ │ │ │ +375 │ │ │ │ +376 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_3_f& _color) override │ │ │ │ +377 { │ │ │ │ +378 if (mesh_.has_face_colors()) │ │ │ │ +379 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ +380 } │ │ │ │ +381 │ │ │ │ +382 virtual void set_color(_F_a_c_e_H_a_n_d_l_e _fh, const _V_e_c_4_f& _color) override │ │ │ │ +383 { │ │ │ │ +384 if (mesh_.has_face_colors()) │ │ │ │ +385 mesh_.set_color(_fh, color_cast(_color)); │ │ │ │ +386 } │ │ │ │ +387 │ │ │ │ +388 virtual void set_status(_F_a_c_e_H_a_n_d_l_e _fh, const _O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_: │ │ │ │ +_S_t_a_t_u_s_I_n_f_o& _status) override │ │ │ │ +389 { │ │ │ │ +390 if (!mesh_.has_face_status()) │ │ │ │ +391 mesh_.request_face_status(); │ │ │ │ +392 mesh_.status(_fh) = _status; │ │ │ │ +393 } │ │ │ │ +394 │ │ │ │ +395 virtual void add_face_texcoords( _F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ +std::vector& _face_texcoords) override │ │ │ │ +396 { │ │ │ │ +397 // get first halfedge handle │ │ │ │ +398 _H_a_l_f_e_d_g_e_H_a_n_d_l_e cur_heh = mesh_.halfedge_handle(_fh); │ │ │ │ +399 _H_a_l_f_e_d_g_e_H_a_n_d_l_e end_heh = mesh_.prev_halfedge_handle(cur_heh); │ │ │ │ +400 │ │ │ │ +401 // find start heh │ │ │ │ +402 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh ) │ │ │ │ +403 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ +404 │ │ │ │ +405 for(unsigned int i=0; i<_face_texcoords.size(); ++i) │ │ │ │ +406 { │ │ │ │ +407 set_texcoord( cur_heh, _face_texcoords[i]); │ │ │ │ +408 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ +409 } │ │ │ │ +410 } │ │ │ │ +411 │ │ │ │ +412 virtual void add_face_texcoords( _F_a_c_e_H_a_n_d_l_e _fh, _V_e_r_t_e_x_H_a_n_d_l_e _vh, const │ │ │ │ +std::vector& _face_texcoords) override │ │ │ │ +413 { │ │ │ │ +414 // get first halfedge handle │ │ │ │ +415 _H_a_l_f_e_d_g_e_H_a_n_d_l_e cur_heh = mesh_.halfedge_handle(_fh); │ │ │ │ +416 _H_a_l_f_e_d_g_e_H_a_n_d_l_e end_heh = mesh_.prev_halfedge_handle(cur_heh); │ │ │ │ +417 │ │ │ │ +418 // find start heh │ │ │ │ +419 while( mesh_.to_vertex_handle(cur_heh) != _vh && cur_heh != end_heh ) │ │ │ │ +420 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ +421 │ │ │ │ +422 for(unsigned int i=0; i<_face_texcoords.size(); ++i) │ │ │ │ +423 { │ │ │ │ +424 set_texcoord( cur_heh, _face_texcoords[i]); │ │ │ │ +425 cur_heh = mesh_.next_halfedge_handle( cur_heh); │ │ │ │ +426 } │ │ │ │ +427 } │ │ │ │ +428 │ │ │ │ +429 virtual void set_face_texindex( _F_a_c_e_H_a_n_d_l_e _fh, int _texId ) override │ │ │ │ +430 { │ │ │ │ +431 if ( mesh_.has_face_texture_index() ) { │ │ │ │ +432 mesh_.set_texture_index(_fh , _texId); │ │ │ │ +433 } │ │ │ │ +434 } │ │ │ │ +435 │ │ │ │ +436 virtual void add_texture_information( int _id , std::string _name ) │ │ │ │ +override │ │ │ │ +437 { │ │ │ │ +438 _O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T_<_ _s_t_d_:_:_m_a_p_<_ _i_n_t_,_ _s_t_d_:_:_s_t_r_i_n_g_ _> > property; │ │ │ │ +439 │ │ │ │ +440 if ( !mesh_.get_property_handle(property,"TextureMapping") ) { │ │ │ │ +441 mesh_.add_property(property,"TextureMapping"); │ │ │ │ +442 } │ │ │ │ +443 │ │ │ │ +444 if ( mesh_.property(property).find( _id ) == mesh_.property(property).end() │ │ │ │ +) { │ │ │ │ +445 mesh_.property(property)[_id] = _name; │ │ │ │ +446 } │ │ │ │ +447 } │ │ │ │ +448 │ │ │ │ +449 // low-level access to mesh │ │ │ │ +450 │ │ │ │ +451 virtual _B_a_s_e_K_e_r_n_e_l* kernel() override { return &mesh_; } │ │ │ │ +452 │ │ │ │ +453 bool is_triangle_mesh() const override │ │ │ │ +454 { return Mesh::is_triangles(); } │ │ │ │ +455 │ │ │ │ +456 void reserve(unsigned int nV, unsigned int nE, unsigned int nF) override │ │ │ │ +457 { │ │ │ │ +458 mesh_.reserve(nV, nE, nF); │ │ │ │ +459 } │ │ │ │ +460 │ │ │ │ +461 // query number of faces, vertices, normals, texcoords │ │ │ │ +462 size_t n_vertices() const override { return mesh_.n_vertices(); } │ │ │ │ +463 size_t n_faces() const override { return mesh_.n_faces(); } │ │ │ │ +464 size_t n_edges() const override { return mesh_.n_edges(); } │ │ │ │ +465 │ │ │ │ +466 │ │ │ │ +467 void prepare() override{ } │ │ │ │ +468 │ │ │ │ +469 │ │ │ │ +470 void finish() override { } │ │ │ │ +471 │ │ │ │ +472 │ │ │ │ +473private: │ │ │ │ +474 │ │ │ │ +475 _M_e_s_h& mesh_; │ │ │ │ +476 // stores normals for halfedges of the next face │ │ │ │ +477 std::map halfedgeNormals_; │ │ │ │ +478}; │ │ │ │ +479 │ │ │ │ +480 │ │ │ │ +481// │ │ │ │ +============================================================================= │ │ │ │ +482} // namespace IO │ │ │ │ +483} // namespace OpenMesh │ │ │ │ +484// │ │ │ │ +============================================================================= │ │ │ │ +485#endif │ │ │ │ +486// │ │ │ │ +============================================================================= │ │ │ │ +_A_t_t_r_i_b_u_t_e_s_._h_h │ │ │ │ +This file provides some macros containing attribute usage. │ │ │ │ +_o_m_s_t_r_e_a_m_._h_h │ │ │ │ +This file provides the streams omlog, omout, and omerr. │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _3_ _> │ │ │ │ +_V_e_c_t_o_r_T_<_ _f_l_o_a_t_,_ _4_ _> │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_B_a_s_e_I_m_p_o_r_t_e_r │ │ │ │ +Base class for importer modules. │ │ │ │ +DDeeffiinniittiioonn BaseImporter.hh:84 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_I_m_p_o_r_t_e_r_T │ │ │ │ +This class template provides an importer module for OpenMesh meshes. │ │ │ │ +DDeeffiinniittiioonn ImporterT.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_K_e_r_n_e_l │ │ │ │ +This class provides low-level property management like adding/removing │ │ │ │ +properties and access to prope... │ │ │ │ +DDeeffiinniittiioonn BaseKernel.hh:98 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_B_a_s_e_H_a_n_d_l_e_:_:_i_s___v_a_l_i_d │ │ │ │ +bool is_valid() const │ │ │ │ +The handle is valid iff the index is not negative. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:72 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Handle for a vertex entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:121 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a halfedge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:128 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_E_d_g_e_H_a_n_d_l_e │ │ │ │ +Handle for a edge entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:135 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_F_a_c_e_H_a_n_d_l_e │ │ │ │ +Handle for a face entity. │ │ │ │ +DDeeffiinniittiioonn Handles.hh:142 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_E_d_g_e_I_t_e_r │ │ │ │ +Kernel::FaceEdgeIter FaceEdgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:169 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_V_e_r_t_e_x_H_a_n_d_l_e │ │ │ │ +Kernel::VertexHandle VertexHandle │ │ │ │ +Handle for referencing the corresponding item. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:136 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_N_o_r_m_a_l │ │ │ │ +Kernel::Normal Normal │ │ │ │ +Normal type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:114 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_n_e_w___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle new_vertex() │ │ │ │ +Uses default copy and assignment operator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:201 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_2_D │ │ │ │ +Kernel::TexCoord2D TexCoord2D │ │ │ │ +TexCoord2D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:120 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_T_e_x_C_o_o_r_d_3_D │ │ │ │ +Kernel::TexCoord3D TexCoord3D │ │ │ │ +TexCoord3D type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:122 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_a_d_d___v_e_r_t_e_x │ │ │ │ +SmartVertexHandle add_vertex(const Point _p) │ │ │ │ +Alias for new_vertex(const Point&). │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:238 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_H_a_l_f_e_d_g_e_H_a_n_d_l_e │ │ │ │ +Kernel::HalfedgeHandle HalfedgeHandle │ │ │ │ +Scalar type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:137 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_F_a_c_e_H_a_l_f_e_d_g_e_I_t_e_r │ │ │ │ +Kernel::FaceHalfedgeIter FaceHalfedgeIter │ │ │ │ +Circulator. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:168 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_P_o_i_n_t │ │ │ │ +Kernel::Point Point │ │ │ │ +Coordinate type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:112 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h_T_:_:_C_o_l_o_r │ │ │ │ +Kernel::Color Color │ │ │ │ +Color type. │ │ │ │ +DDeeffiinniittiioonn PolyMeshT.hh:116 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_A_t_t_r_i_b_u_t_e_s_:_:_S_t_a_t_u_s_I_n_f_o │ │ │ │ +Add status information to a base class. │ │ │ │ +DDeeffiinniittiioonn Status.hh:95 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_M_P_r_o_p_H_a_n_d_l_e_T │ │ │ │ +Handle representing a mesh property. │ │ │ │ +DDeeffiinniittiioonn Property.hh:477 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00794_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/System/compiler.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/MeshIO.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
compiler.hh
│ │ │ +
MeshIO.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -139,137 +139,160 @@ │ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │
42
│ │ │
43
│ │ │
44
│ │ │ -
45#ifndef OPENMESH_COMPILER_H
│ │ │ -
46#define OPENMESH_COMPILER_H
│ │ │ +
45#ifndef OM_MESHIO_HH
│ │ │ +
46#define OM_MESHIO_HH
│ │ │
47
│ │ │ -
48//=============================================================================
│ │ │ -
49
│ │ │ -
50#if defined(_DEBUG) || defined(DEBUG)
│ │ │ -
51# define OM_DEBUG
│ │ │ -
52#endif
│ │ │ +
48
│ │ │ +
49//=== INCLUDES ================================================================
│ │ │ +
50
│ │ │ +
51// -------------------- system settings
│ │ │ +
52#include <OpenMesh/Core/System/config.h>
│ │ │
53
│ │ │ -
54//=============================================================================
│ │ │ -
55
│ │ │ -
56// Workaround for Intel Compiler with MS VC++ 6
│ │ │ -
57#if defined(_MSC_VER) && \
│ │ │ -
58 ( defined(__ICL) || defined(__INTEL_COMPILER) || defined(__ICC) )
│ │ │ -
59# if !defined(__INTEL_COMPILER)
│ │ │ -
60# define __INTEL_COMPILER __ICL
│ │ │ -
61# endif
│ │ │ -
62# define OM_USE_INTEL_COMPILER 1
│ │ │ -
63#endif
│ │ │ -
64
│ │ │ -
65// --------------------------------------------------------- MS Visual C++ ----
│ │ │ -
66// Compiler _MSC_VER
│ │ │ -
67// .NET 2002 1300
│ │ │ -
68// .NET 2003 1310
│ │ │ -
69// .NET 2005 1400
│ │ │ -
70#if defined(_MSC_VER) && !defined(OM_USE_INTEL_COMPILER)
│ │ │ -
71# if (_MSC_VER == 1300)
│ │ │ -
72# define OM_CC_MSVC
│ │ │ -
73# define OM_TYPENAME
│ │ │ -
74# define OM_OUT_OF_CLASS_TEMPLATE 0
│ │ │ -
75# define OM_PARTIAL_SPECIALIZATION 0
│ │ │ -
76# define OM_INCLUDE_TEMPLATES 1
│ │ │ -
77# elif (_MSC_VER == 1310)
│ │ │ -
78# define OM_CC_MSVC
│ │ │ -
79# define OM_TYPENAME
│ │ │ -
80# define OM_OUT_OF_CLASS_TEMPLATE 1
│ │ │ -
81# define OM_PARTIAL_SPECIALIZATION 1
│ │ │ -
82# define OM_INCLUDE_TEMPLATES 1
│ │ │ -
83# elif (_MSC_VER >= 1400) // settings for .NET 2005 (NOTE: not fully tested)
│ │ │ -
84# define OM_TYPENAME
│ │ │ -
85# define OM_OUT_OF_CLASS_TEMPLATE 1
│ │ │ -
86# define OM_PARTIAL_SPECIALIZATION 1
│ │ │ -
87# define OM_INCLUDE_TEMPLATES 1
│ │ │ -
88# else
│ │ │ -
89# error "Version 7 (.NET 2002) or higher of the MS VC++ is required!"
│ │ │ -
90# endif
│ │ │ -
91// currently no windows dll supported
│ │ │ -
92# define OM_STATIC_BUILD 1
│ │ │ -
93# if defined(_MT)
│ │ │ -
94# define OM_REENTRANT 1
│ │ │ -
95# endif
│ │ │ -
96# define OM_CC "MSVC++"
│ │ │ -
97# define OM_CC_VERSION _MSC_VER
│ │ │ -
98// Does not work stable because the define _CPPRTTI sometimes does not exist,
│ │ │ -
99// though the option /GR is set!?
│ │ │ -
100# if defined(__cplusplus) && !defined(_CPPRTTI)
│ │ │ -
101# error "Enable Runtime Type Information (Compiler Option /GR)!"
│ │ │ -
102# endif
│ │ │ -
103# if !defined(_USE_MATH_DEFINES)
│ │ │ -
104# error "You have to define _USE_MATH_DEFINES in the compiler settings!"
│ │ │ -
105# endif
│ │ │ -
106// ------------------------------------------------------------- Borland C ----
│ │ │ -
107#elif defined(__BORLANDC__)
│ │ │ -
108# error "Borland Compiler are not supported yet!"
│ │ │ -
109// ------------------------------------------------------------- GNU C/C++ ----
│ │ │ -
110#elif defined(__GNUC__) && !defined(__ICC)
│ │ │ -
111# define OM_CC_GCC
│ │ │ -
112# define OM_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 )
│ │ │ -
113# define OM_GCC_MAJOR __GNUC__
│ │ │ -
114# define OM_GCC_MINOR __GNUC_MINOR__
│ │ │ -
115# if (OM_GCC_VERSION >= 30200)
│ │ │ -
116# define OM_TYPENAME typename
│ │ │ -
117# define OM_OUT_OF_CLASS_TEMPLATE 1
│ │ │ -
118# define OM_PARTIAL_SPECIALIZATION 1
│ │ │ -
119# define OM_INCLUDE_TEMPLATES 1
│ │ │ -
120# else
│ │ │ -
121# error "Version 3.2.0 or better of the GNU Compiler is required!"
│ │ │ -
122# endif
│ │ │ -
123# if defined(_REENTRANT)
│ │ │ -
124# define OM_REENTRANT 1
│ │ │ -
125# endif
│ │ │ -
126# define OM_CC "GCC"
│ │ │ -
127# define OM_CC_VERSION OM_GCC_VERSION
│ │ │ -
128// ------------------------------------------------------------- Intel icc ----
│ │ │ -
129#elif defined(__ICC) || defined(__INTEL_COMPILER)
│ │ │ -
130# define OM_CC_ICC
│ │ │ -
131# define OM_TYPENAME typename
│ │ │ -
132# define OM_OUT_OF_CLASS_TEMPLATE 1
│ │ │ -
133# define OM_PARTIAL_SPECIALIZATION 1
│ │ │ -
134# define OM_INCLUDE_TEMPLATES 1
│ │ │ -
135# if defined(_REENTRANT) || defined(_MT)
│ │ │ -
136# define OM_REENTRANT 1
│ │ │ -
137# endif
│ │ │ -
138# define OM_CC "ICC"
│ │ │ -
139# define OM_CC_VERSION __INTEL_COMPILER
│ │ │ -
140// currently no windows dll supported
│ │ │ -
141# if defined(_MSC_VER) || defined(WIN32)
│ │ │ -
142# define OM_STATIC_BUILD 1
│ │ │ -
143# endif
│ │ │ -
144// ------------------------------------------------------ MIPSpro Compiler ----
│ │ │ -
145#elif defined(__MIPS_ISA) || defined(__mips)
│ │ │ -
146// _MIPS_ISA
│ │ │ -
147// _COMPILER_VERSION e.g. 730, 7 major, 3 minor
│ │ │ -
148// _MIPS_FPSET 32|64
│ │ │ -
149// _MIPS_SZINT 32|64
│ │ │ -
150// _MIPS_SZLONG 32|64
│ │ │ -
151// _MIPS_SZPTR 32|64
│ │ │ -
152# define OM_CC_MIPS
│ │ │ -
153# define OM_TYPENAME typename
│ │ │ -
154# define OM_OUT_OF_CLASS_TEMPLATE 1
│ │ │ -
155# define OM_PARTIAL_SPECIALIZATION 1
│ │ │ -
156# define OM_INCLUDE_TEMPLATES 0
│ │ │ -
157# define OM_CC "MIPS"
│ │ │ -
158# define OM_CC_VERSION _COMPILER_VERSION
│ │ │ -
159// ------------------------------------------------------------------ ???? ----
│ │ │ -
160#else
│ │ │ -
161# error "You're using an unsupported compiler!"
│ │ │ -
162#endif
│ │ │ -
163
│ │ │ -
164//=============================================================================
│ │ │ -
165#endif // OPENMESH_COMPILER_H defined
│ │ │ -
166//=============================================================================
│ │ │ +
54// -------------------- OpenMesh
│ │ │ +
55#include <OpenMesh/Core/IO/SR_store.hh>
│ │ │ +
56#include <OpenMesh/Core/IO/IOManager.hh>
│ │ │ +
57#include <OpenMesh/Core/IO/importer/ImporterT.hh>
│ │ │ +
58#include <OpenMesh/Core/IO/exporter/ExporterT.hh>
│ │ │ +
59
│ │ │ +
60
│ │ │ +
61//== NAMESPACES ==============================================================
│ │ │ +
62
│ │ │ +
63namespace OpenMesh {
│ │ │ +
64namespace IO {
│ │ │ +
65
│ │ │ +
66
│ │ │ +
67//=== IMPLEMENTATION ==========================================================
│ │ │ +
68
│ │ │ +
69
│ │ │ +
75
│ │ │ +
76
│ │ │ +
77//-----------------------------------------------------------------------------
│ │ │ +
78
│ │ │ +
79
│ │ │ +
93template <class Mesh>
│ │ │ +
94bool
│ │ │ +
│ │ │ + │ │ │ +
96 const std::string& _filename)
│ │ │ +
97{
│ │ │ +
98 Options opt;
│ │ │ +
99 return read_mesh(_mesh, _filename, opt, true);
│ │ │ +
100}
│ │ │ +
│ │ │ +
101
│ │ │ +
102
│ │ │ +
123template <class Mesh>
│ │ │ +
124bool
│ │ │ +
│ │ │ + │ │ │ +
126 const std::string& _filename,
│ │ │ +
127 Options& _opt,
│ │ │ +
128 bool _clear = true)
│ │ │ +
129{
│ │ │ +
130 if (_clear) _mesh.clear();
│ │ │ +
131 ImporterT<Mesh> importer(_mesh);
│ │ │ +
132 return IOManager().read(_filename, importer, _opt);
│ │ │ +
133}
│ │ │ +
│ │ │ +
134
│ │ │ +
135
│ │ │ +
155template <class Mesh>
│ │ │ +
156bool
│ │ │ +
│ │ │ + │ │ │ +
158 std::istream& _is,
│ │ │ +
159 const std::string& _ext,
│ │ │ +
160 Options& _opt,
│ │ │ +
161 bool _clear = true)
│ │ │ +
162{
│ │ │ +
163 if (_clear) _mesh.clear();
│ │ │ +
164 ImporterT<Mesh> importer(_mesh);
│ │ │ +
165 return IOManager().read(_is,_ext, importer, _opt);
│ │ │ +
166}
│ │ │ +
│ │ │
167
│ │ │ +
168
│ │ │ +
169
│ │ │ +
170//-----------------------------------------------------------------------------
│ │ │ +
171
│ │ │ +
172
│ │ │ +
189template <class Mesh>
│ │ │ +
│ │ │ +
190bool write_mesh(const Mesh& _mesh,
│ │ │ +
191 const std::string& _filename,
│ │ │ + │ │ │ +
193 std::streamsize _precision = 6)
│ │ │ +
194{
│ │ │ +
195 ExporterT<Mesh> exporter(_mesh);
│ │ │ +
196 return IOManager().write(_filename, exporter, _opt, _precision);
│ │ │ +
197}
│ │ │ +
│ │ │ +
198
│ │ │ +
199
│ │ │ +
200//-----------------------------------------------------------------------------
│ │ │ +
201
│ │ │ +
202
│ │ │ +
221template <class Mesh>
│ │ │ +
│ │ │ +
222bool write_mesh(const Mesh& _mesh,
│ │ │ +
223 std::ostream& _os,
│ │ │ +
224 const std::string& _ext,
│ │ │ + │ │ │ +
226 std::streamsize _precision = 6)
│ │ │ +
227{
│ │ │ +
228 ExporterT<Mesh> exporter(_mesh);
│ │ │ +
229 return IOManager().write(_os,_ext, exporter, _opt, _precision);
│ │ │ +
230}
│ │ │ +
│ │ │ +
231
│ │ │ +
232
│ │ │ +
233//-----------------------------------------------------------------------------
│ │ │ +
234
│ │ │ +
250template <class Mesh>
│ │ │ +
│ │ │ +
251size_t binary_size(const Mesh& _mesh,
│ │ │ +
252 const std::string& _ext,
│ │ │ + │ │ │ +
254{
│ │ │ +
255 ExporterT<Mesh> exporter(_mesh);
│ │ │ +
256 return IOManager().binary_size(_ext, exporter, _opt);
│ │ │ +
257}
│ │ │ +
│ │ │ +
258
│ │ │ +
259
│ │ │ +
260//-----------------------------------------------------------------------------
│ │ │ +
261
│ │ │ +
263
│ │ │ +
264
│ │ │ +
265//=============================================================================
│ │ │ +
266} // namespace IO
│ │ │ +
267} // namespace OpenMesh
│ │ │ +
268//=============================================================================
│ │ │ +
269#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN)
│ │ │ +
270# include <OpenMesh/Core/IO/IOInstances.hh>
│ │ │ +
271#endif
│ │ │ +
272//=============================================================================
│ │ │ +
273#endif
│ │ │ +
274//=============================================================================
│ │ │ +
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:59
│ │ │ +
size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options _opt=Options::Default)
Get binary size of data.
Definition MeshIO.hh:251
│ │ │ +
bool write_mesh(const Mesh &_mesh, const std::string &_filename, Options _opt=Options::Default, std::streamsize _precision=6)
Write a mesh to the file _filename.
Definition MeshIO.hh:190
│ │ │ +
bool read_mesh(Mesh &_mesh, const std::string &_filename)
Read a mesh from file _filename.
Definition MeshIO.hh:95
│ │ │ +
This class template provides an exporter module for OpenMesh meshes.
Definition ExporterT.hh:85
│ │ │ +
This class template provides an importer module for OpenMesh meshes.
Definition ImporterT.hh:81
│ │ │ +
bool write(const std::string &_filename, BaseExporter &_be, Options _opt=Options::Default, std::streamsize _precision=6)
Write a mesh to file _filename.
Definition IOManager.cc:143
│ │ │ +
bool read(const std::string &_filename, BaseImporter &_bi, Options &_opt)
Read a mesh from file _filename.
Definition IOManager.cc:87
│ │ │ +
Set options for reader/writer modules.
Definition Options.hh:92
│ │ │ +
@ Default
By default write persistent custom properties.
Definition Options.hh:117
│ │ │ +
Polygonal mesh based on the ArrayKernel.
Definition PolyMesh_ArrayKernelT.hh:96
│ │ │
│ │ │ │ │ │
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,12 +1,12 @@ │ │ │ │ [Logo] OpenMesh │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ -compiler.hh │ │ │ │ +MeshIO.hh │ │ │ │ 1/* ========================================================================= * │ │ │ │ 2 * * │ │ │ │ 3 * OpenMesh * │ │ │ │ 4 * Copyright (c) 2001-2025, RWTH-Aachen University * │ │ │ │ 5 * Department of Computer Graphics and Multimedia * │ │ │ │ 6 * All rights reserved. * │ │ │ │ 7 * www.openmesh.org * │ │ │ │ @@ -48,143 +48,188 @@ │ │ │ │ 39 * * │ │ │ │ 40 * ========================================================================= │ │ │ │ */ │ │ │ │ 41 │ │ │ │ 42 │ │ │ │ 43 │ │ │ │ 44 │ │ │ │ -45#ifndef OPENMESH_COMPILER_H │ │ │ │ -46#define OPENMESH_COMPILER_H │ │ │ │ +45#ifndef OM_MESHIO_HH │ │ │ │ +46#define OM_MESHIO_HH │ │ │ │ 47 │ │ │ │ -48// │ │ │ │ -============================================================================= │ │ │ │ -49 │ │ │ │ -50#if defined(_DEBUG) || defined(DEBUG) │ │ │ │ -51# define OM_DEBUG │ │ │ │ -52#endif │ │ │ │ +48 │ │ │ │ +49//=== INCLUDES │ │ │ │ +================================================================ │ │ │ │ +50 │ │ │ │ +51// -------------------- system settings │ │ │ │ +52#include │ │ │ │ 53 │ │ │ │ -54// │ │ │ │ -============================================================================= │ │ │ │ -55 │ │ │ │ -56// Workaround for Intel Compiler with MS VC++ 6 │ │ │ │ -57#if defined(_MSC_VER) && \ │ │ │ │ -58 ( defined(__ICL) || defined(__INTEL_COMPILER) || defined(__ICC) ) │ │ │ │ -59# if !defined(__INTEL_COMPILER) │ │ │ │ -60# define __INTEL_COMPILER __ICL │ │ │ │ -61# endif │ │ │ │ -62# define OM_USE_INTEL_COMPILER 1 │ │ │ │ -63#endif │ │ │ │ -64 │ │ │ │ -65// --------------------------------------------------------- MS Visual C++ -- │ │ │ │ +54// -------------------- OpenMesh │ │ │ │ +55#include │ │ │ │ +56#include │ │ │ │ +57#include │ │ │ │ +58#include │ │ │ │ +59 │ │ │ │ +60 │ │ │ │ +61//== NAMESPACES │ │ │ │ +============================================================== │ │ │ │ +62 │ │ │ │ +63namespace _O_p_e_n_M_e_s_h { │ │ │ │ +64namespace IO { │ │ │ │ +65 │ │ │ │ +66 │ │ │ │ +67//=== IMPLEMENTATION │ │ │ │ +========================================================== │ │ │ │ +68 │ │ │ │ +69 │ │ │ │ +75 │ │ │ │ +76 │ │ │ │ +77//--------------------------------------------------------------------------- │ │ │ │ -- │ │ │ │ -66// Compiler _MSC_VER │ │ │ │ -67// .NET 2002 1300 │ │ │ │ -68// .NET 2003 1310 │ │ │ │ -69// .NET 2005 1400 │ │ │ │ -70#if defined(_MSC_VER) && !defined(OM_USE_INTEL_COMPILER) │ │ │ │ -71# if (_MSC_VER == 1300) │ │ │ │ -72# define OM_CC_MSVC │ │ │ │ -73# define OM_TYPENAME │ │ │ │ -74# define OM_OUT_OF_CLASS_TEMPLATE 0 │ │ │ │ -75# define OM_PARTIAL_SPECIALIZATION 0 │ │ │ │ -76# define OM_INCLUDE_TEMPLATES 1 │ │ │ │ -77# elif (_MSC_VER == 1310) │ │ │ │ -78# define OM_CC_MSVC │ │ │ │ -79# define OM_TYPENAME │ │ │ │ -80# define OM_OUT_OF_CLASS_TEMPLATE 1 │ │ │ │ -81# define OM_PARTIAL_SPECIALIZATION 1 │ │ │ │ -82# define OM_INCLUDE_TEMPLATES 1 │ │ │ │ -83# elif (_MSC_VER >= 1400) // settings for .NET 2005 (NOTE: not fully tested) │ │ │ │ -84# define OM_TYPENAME │ │ │ │ -85# define OM_OUT_OF_CLASS_TEMPLATE 1 │ │ │ │ -86# define OM_PARTIAL_SPECIALIZATION 1 │ │ │ │ -87# define OM_INCLUDE_TEMPLATES 1 │ │ │ │ -88# else │ │ │ │ -89# error "Version 7 (.NET 2002) or higher of the MS VC++ is required!" │ │ │ │ -90# endif │ │ │ │ -91// currently no windows dll supported │ │ │ │ -92# define OM_STATIC_BUILD 1 │ │ │ │ -93# if defined(_MT) │ │ │ │ -94# define OM_REENTRANT 1 │ │ │ │ -95# endif │ │ │ │ -96# define OM_CC "MSVC++" │ │ │ │ -97# define OM_CC_VERSION _MSC_VER │ │ │ │ -98// Does not work stable because the define _CPPRTTI sometimes does not exist, │ │ │ │ -99// though the option /GR is set!? │ │ │ │ -100# if defined(__cplusplus) && !defined(_CPPRTTI) │ │ │ │ -101# error "Enable Runtime Type Information (Compiler Option /GR)!" │ │ │ │ -102# endif │ │ │ │ -103# if !defined(_USE_MATH_DEFINES) │ │ │ │ -104# error "You have to define _USE_MATH_DEFINES in the compiler settings!" │ │ │ │ -105# endif │ │ │ │ -106// ------------------------------------------------------------- Borland C - │ │ │ │ ---- │ │ │ │ -107#elif defined(__BORLANDC__) │ │ │ │ -108# error "Borland Compiler are not supported yet!" │ │ │ │ -109// ------------------------------------------------------------- GNU C/C++ - │ │ │ │ +78 │ │ │ │ +79 │ │ │ │ +93template │ │ │ │ +94bool │ │ │ │ +_9_5_r_e_a_d___m_e_s_h(_M_e_s_h& _mesh, │ │ │ │ +96 const std::string& _filename) │ │ │ │ +97{ │ │ │ │ +98 _O_p_t_i_o_n_s opt; │ │ │ │ +99 return _r_e_a_d___m_e_s_h(_mesh, _filename, opt, true); │ │ │ │ +100} │ │ │ │ +101 │ │ │ │ +102 │ │ │ │ +123template │ │ │ │ +124bool │ │ │ │ +_1_2_5_r_e_a_d___m_e_s_h(_M_e_s_h& _mesh, │ │ │ │ +126 const std::string& _filename, │ │ │ │ +127 _O_p_t_i_o_n_s& _opt, │ │ │ │ +128 bool _clear = true) │ │ │ │ +129{ │ │ │ │ +130 if (_clear) _mesh.clear(); │ │ │ │ +131 _I_m_p_o_r_t_e_r_T_<_M_e_s_h_> importer(_mesh); │ │ │ │ +132 return IOManager()._r_e_a_d(_filename, importer, _opt); │ │ │ │ +133} │ │ │ │ +134 │ │ │ │ +135 │ │ │ │ +155template │ │ │ │ +156bool │ │ │ │ +_1_5_7_r_e_a_d___m_e_s_h(_M_e_s_h& _mesh, │ │ │ │ +158 std::istream& _is, │ │ │ │ +159 const std::string& _ext, │ │ │ │ +160 _O_p_t_i_o_n_s& _opt, │ │ │ │ +161 bool _clear = true) │ │ │ │ +162{ │ │ │ │ +163 if (_clear) _mesh.clear(); │ │ │ │ +164 _I_m_p_o_r_t_e_r_T_<_M_e_s_h_> importer(_mesh); │ │ │ │ +165 return IOManager()._r_e_a_d(_is,_ext, importer, _opt); │ │ │ │ +166} │ │ │ │ +167 │ │ │ │ +168 │ │ │ │ +169 │ │ │ │ +170//-------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -110#elif defined(__GNUC__) && !defined(__ICC) │ │ │ │ -111# define OM_CC_GCC │ │ │ │ -112# define OM_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 ) │ │ │ │ -113# define OM_GCC_MAJOR __GNUC__ │ │ │ │ -114# define OM_GCC_MINOR __GNUC_MINOR__ │ │ │ │ -115# if (OM_GCC_VERSION >= 30200) │ │ │ │ -116# define OM_TYPENAME typename │ │ │ │ -117# define OM_OUT_OF_CLASS_TEMPLATE 1 │ │ │ │ -118# define OM_PARTIAL_SPECIALIZATION 1 │ │ │ │ -119# define OM_INCLUDE_TEMPLATES 1 │ │ │ │ -120# else │ │ │ │ -121# error "Version 3.2.0 or better of the GNU Compiler is required!" │ │ │ │ -122# endif │ │ │ │ -123# if defined(_REENTRANT) │ │ │ │ -124# define OM_REENTRANT 1 │ │ │ │ -125# endif │ │ │ │ -126# define OM_CC "GCC" │ │ │ │ -127# define OM_CC_VERSION OM_GCC_VERSION │ │ │ │ -128// ------------------------------------------------------------- Intel icc - │ │ │ │ +171 │ │ │ │ +172 │ │ │ │ +189template │ │ │ │ +_1_9_0bool _w_r_i_t_e___m_e_s_h(const _M_e_s_h& _mesh, │ │ │ │ +191 const std::string& _filename, │ │ │ │ +192 _O_p_t_i_o_n_s _opt = _O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t, │ │ │ │ +193 std::streamsize _precision = 6) │ │ │ │ +194{ │ │ │ │ +195 _E_x_p_o_r_t_e_r_T_<_M_e_s_h_> exporter(_mesh); │ │ │ │ +196 return IOManager()._w_r_i_t_e(_filename, exporter, _opt, _precision); │ │ │ │ +197} │ │ │ │ +198 │ │ │ │ +199 │ │ │ │ +200//-------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -129#elif defined(__ICC) || defined(__INTEL_COMPILER) │ │ │ │ -130# define OM_CC_ICC │ │ │ │ -131# define OM_TYPENAME typename │ │ │ │ -132# define OM_OUT_OF_CLASS_TEMPLATE 1 │ │ │ │ -133# define OM_PARTIAL_SPECIALIZATION 1 │ │ │ │ -134# define OM_INCLUDE_TEMPLATES 1 │ │ │ │ -135# if defined(_REENTRANT) || defined(_MT) │ │ │ │ -136# define OM_REENTRANT 1 │ │ │ │ -137# endif │ │ │ │ -138# define OM_CC "ICC" │ │ │ │ -139# define OM_CC_VERSION __INTEL_COMPILER │ │ │ │ -140// currently no windows dll supported │ │ │ │ -141# if defined(_MSC_VER) || defined(WIN32) │ │ │ │ -142# define OM_STATIC_BUILD 1 │ │ │ │ -143# endif │ │ │ │ -144// ------------------------------------------------------ MIPSpro Compiler - │ │ │ │ +201 │ │ │ │ +202 │ │ │ │ +221template │ │ │ │ +_2_2_2bool _w_r_i_t_e___m_e_s_h(const _M_e_s_h& _mesh, │ │ │ │ +223 std::ostream& _os, │ │ │ │ +224 const std::string& _ext, │ │ │ │ +225 _O_p_t_i_o_n_s _opt = _O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t, │ │ │ │ +226 std::streamsize _precision = 6) │ │ │ │ +227{ │ │ │ │ +228 _E_x_p_o_r_t_e_r_T_<_M_e_s_h_> exporter(_mesh); │ │ │ │ +229 return IOManager()._w_r_i_t_e(_os,_ext, exporter, _opt, _precision); │ │ │ │ +230} │ │ │ │ +231 │ │ │ │ +232 │ │ │ │ +233//-------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -145#elif defined(__MIPS_ISA) || defined(__mips) │ │ │ │ -146// _MIPS_ISA │ │ │ │ -147// _COMPILER_VERSION e.g. 730, 7 major, 3 minor │ │ │ │ -148// _MIPS_FPSET 32|64 │ │ │ │ -149// _MIPS_SZINT 32|64 │ │ │ │ -150// _MIPS_SZLONG 32|64 │ │ │ │ -151// _MIPS_SZPTR 32|64 │ │ │ │ -152# define OM_CC_MIPS │ │ │ │ -153# define OM_TYPENAME typename │ │ │ │ -154# define OM_OUT_OF_CLASS_TEMPLATE 1 │ │ │ │ -155# define OM_PARTIAL_SPECIALIZATION 1 │ │ │ │ -156# define OM_INCLUDE_TEMPLATES 0 │ │ │ │ -157# define OM_CC "MIPS" │ │ │ │ -158# define OM_CC_VERSION _COMPILER_VERSION │ │ │ │ -159// ------------------------------------------------------------------ ???? - │ │ │ │ +234 │ │ │ │ +250template │ │ │ │ +_2_5_1size_t _b_i_n_a_r_y___s_i_z_e(const _M_e_s_h& _mesh, │ │ │ │ +252 const std::string& _ext, │ │ │ │ +253 _O_p_t_i_o_n_s _opt = _O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t) │ │ │ │ +254{ │ │ │ │ +255 _E_x_p_o_r_t_e_r_T_<_M_e_s_h_> exporter(_mesh); │ │ │ │ +256 return IOManager().binary_size(_ext, exporter, _opt); │ │ │ │ +257} │ │ │ │ +258 │ │ │ │ +259 │ │ │ │ +260//-------------------------------------------------------------------------- │ │ │ │ --- │ │ │ │ -160#else │ │ │ │ -161# error "You're using an unsupported compiler!" │ │ │ │ -162#endif │ │ │ │ -163 │ │ │ │ -164// │ │ │ │ +261 │ │ │ │ +263 │ │ │ │ +264 │ │ │ │ +265// │ │ │ │ ============================================================================= │ │ │ │ -165#endif // OPENMESH_COMPILER_H defined │ │ │ │ -166// │ │ │ │ +266} // namespace IO │ │ │ │ +267} // namespace OpenMesh │ │ │ │ +268// │ │ │ │ ============================================================================= │ │ │ │ -167 │ │ │ │ +269#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN) │ │ │ │ +270# include │ │ │ │ +271#endif │ │ │ │ +272// │ │ │ │ +============================================================================= │ │ │ │ +273#endif │ │ │ │ +274// │ │ │ │ +============================================================================= │ │ │ │ +_O_p_e_n_M_e_s_h │ │ │ │ +Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, │ │ │ │ +different mesh kernels ... │ │ │ │ +DDeeffiinniittiioonn MeshItems.hh:59 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_b_i_n_a_r_y___s_i_z_e │ │ │ │ +size_t binary_size(const Mesh &_mesh, const std::string &_ext, Options │ │ │ │ +_opt=Options::Default) │ │ │ │ +Get binary size of data. │ │ │ │ +DDeeffiinniittiioonn MeshIO.hh:251 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_w_r_i_t_e___m_e_s_h │ │ │ │ +bool write_mesh(const Mesh &_mesh, const std::string &_filename, Options │ │ │ │ +_opt=Options::Default, std::streamsize _precision=6) │ │ │ │ +Write a mesh to the file _filename. │ │ │ │ +DDeeffiinniittiioonn MeshIO.hh:190 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_r_e_a_d___m_e_s_h │ │ │ │ +bool read_mesh(Mesh &_mesh, const std::string &_filename) │ │ │ │ +Read a mesh from file _filename. │ │ │ │ +DDeeffiinniittiioonn MeshIO.hh:95 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_E_x_p_o_r_t_e_r_T │ │ │ │ +This class template provides an exporter module for OpenMesh meshes. │ │ │ │ +DDeeffiinniittiioonn ExporterT.hh:85 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_I_m_p_o_r_t_e_r_T │ │ │ │ +This class template provides an importer module for OpenMesh meshes. │ │ │ │ +DDeeffiinniittiioonn ImporterT.hh:81 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_w_r_i_t_e │ │ │ │ +bool write(const std::string &_filename, BaseExporter &_be, Options │ │ │ │ +_opt=Options::Default, std::streamsize _precision=6) │ │ │ │ +Write a mesh to file _filename. │ │ │ │ +DDeeffiinniittiioonn IOManager.cc:143 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:___I_O_M_a_n_a_g_e_r___:_:_r_e_a_d │ │ │ │ +bool read(const std::string &_filename, BaseImporter &_bi, Options &_opt) │ │ │ │ +Read a mesh from file _filename. │ │ │ │ +DDeeffiinniittiioonn IOManager.cc:87 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s │ │ │ │ +Set options for reader/writer modules. │ │ │ │ +DDeeffiinniittiioonn Options.hh:92 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_I_O_:_:_O_p_t_i_o_n_s_:_:_D_e_f_a_u_l_t │ │ │ │ +@ Default │ │ │ │ +By default write persistent custom properties. │ │ │ │ +DDeeffiinniittiioonn Options.hh:117 │ │ │ │ +_O_p_e_n_M_e_s_h_:_:_P_o_l_y_M_e_s_h___A_r_r_a_y_K_e_r_n_e_l_T │ │ │ │ +Polygonal mesh based on the ArrayKernel. │ │ │ │ +DDeeffiinniittiioonn PolyMesh_ArrayKernelT.hh:96 │ │ │ │ =============================================================================== │ │ │ │ Project OOppeennMMeesshh, ©  Visual Computing Institute, RWTH Aachen. │ │ │ │ Documentation generated using _dd_oo_xx_yy_gg_ee_nn_ . │ │ ├── ./usr/share/doc/libopenmesh-dev/html/a00797_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -OpenMesh: OpenMesh/Core/System/OpenMeshDLLMacros.hh Source File │ │ │ +OpenMesh: OpenMesh/Core/IO/IOInstances.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │
No Matches
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
OpenMeshDLLMacros.hh
│ │ │ +
IOInstances.hh
│ │ │
│ │ │
│ │ │
1/* ========================================================================= *
│ │ │
2 * *
│ │ │
3 * OpenMesh *
│ │ │
4 * Copyright (c) 2001-2025, RWTH-Aachen University *
│ │ │
5 * Department of Computer Graphics and Multimedia *
│ │ │ @@ -136,38 +136,86 @@ │ │ │
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
│ │ │
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
│ │ │
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
│ │ │
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
│ │ │
39 * *
│ │ │
40 * ========================================================================= */
│ │ │
41
│ │ │ -
42// Disable the warnings about needs to have DLL interface as we have tons of vector templates
│ │ │ -
43#ifdef _MSC_VER
│ │ │ -
44 #pragma warning( disable: 4251 )
│ │ │ -
45#endif
│ │ │ -
46
│ │ │ -
47#ifndef OPENMESHDLLEXPORT
│ │ │ -
48 #ifdef WIN32
│ │ │ -
49 #ifdef OPENMESHDLL
│ │ │ -
50 #ifdef BUILDOPENMESHDLL
│ │ │ -
51 #define OPENMESHDLLEXPORT __declspec(dllexport)
│ │ │ -
52 #define OPENMESHDLLEXPORTONLY __declspec(dllexport)
│ │ │ -
53 #else
│ │ │ -
54 #define OPENMESHDLLEXPORT __declspec(dllimport)
│ │ │ -
55 #define OPENMESHDLLEXPORTONLY
│ │ │ -
56 #endif
│ │ │ -
57 #else
│ │ │ -
58 #define OPENMESHDLLEXPORT
│ │ │ -
59 #define OPENMESHDLLEXPORTONLY
│ │ │ -
60 #endif
│ │ │ -
61 #else
│ │ │ -
62 #define OPENMESHDLLEXPORT
│ │ │ -
63 #define OPENMESHDLLEXPORTONLY
│ │ │ -
64 #endif
│ │ │ -
65#endif
│ │ │ +
42
│ │ │ +
43
│ │ │ +
44
│ │ │ +
45//=============================================================================
│ │ │ +
46//
│ │ │ +
47// Helper file for static builds
│ │ │ +
48//
│ │ │ +
49// In opposite to dynamic builds where the instance of every reader module
│ │ │ +
50// is generated within the OpenMesh library, static builds only instanciate
│ │ │ +
51// objects that are at least referenced once. As all reader modules are
│ │ │ +
52// never used directly, they will not be part of a static build, hence
│ │ │ +
53// this file.
│ │ │ +
54//
│ │ │ +
55//=============================================================================
│ │ │ +
56
│ │ │ +
57
│ │ │ +
58#ifndef __IOINSTANCES_HH__
│ │ │ +
59#define __IOINSTANCES_HH__
│ │ │ +
60
│ │ │ +
61#if defined(OM_STATIC_BUILD) || defined(ARCH_DARWIN)
│ │ │ +
62
│ │ │ +
63//=============================================================================
│ │ │ +
64
│ │ │ +
65#include <OpenMesh/Core/System/config.h>
│ │ │ +
66
│ │ │ +
67#include <OpenMesh/Core/IO/reader/BaseReader.hh>
│ │ │ +
68#include <OpenMesh/Core/IO/reader/OBJReader.hh>
│ │ │ +
69#include <OpenMesh/Core/IO/reader/OFFReader.hh>
│ │ │ +
70#include <OpenMesh/Core/IO/reader/PLYReader.hh>
│ │ │ +
71#include <OpenMesh/Core/IO/reader/STLReader.hh>
│ │ │ +
72#include <OpenMesh/Core/IO/reader/OMReader.hh>
│ │ │ +
73
│ │ │ +
74#include <OpenMesh/Core/IO/writer/BaseWriter.hh>
│ │ │ +
75#include <OpenMesh/Core/IO/writer/OBJWriter.hh>
│ │ │ +
76#include <OpenMesh/Core/IO/writer/OFFWriter.hh>
│ │ │ +
77#include <OpenMesh/Core/IO/writer/STLWriter.hh>
│ │ │ +
78#include <OpenMesh/Core/IO/writer/OMWriter.hh>
│ │ │ +
79#include <OpenMesh/Core/IO/writer/PLYWriter.hh>
│ │ │ +
80#include <OpenMesh/Core/IO/writer/VTKWriter.hh>
│ │ │ +
81
│ │ │ +
82//=== NAMESPACES ==============================================================
│ │ │ +
83
│ │ │ +
84namespace OpenMesh {
│ │ │ +
85namespace IO {
│ │ │ +
86
│ │ │ +
87//=============================================================================
│ │ │ +
88
│ │ │ +
89
│ │ │ +
90// Instanciate every Reader module
│ │ │ +
91static BaseReader* OFFReaderInstance = &OFFReader();
│ │ │ +
92static BaseReader* OBJReaderInstance = &OBJReader();
│ │ │ +
93static BaseReader* PLYReaderInstance = &PLYReader();
│ │ │ +
94static BaseReader* STLReaderInstance = &STLReader();
│ │ │ +
95static BaseReader* OMReaderInstance = &OMReader();
│ │ │ +
96
│ │ │ +
97// Instanciate every writer module
│ │ │ +
98static BaseWriter* OBJWriterInstance = &OBJWriter();
│ │ │ +
99static BaseWriter* OFFWriterInstance = &OFFWriter();
│ │ │ +
100static BaseWriter* STLWriterInstance = &STLWriter();
│ │ │ +
101static BaseWriter* OMWriterInstance = &OMWriter();
│ │ │ +
102static BaseWriter* PLYWriterInstance = &PLYWriter();
│ │ │ +
103static BaseWriter* VTKWriterInstance = &VTKWriter();
│ │ │ +
104
│ │ │ +
105
│ │ │ +
106//=============================================================================
│ │ │ +
107} // namespace IO
│ │ │ +
108} // namespace OpenMesh
│ │ │ +
109//=============================================================================
│ │ │ +
110#endif // static ?
│ │ │ +