0027191: Documentation - redesign of information architecture -- renaming (4)
authorabv <abv@opencascade.com>
Thu, 1 Oct 2020 11:27:14 +0000 (14:27 +0300)
committerabv <abv@opencascade.com>
Fri, 2 Oct 2020 13:18:37 +0000 (16:18 +0300)
Move documents describing BREP format, Boolean operations, and PBR math to dox/specification

459 files changed:
dox/FILES_HTML.txt
dox/FILES_PDF.txt
dox/contribution/contribution.md
dox/dev_guides/visualization/pbr_math.md [deleted file]
dox/specification/boolean_operations/boolean_operations.md [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image001.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image002.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image004.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image005.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image006.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image007.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image008.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image009.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image010.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image011.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image012.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image013.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image014.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image015.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image016.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image017.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image018.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image019.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image020.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image021.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image022.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image023.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image024.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image025.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image026.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image027.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image028.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image029.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image030.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image031.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image032.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image033.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image034.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image035.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image036.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image037.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image038.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image039.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image040.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image041.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image042.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image043.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image044.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image045.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image046.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image047.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image048.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image049.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image050.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image051.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image052.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image053.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image054.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image055.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image056.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image057.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image058.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image059.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image060.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image061.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image062.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image063.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image064.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image065.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image066.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image067.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image068.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image069.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image070.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image071.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image072.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image073.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image080.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image081.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image082.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image083.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image084.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image085.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image086.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image087.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image088.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image089.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image090.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image091.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image092.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image093.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image094.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image095.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image096.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image097.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image098.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image099.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image100.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image101.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image102.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image103.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image104.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image105.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image106.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image107.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image108.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image109.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image110.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image111.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image112.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image113.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image114.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image115.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image116.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image117.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image118.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image119.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image120.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image121.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image122.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image123.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image124.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image125.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image126.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image127.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image128.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image129.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image130.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image131.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image132.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image133.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image134.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image135.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image136.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image137.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image138.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image139.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image140.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image141.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image142.png [new file with mode: 0644]
dox/specification/boolean_operations/images/boolean_image143.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bop_simple_001.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bop_simple_002.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bsplit_image001.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bsplit_image002.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bsplit_image003.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bsplit_image004.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bsplit_image005.png [new file with mode: 0644]
dox/specification/boolean_operations/images/bsplit_image006.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_001.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_002.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_003.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_004.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_005.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_006_1.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_006_2.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_007.png [new file with mode: 0644]
dox/specification/boolean_operations/images/cells_algorithm_008.png [new file with mode: 0644]
dox/specification/boolean_operations/images/glue_options_image001.png [new file with mode: 0644]
dox/specification/boolean_operations/images/glue_options_image002.png [new file with mode: 0644]
dox/specification/boolean_operations/images/glue_options_image003.png [new file with mode: 0644]
dox/specification/boolean_operations/images/glue_options_image004.png [new file with mode: 0644]
dox/specification/boolean_operations/images/glue_options_image005.png [new file with mode: 0644]
dox/specification/boolean_operations/images/mkvolume_image001.png [new file with mode: 0644]
dox/specification/boolean_operations/images/mkvolume_image002.png [new file with mode: 0644]
dox/specification/boolean_operations/images/mkvolume_image003.png [new file with mode: 0644]
dox/specification/boolean_operations/images/mkvolume_image004.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image001.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image002.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image003.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image004.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image005.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image006.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image007.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image008.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image009.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image010.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image011.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image012.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image013.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image014.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image015.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image016.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image017.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image018.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image019.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image020.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image021.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image022.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image023.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image024.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image025.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image026.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image027.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image028.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image029.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image030.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image031.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image032.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image033.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image036.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image037.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image038.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image039a.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image039b.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image040.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image041.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image042.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image043.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image044.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image045.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image046.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image047.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image048.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image049.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image050.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image051.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image052.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image053.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image054.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image055.svg [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image060.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image061.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image062.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image063.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image064.png [new file with mode: 0644]
dox/specification/boolean_operations/images/operations_image065.png [new file with mode: 0644]
dox/specification/brep_format.md [new file with mode: 0644]
dox/specification/pbr_math.md [new file with mode: 0644]
dox/specification/specification.md [new file with mode: 0644]
dox/upgrade/upgrade.md
dox/user_guides/boolean_operations/boolean_operations.md [deleted file]
dox/user_guides/boolean_operations/images/boolean_image001.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image002.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image004.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image005.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image006.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image007.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image008.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image009.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image010.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image011.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image012.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image013.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image014.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image015.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image016.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image017.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image018.svg [deleted file]
dox/user_guides/boolean_operations/images/boolean_image019.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image020.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image021.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image022.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image023.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image024.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image025.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image026.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image027.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image028.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image029.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image030.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image031.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image032.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image033.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image034.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image035.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image036.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image037.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image038.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image039.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image040.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image041.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image042.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image043.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image044.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image045.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image046.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image047.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image048.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image049.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image050.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image051.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image052.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image053.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image054.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image055.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image056.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image057.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image058.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image059.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image060.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image061.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image062.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image063.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image064.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image065.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image066.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image067.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image068.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image069.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image070.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image071.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image072.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image073.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image080.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image081.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image082.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image083.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image084.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image085.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image086.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image087.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image088.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image089.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image090.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image091.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image092.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image093.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image094.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image095.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image096.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image097.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image098.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image099.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image100.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image101.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image102.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image103.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image104.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image105.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image106.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image107.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image108.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image109.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image110.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image111.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image112.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image113.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image114.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image115.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image116.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image117.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image118.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image119.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image120.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image121.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image122.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image123.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image124.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image125.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image126.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image127.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image128.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image129.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image130.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image131.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image132.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image133.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image134.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image135.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image136.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image137.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image138.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image139.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image140.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image141.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image142.png [deleted file]
dox/user_guides/boolean_operations/images/boolean_image143.png [deleted file]
dox/user_guides/boolean_operations/images/bop_simple_001.png [deleted file]
dox/user_guides/boolean_operations/images/bop_simple_002.png [deleted file]
dox/user_guides/boolean_operations/images/bsplit_image001.png [deleted file]
dox/user_guides/boolean_operations/images/bsplit_image002.png [deleted file]
dox/user_guides/boolean_operations/images/bsplit_image003.png [deleted file]
dox/user_guides/boolean_operations/images/bsplit_image004.png [deleted file]
dox/user_guides/boolean_operations/images/bsplit_image005.png [deleted file]
dox/user_guides/boolean_operations/images/bsplit_image006.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_001.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_002.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_003.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_004.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_005.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_006_1.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_006_2.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_007.png [deleted file]
dox/user_guides/boolean_operations/images/cells_algorithm_008.png [deleted file]
dox/user_guides/boolean_operations/images/glue_options_image001.png [deleted file]
dox/user_guides/boolean_operations/images/glue_options_image002.png [deleted file]
dox/user_guides/boolean_operations/images/glue_options_image003.png [deleted file]
dox/user_guides/boolean_operations/images/glue_options_image004.png [deleted file]
dox/user_guides/boolean_operations/images/glue_options_image005.png [deleted file]
dox/user_guides/boolean_operations/images/mkvolume_image001.png [deleted file]
dox/user_guides/boolean_operations/images/mkvolume_image002.png [deleted file]
dox/user_guides/boolean_operations/images/mkvolume_image003.png [deleted file]
dox/user_guides/boolean_operations/images/mkvolume_image004.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image001.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image002.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image003.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image004.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image005.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image006.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image007.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image008.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image009.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image010.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image011.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image012.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image013.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image014.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image015.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image016.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image017.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image018.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image019.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image020.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image021.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image022.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image023.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image024.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image025.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image026.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image027.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image028.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image029.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image030.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image031.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image032.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image033.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image036.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image037.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image038.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image039a.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image039b.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image040.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image041.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image042.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image043.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image044.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image045.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image046.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image047.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image048.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image049.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image050.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image051.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image052.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image053.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image054.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image055.svg [deleted file]
dox/user_guides/boolean_operations/images/operations_image060.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image061.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image062.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image063.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image064.png [deleted file]
dox/user_guides/boolean_operations/images/operations_image065.png [deleted file]
dox/user_guides/brep_wp/brep_wp.md [deleted file]
dox/user_guides/draw_test_harness/draw_test_harness.md
dox/user_guides/modeling_algos/modeling_algos.md
dox/user_guides/modeling_data/modeling_data.md
dox/user_guides/user_guides.md

index f824220..9208898 100644 (file)
@@ -24,7 +24,6 @@ user_guides/user_guides.md
 user_guides/foundation_classes/foundation_classes.md
 user_guides/modeling_data/modeling_data.md
 user_guides/modeling_algos/modeling_algos.md
-user_guides/boolean_operations/boolean_operations.md
 user_guides/shape_healing/shape_healing.md
 user_guides/visualization/visualization.md
 user_guides/iges/iges.md
@@ -34,9 +33,13 @@ user_guides/ocaf/ocaf.md
 user_guides/tobj/tobj.md
 user_guides/draw_test_harness/draw_test_harness.md
 user_guides/inspector/inspector.md
-user_guides/brep_wp/brep_wp.md
 user_guides/vis/vis.md
 
+specification/specification.md
+specification/boolean_operations/boolean_operations.md
+specification/brep_format.md
+specification/pbr_math.md
+
 contribution/contribution.md
 contribution/documentation/documentation.md
 contribution/coding_rules.md
@@ -45,7 +48,6 @@ contribution/git_guide/git_guide.md
 contribution/tests/tests.md
 debug/debug.md
 upgrade/upgrade.md
-dev_guides/visualization/pbr_math.md
 
 dev_guides/building/building.md
 dev_guides/building/3rdparty/3rdparty_windows.md
index 8aeb596..a26c0f7 100644 (file)
@@ -4,12 +4,12 @@
 # Empty spaces are allowed.
 # Strings starting with '#' are treated as comments and ignored.
 
-user_guides/brep_wp/brep_wp.md
+specification/brep_wp/brep_wp.md
 user_guides/foundation_classes/foundation_classes.md
 user_guides/iges/iges.md
 user_guides/modeling_data/modeling_data.md
 user_guides/modeling_algos/modeling_algos.md
-user_guides/boolean_operations/boolean_operations.md
+specification/boolean_operations/boolean_operations.md
 user_guides/shape_healing/shape_healing.md
 user_guides/ocaf/ocaf.md
 user_guides/step/step.md
@@ -27,6 +27,6 @@ contribution/git_guide/git_guide.md
 contribution/tests/tests.md
 
 upgrade/upgrade.md
-dev_guides/visualization/pbr_math.md
+specification/pbr_math.md
 
 tutorial/tutorial.md
index 832d65d..f99855e 100644 (file)
@@ -11,10 +11,6 @@ The following documents provide information on OCCT building, development and te
 * @subpage occt_dev_guides__tests "Automatic Testing system"
 * @subpage occt_dev_guides__debug "Debugging tools and hints"
 
-The following documents provide information on OCCT algorithms background:
-
-* @subpage occt_dev_guides__pbr_math "Physically-based Rendering math (PBR for rasterization)"
-
 The following guide provides information relevant to upgrading applications developed with previous versions of OCCT, to recent one:
 
 * @subpage occt_dev_guides__upgrade "Upgrade from previous OCCT versions"
diff --git a/dox/dev_guides/visualization/pbr_math.md b/dox/dev_guides/visualization/pbr_math.md
deleted file mode 100644 (file)
index 6f80c63..0000000
+++ /dev/null
@@ -1,836 +0,0 @@
-PBR math (rasterization) {#occt_dev_guides__pbr_math}
-========================
-@tableofcontents
-
-@section pbr_preface Preface
-
-**Empirical** illumination models like **Phong reflection model** have been used in real-time graphics for a long time due to their simplicity, convincing look and affordable performance.
-Before programmable pipeline has been introduced, graphics cards implemented Gouraud shading as part of fixed-function Transformation & Lighting (T&L) hardware blocks.
-Nowadays, however, numerous trade-offs of this simplicity (like lighting partially baked into object material properties and others) pushed developers to **Physically-Based Rendering** (**PBR**) illumination models.
-
-PBR models try to fit surface shading formulas into constrains of physical laws of light propagation / absorption / reflection - hence, called "physically-based".
-There are two main categories of PBR illumination:
-
- 1. Non-real-time renderer (cinematic).
- 2. Real-time renderer.
-
-The main objective of cinematic renderer is uncompromised quality, so that it relies on ray-tracing (path-tracing) rendering pipeline.
-Although performance of current graphics hardware does not make it possible using computationally-intensive path-tracing renderer in real-time graphics, it can be used in interactive fashion.
-
-"Physically-based" does not necessarily mean physically-correct/precise.
-The main objective of real-time PBR renderer is to be fast enough even on low-end graphics hardware.
-So that in contrast, it hardly relies on rasterization rendering pipeline, various approximations and tricks making it applicable in real-time, while looking good enough and preserving some physical properties.
-
-OCCT 3D Viewer provides both kinds of PBR renderers, and although they share some details in common, this article is devoted to real-time PBR metallic-roughness illumination model.
-This article describes the math underneath PBR shading in OCCT 3D Viewer and its GLSL programs.
-However, this article does not clarifies related high-level APIs nor PBR material creation pipelines, as this is another topic.
-
-@section pbr_notation Notation
-
-|  |  |  |
-|-:|:-|:-|
-| \f$n\f$   | normal (on surface) | \f$\|n\|=1\f$ |
-| \f$v\f$   | view direction      | \f$\|v\|=1\f$ |
-| \f$l\f$   | light               | \f$\|l\| = 1\f$ |
-| \f$h=\frac{v+l}{\|v + l\|}\f$   | half vector | |
-| \f$m\f$   | metallic factor     | \f$[0, 1]\f$ |
-| \f$r\f$   | roughness factor    | \f$[0, 1]\f$ |
-| \f$IOR\f$ | index of refraction | \f$[1, 3]\f$ |
-| \f$c\f$   | albedo color        | \f$(R, G, B)\f$ |
-
-\f$\cos\theta_l=(n \cdot l)\f$
-
-\f$\cos\theta_v=(n \cdot v)\f$
-
-\f$\cos\theta_h=(n \cdot h)\f$
-
-\f$\cos\theta_{vh}=(v \cdot h)\f$
-
-@section pbr_illumination_model Illumination model
-
-The main goal of illumination model is to calculate outgoing light radiance \f$L_o\f$ along the certain direction.
-The starting point of calculation might be the view direction \f$v\f$ aimed from point on surface (or in more general case just in space) to viewer position.
-Considering the point on opaque surface with normal \f$n\f$ the main equation of illumination can be defined as:
-
-\f[L_o=\int\limits_H f(v, l) L_i(l) \cos\theta_l\, \mathrm{d}l\f]
-
-Where \f$L_i(l)\f$ is light radiance coming from \f$l\f$ direction, \f$f(v,l)\f$ is **Bidirectional Reflectance Distribution Function** (**BRDF**) and \f$H\f$ is hemisphere which is oriented regarding to the surface normal \f$n\f$.
-Opaqueness of the surface mentioned earlier is important because in that case hemisphere is enough.
-More general model will require to consider directions all around a whole sphere and is not observed in this paper.
-\f$\cos\theta_l\f$ factor appearing is caused by affection of surface area and light direction mutual orientation to the amount of radiance coming to this area.
-This is mainly due to geometric laws. The rest part of integral is the key of the whole illumination model.
-BRDF defines it's complexity and optical properties of material.
-It has to model all light and material interactions and also has to satisfy some following criteria in order to be physical correct @ref ref_Duvenhage13 "[Duvenhage13]":
-* Positivity: \f$f(v,l) \geq 0\f$
-* Helmholtz reciprocity: \f$f(v,l) = f(l, v)\f$ (follows from 2<sup>nd</sup> Law of Thermodynamics)
-* Energy conservation: \f$\displaystyle \forall v \, \int\limits_H f(v,l) \cos\theta_l \, \mathrm{d}l = 1\f$ (in order not to reflect more light than came)
-
-It is worth to be mentioned that \f$f(v,l)\f$ depends on \f$n\f$ also but it is omitted to simplify notation. BRDF is usually split into two parts:
-
-\f[f(v,l) = f_d(v,l)+f_s(v, l)\f]
-
-Where \f$f_s(v, l)\f$ (specular BRDF) models reflection light interaction on surface and \f$f_d(v,l)\f$ (diffuse BRDF) models other processes happening depth in material (subsurface scattering for example).
-So that illumination equation might be rewritten as:
-
-\f[L_o=\int\limits_H (f_d(v,l)+f_s(v, l)) L_i(l) \cos\theta_l\, \mathrm{d}l\f]
-
-PBR theory is based on **Cook-Torrance specular BRDF** @ref ref_Cook81 "[Cook81]". It imagines surface as set of perfectly reflected micro faces distributed on area in different ways which is pretty good model approximation of real world materials.
-If this area is small enough not to be able to recognize separate micro surfaces the results becomes a sort of averaging or mixing of every micro plane illumination contribution.
-In that level it allows to work with micro faces in statistical manner manipulating only probabilities distributions of micro surfaces parameters such as normals, height, pattern, orientation etc.
-In computer graphics pixels are units of images and it usually covers a relatively large areas of surfaces so that micro planes can be considered to be unrecognizable.
-Going back to the BRDF the Cook-Torrance approach has the following expression:
-
-\f[f_s(v,l)=\frac{DGF}{4\cos\theta_l\cos\theta_v}\f]
-
-Three parts presented in nominator have its own meaning but can have different implementation with various levels of complexity and physical accuracy.
-In that paper only one certain implementation is used. The \f$D\f$ component is responsible for **micro faces normals distribution**.
-It is the main instrument that controls reflection's shape and strength according to **roughness** \f$r\f$ parameter.
-The implementation with good visual results is **Trowbridge-Reitz GGX** approach used in Disney's RenderMan and Unreal Engine @ref ref_Karis13 "[Karis13]":
-
-\f[D=\frac{\alpha^2}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
-
-Where \f$\alpha = r^2\f$. This square in needed only for smoother roughness parameter control.
-Without it the visual appearance of surface becomes rough too quickly during the parameter's increasing.
-
-The second \f$G\f$ component is called **geometric shadowing** or attenuation factor.
-The point is that micro surfaces form kind of terrain and can cast shadows over each other especially on extreme viewing angles @ref ref_Heitz14 "[Heitz14]".
-**Smith-Schlick model** @ref ref_Heitz14 "[Heitz14]", @ref ref_Schlick94 "[Schlick94]" has been chosen as implementation:
-
-\f[\displaystyle G=\frac{\cos\theta_l \cos\theta_v}{(\cos\theta_l(1-k)+k)(\cos\theta_v(1-k)+k)}\f]
-
-Where \f$k=\frac{\alpha}{2}\f$, which means \f$k=\frac{r^2}{2}\f$ in terms of this paper.
-But \f$G\f$ depends on many factors so that it's approximations has float nature and can be modified a little bit in some cases in order to get more pleasant visual results.
-One of this modification will be described later in following chapters.
-
-The last component \f$F\f$ shows **how much light is reflected from surface** and is called **Fresnel's factor**.
-The rest amount of radiance might be absorbed or refracted by material.
-The most accurate expression of it is pretty complicate for calculation so that there is a variety of approximations.
-The good one with less computation efforts is **Schlick's implementation** @ref ref_Schlick94 "[Schlick94]":
-
-\f[F=F_0+(1-F_0)(1-\cos\theta_{vh})^5\f]
-
-Here \f$F_0\f$ is material's response coefficient at normal incidence (zero angle).
-Fresnel's factor has to be calculated differently for metals and dielectric/non-metals, but PBR theory tries to come up with universal formula for all types of material.
-In order to do that it is needed to be noticed that Schlick's approximation is applicable only to non-conductors and in that case \f$F_0 = F_{dielectric} = \left(\frac{1-IOR}{1+IOR}\right)^2\f$.
-**Index of Refraction** \f$IOR\f$ shows the proportion between light speed in vacuum (or even in air) and in material.
-The reference value of \f$IOR\f$ for plastic is **1.5**, and this value can be considered as default for all unknown dielectrics.
-In practice this parameter controls reflectance ability of material.
-Also it should be remembered that this approximation produces poor results with large \f$IOR\f$ values so that it is recommended to be kept in range of \f$[1, 3]\f$ in order to get plausible Fresnel's factor @ref ref_Lazanyi05 "[Lazanyi05]", @ref ref_Lagarde13 "[Lagarde13]".
-This formula might be further propagated onto metals by using \f$F_0\f$ measured specifically for certain metal.
-It can be considered as some kind of a 'color' of metal and can be stored as albedo parameter \f$c\f$.
-And the final step of defining Fresnel's factor formula is mixing all this \f$F_0\f$ using metallic parameter \f$m\f$ (**metalness**):
-
-\f[F_0 = F_{dielectric}(1-m)+cm\f]
-
-For pure dielectrics with \f$m=0\f$ exactly Schlick's approximation will be used.
-For pure metals with \f$m=1\f$ it will be a little inaccurate but the same formula with measured \f$F_0\f$ values.
-Everything else for \f$m \in (0, 1)\f$ is not physically correct and it is recommended to keep \f$m\f$ exactly 1 or 0.
-Intermediate values may represent mixed areas for smooth transition between materials - like partially rusted metal (rust is mostly dielectric).
-Also it might be useful when parameters are read from textures with filtering and smoothing.
-
-BRDF described above has one important trait making computations easier called **isotropy**.
-Isotropy in this case means independence from rotation about normal resulting from supposition of uniform micro faces distribution at any direction along a surface.
-It allows to simplify random samples generation during Monte-Carlo integrals calculation and reduce dimensions of some lookup tables, which will be discussed in following chapters.
-Of course, isotropic materials form only subset of all real world's materials, but this subset covers majority of cases.
-There are special models considering special anisotropic traits of surfaces like a grinding of metal or other with dependency on rotation about normal;
-these models require special calculation tricks and additional parameters and are out of scope of this paper.
-
-The only thing left to do is to define \f$f_d(v,l)\f$.
-This part is responsible for processes happening in depth of material.
-First of all the amount of input light radiance participating in these processes is needed to be calculated.
-And it exactly can be realized from already known Fresnel's factor \f$F\f$ showing amount of reflected light but in negative term in this case in order to get the radiance left after reflection:
-
-\f[1-F\f]
-
-This part of ingoing light is assumed to be refracted in depth of surface and variety of events may happen there.
-A sequence of absorptions, reflections and reemissions more or less leads to light's subsurface scattering.
-Some part of this scattered light can go back outside but in modified form and in pretty unpredictable directions and positions.
-For opaque materials this part is noticeable and forms it's own color.
-If subsurface's paths of light are small enough and points of output are distributed locally around the input point it's possible to work in statistical way similar to the micro faces.
-This assumption covers a big amount of real world opaque materials.
-Other materials like skin, milk etc. with noticeable effect of subsurface scattering usually presented in form of partial translucency and some kind of self emission
-have more widely distributed output points and require more accurate and complicate ways of modeling with maybe some theory and techniques from volumetric rendering.
-The simple but visually enough assuming for statistically driven type of materials is just the same radiance for any direction. It results to **Lambertian's BRDF**:
-
-\f[\frac{c}{\pi}\f]
-
-Where \f$\pi\f$ is normalization coefficient in order to meet BRDF's criteria and \f$c\f$ is material's own color formed by adventures of light under surface.
-There is one detail about light interaction bringing some physicality to the model, and that is an absence of this diffuse component in metals.
-Metals reflect main part of light and the rest of it is absorbed being transformed into other form (mostly heat).
-That is the main visual difference between metallic and non-metallic materials realizing of which brings model to higher level of quality in compare to older non-physical models.
-
-So that all parts described above can be combined into united diffuse BRDF:
-
-\f[f_d(v,l) = (1-F)(1-m)\frac{c}{\pi}\f]
-
-\f$m\f$ is recommended to be exactly 1 or 0 but all values between can represent transition areas, as mentioned before.
-
-In this chapter one possible implementation of illumination model reflecting main PBR principles has been defined.
-The next step is using of it in practice.
-
-@section pbr_practical_application Practical application
-
-It's time to apply deduced illumination model in practice.
-And the first step of it is separation of **direction based light sources** from illumination integral.
-Directional nature of such light sources means possibility to calculate it's influence to point of surface using only one direction and its intensity.
-Usually sources of this type do not have physical size and are represented only by position in space (for point or spot lights) or by direction itself (direction light imagined to be too far point sources like sun).
-This is just a kind of abstraction, while real world light emitters have noticeably sizes.
-But sources with realistic form and size cannot be presented in discrete term and require continuous integrals calculations or special approximations in order to be accurately injected to the model.
-In most cases direct based light sources in form of emitting points in space or just certain directions are good approximations and are enough for beginning.
-Having finite discrete amount of it in scene and considering only single direction from every of these lights, the integral is transformed just to the sum:
-
-\f[L_{direct} = \sum_{j=1}^M f(v, l_j) L_i^{direct}(l_j) \cos\theta_{l_j}\f]
-
-Where \f$M\f$ is a number of sources, \f$l_j\f$ is a direction and \f$L_i^{direct}\f$ is an intensity related to this direction.
-\f$direct\f$ label means that illumination has been computed directly from sources.
-The BRDF can be used directly without any calculation problems.
-The only exception might be \f$k\f$ in \f$G\f$ factor - it is recommended to be equal \f$\frac{(r+1)^2}{8}\f$ in order to get more pleasant results @ref ref_Karis13 "[Karis13]" (that is modification mentioned in previous chapter).
-And actually it is enough to finally see something.
-There will be correct visualization with assumption of complete dark environment and absence of other points influence.
-It is called **local illumination**. Based on this name there is also a global or **indirect illumination** and that is the rest of integral:
-
-\f[L_{indirect} = \int\limits_H f(v, l) L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
-
-It includes influence of light reflected or scattered from other points and environment's contribution.
-It's impossible to achieve photorealistic results without this component, but is is also very difficult to compute.
-While the cross point light interaction cannot be calculated in a simple way (especially in real time rendering), the environment illumination has some options to be realized via precomputational work before visualization.
-But right now lets summarize the practical application of illumination model.
-At this moment the output radiance is represented as:
-
-\f[L_o = L_{direct} + L_{indirect}\f]
-
-Where \f$L_{direct}\f$ is direction based light sources contribution which can be directly computed just applying bare formulas.
-It is enough to get some results in terms of local illumination but without \f$L_{indirect}\f$ component image will not be looked lifelike.
-\f$L_{indirect}\f$ is not trivial thing for calculation and that is stumbling block for real time rendering applications.
-But it can be relatively easy implemented in case of environment illumination via some precomputational work about which will be told in details in following chapters.
-
-@section pbr_image_based_lighting Image based lighting
-
-The next goal after \f$L_{direct}\f$ calculation is to find \f$L_{indirect}\f$.
-And it would be easier if \f$L_i^{indirect}(l)\f$ was known for every \f$l\f$.
-That is the main assumption of **image based lightning** (**IBL**).
-In practice, it can be achieved using environment image map, which is a special image representing illumination from all possible directions.
-This image might be a photo capturing a real world environment (spherical 360 degrees panoramas) or generated image baking the 3D scene itself, including in that case reflections of other objects.
-Environment image might be packed in different ways - **cube maps** and equirectangular maps are the most commonly used.
-Anyway, it allows \f$L_i^{indirect}(l)\f$ to be defined for every \f$l\f$ and its practical implementation in form of images gives name for this approach.
-Lets back to indirect illumination integral:
-
-\f[L_{indirect} = \int\limits_H f(v, l) L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
-
-Substituting the BRDF by its expression allows to split indirect illumination into diffuse and specular components:
-
-\f[L_{indirect} = \int\limits_H f_d(v,l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l + \int\limits_H f_s(v,l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l = \f]
-
-\f[= (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l + \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_l \cos\theta_v}L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f]
-
-This splitting seems not to lead to simplicity of calculation but these two parts will be computed in slightly different ways in future.
-Lets write down this separately:
-
-\f[L_{indirect}^d = (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f]
-
-\f[L_{indirect}^s = \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_v \cos\theta_l} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
-
-Next transformations of these expressions require understanding of numerical way to find hemisphere integral and also its performance optimization techniques.
-And that the topic of the next chapter.
-
-@section pbr_monte_carlo_integration Monte-Carlo numeric integration
-
-**Monte-Carlo** is one of numeric methods to **find integral**.
-It is based on idea of mathematical expectation calculation.
-In one dimensional case if \f$f(x)\f$ is a function with parameter distributed according to probability density \f$p(x)\f$ the mathematical expectation of it can be found using following expression:
-
-\f[E = \int\limits_{-\infty}^\infty f(x) p(x)\, \mathrm{d}x\f]
-
-Also this expectation can be approximated in statistical term using certain sequence of random variable \f$x\f$:
-
-\f[E \approx \frac{1}{N} \sum_{i=1}^{N} f(x_i)\f]
-
-It can be used in general definite integrals calculations.
-Just valid \f$p(x)\f$ defined on \f$[a, b]\f$ range and sequence \f$x_i\f$ generated according to it are needed for that:
-
-\f[\int\limits_a^b f(x)\, \mathrm{d}x = \int\limits_a^b \frac{f(x)}{p(x)}p(x)\, \mathrm{d}x = \int\limits_{-\infty}^{\infty} \frac{f(x)}{p(x)}p(x)\, \mathrm{d}x \approx \frac{1}{N} \sum_{i=1}^{N} \frac{f(x_i)}{p(x_i)}\f]
-
-Where \f$f(x)\f$ is considered to be equal to zero outside of \f$[a, b]\f$ range.
-This is also true for functions on sphere or hemisphere:
-
-\f[\int\limits_{H|S} f(l)\, \mathrm{d}l \approx \frac{1}{N}\sum_{i=1}^{N} \frac{f(l_i)}{p(l_i)}\f]
-
-The main questions are choosing \f$p(l)\f$ and generating samples \f$l_i\f$.
-The one of the simple ways is uniform distribution along sphere or hemisphere.
-Lets realize that on sphere for example.
-There are \f$4\pi\f$ possible directions in terms of sphere's areas and steradians (direction can be presented as dot on a unit sphere):
-
-\f[\int\limits_S 1\, \mathrm{d}l = 4\pi\f]
-
-Where \f$S\f$ is the unit sphere.
-In order to be uniform \f$p(l)\f$ must be constant and satisfy normalization criteria:
-
-\f[\int\limits_S p(l)\, \mathrm{d}l = 1\f]
-
-So that \f$p(l) = \frac{1}{4\pi}\f$.
-Usually direction \f$l\f$ is parametrized by spherical coordinates \f$\phi \in [0, 2\pi]\f$ and \f$\theta \in [0, \pi]\f$ boiling down to the 2D samples generation.
-But in these terms joint \f$p(\theta, \phi)\f$ will be looked slightly different due to variables transition.
-\f$l\f$ is defined in regular Cartesian coordinates \f$l=(x, y, z)\f$ with \f$\|l\| = 1\f$.
-The spherical coordinates transform looks like:
-
-\f[x = r\sin\theta\cos\phi,\, y = r\sin\theta\sin\phi,\, z = r\cos\theta\f]
-
-Where \f$r = 1\f$.
-In order to express probability density using new variables it is needed to multiply this density by Jacobian of transform:
-
-\f[p(\theta,\phi) = p(l)|J_T|\f]
-
-Where:
-
-\f[|J_T| = \begin{vmatrix} \frac{\partial x}{\partial r} & \frac{\partial x}{\partial \theta} & \frac{\partial x}{\partial \phi} \\ \frac{\partial y}{\partial r} & \frac{\partial y}{\partial \theta} & \frac{\partial y}{\partial \phi} \\ \frac{\partial z}{\partial r} & \frac{\partial z}{\partial \theta} & \frac{\partial z}{\partial \phi} \end{vmatrix} = r^2\sin\theta\f]
-
-So that joint probability density in new variables looks like:
-
-\f[p(\theta, \phi) = \frac{\sin\theta}{4\pi}\f]
-
-This variable transfer rule of **Probability Density Function** (**PDF**) will be useful in following chapters, when integral calculation optimization techniques will be being told.
-Having \f$p(\theta, \phi)\f$ the partial single dimensional probability densities are able to be found:
-
-\f[p(\phi) = \int\limits_0^\pi p(\theta, \phi)\, \mathrm{d}\theta = \frac{1}{4\pi} \int\limits_0^\pi \sin\theta\, \mathrm{d}\theta = \frac{1}{2\pi}\f]
-
-\f[p(\theta) = \int\limits_0^{2\pi} p(\theta, \phi)\, \mathrm{d}\phi = \frac{\sin\theta}{4\pi}\int\limits_0^{2\pi}1\, \mathrm{d}\phi = \frac{\sin\theta}{2}\f]
-
-The final step is sequence generation itself.
-In order to be able to generate values with arbitrary distributions it is helpful to start from uniform numbers in range of \f$[0, 1]\f$.
-And that can be done via any known true- and pseudo- random generators.
-Even simple \f$\frac{1}{i}\f$ sequence is appropriate for beginning but it can be not so efficient in terms of computations convergence.
-There are specially designed series for the last reason and it will be tackled in chapter about optimizations.
-The \f$\phi\f$ variable is noticed to be uniformly distributed so that it can be directly generated without any additional manipulations.
-Just range \f$[0, 1]\f$ is needed to be mapped to range \f$[0, 2\pi]\f$.
-For any other variables including \f$\theta\f$ the inverse transform sampling approach can be applied.
-First of all **cumulative distribution function** (**CDF**) is needed to be found.
-It is probability of random value to be less than argument of this functions by definition.
-For continues distributions it can be expressed in following form:
-
-\f[F(x) = \int\limits_{-\infty}^x p(x')\, \mathrm{d}x'\f]
-
-Lets find CDF for \f$\theta\f$:
-
-\f[F(\theta) = \int\limits_{-\infty}^\theta p(\theta')\, \mathrm{d}\theta' = \int\limits_0^\theta \frac{\sin\theta'}{2}\, \mathrm{d}\theta' = \frac{1-\cos\theta}{2}\f]
-
-The CDF maps \f$\theta\f$ values from range of \f$[0, \pi]\f$ to probability in range of \f$[0, 1]\f$.
-The next step is to find inverse cumulative function which can be not so trivial sometimes but pretty obvious in current case:
-
-\f[F^{-1}(u) = \arccos(1-2u)\f]
-
-If substitute uniform distributed in range \f$[0, 1]\f$ values \f$u\f$ as argument of this function the values with origin probability density will appear.
-In other words:
-
-\f[\theta = \arccos(1 - 2u),\, u \in [0, 1],\, p(u) = 1 \Rightarrow p(\theta) = \frac{\sin\theta}{2}\f]
-
-That is the key of this random values generation technique.
-All steps described above can be also done for hemisphere:
-
-\f[p(l) = \frac{1}{2\pi}\f]
-
-\f[p(\theta, \phi) = \frac{\sin\theta}{2\pi}\f]
-
-\f[p(\phi) = \int\limits_0^\frac{\pi}{2} p(\theta, \phi)\, \mathrm{d}\theta = \frac{1}{2\pi} \int\limits_0^\frac{\pi}{2} \sin\theta\, \mathrm{d}\theta = \frac{1}{2\pi}\f]
-
-\f[p(\theta) = \int\limits_0^{2\pi} p(\theta, \phi)\, \mathrm{d}\phi = \frac{\sin\theta}{2\pi}\int\limits_0^{2\pi}1\, \mathrm{d}\phi = \sin\theta\f]
-
-\f[\theta = \arccos(1-u)\f]
-
-Mote-Carlo integration cannot guarantee exact estimation of convergence speed with using random generated samples.
-There is only probability estimation of it.
-But this algorithm is pretty universal and relatively simple to be applied to almost any function using at least uniform distributed points.
-Moreover special \f$p(l)\f$ can be chosen and special pseudo-random sequences can be designed in order to speed up convergence for some functions (following chapter talk about that in details).
-That is why this method is widely used in computer graphics and demonstrates good results.
-Also another one advantage is worth to be mentioned - possibility to iteratively accumulate computations and present intermediate results during rendering which is used in some ray tracing applications.
-
-@section pbr_split_sum Split sum
-
-Lets go back to the image based lighting and the figure of specular component.
-As was defined before that is hemisphere integral with following expression:
-
-\f[L_{indirect}^s = \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_v \cos\theta_l} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
-
-The Monte-Carlo integration algorithm can be directly applied:
-
-\f[L_{indirect}^s = \int\limits_H f_s(v, l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l \approx \frac{1}{N}\sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)}\f]
-
-\f$p(v, l_i)\f$ depends on \f$v\f$ and implicitly on \f$r\f$ in order to be completely general.
-Optimization strategies use different samples distributions for different view direction orientations and roughness values.
-Anyway even with all optimization techniques this algorithm continues to require too much calculations.
-Good visual results require noticeable number of samples and using this approach for every point in real time rendering becomes unrealistic.
-The way to avoid these enormous calculations is doing them beforehand somehow.
-The first trick on the way to this is split the sum separating environment light component @ref ref_Karis13 "[Karis13]":
-
-\f[L_{indirect}^s \approx \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)} \approx \left( \frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \right) \left( \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) \cos\theta_{l_i}}{p(v, l_i)} \right)\f]
-
-Where the second brackets represent approximation of integral so that the expression can be rewritten as:
-
-\f[L_{indirect}^s \approx \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)} \approx \left( \frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \right) \int\limits_H f_s(v, l) \cos\theta_l\, \mathrm{d}l\f]
-
-This integral is exact \f$L_{indirect}^s\f$ in condition when \f$L_i^{indirect}(l) = 1\f$ what just means white uniform environment.
-The sum before it is kind of averaged environment illumination.
-The main accomplishment after all this manipulations is possibility to calculate light and BRDF components separately.
-The sum with \f$L_i^{indirect}(l_i)\f$ can be computed beforehand for every normal direction and stored to image called specular map but with some valuable details.
-The problem is that \f$l_i\f$ samples must be generated according to \f$p(v, l_i)\f$ distribution depended on \f$v\f$ and \f$r\f$ as was mentioned earlier.
-Variation of normal is not enough in that case and these variables are needed to be considered too.
-The ways to resolve it are topic of one of the following chapters and now understanding the fact that at least this part can be precomputed before rendering is enough for now.
-And it is important not to miss out that there is no more BRDF influence in this sum and only \f$p(v, l)\f$ can affect in this case.
-That is why it is so important to strict to PDF during samples generation and that is why \f$p(v, l)\f$ must be correlated with BRDF somehow in this approximation approach with splitting.
-For example completely mirroring materials with \f$r = 0\f$ will not be looked as expected if just uniform distribution is used
-because such surfaces have only one possible direction from which light can be reflected along view direction in compare with \f$N\f$ absolutely scattered in case of uniform or many other distributions.
-
-The rest part also can be saved to image. Lets unroll its expression:
-
-\f[\int\limits_H f_s(v, l) \cos\theta_l\, \mathrm{d}l = \int\limits_H \frac{DGF}{4\cos\theta_v \cos\theta_l} \cos\theta_l\, \mathrm{d}l\f]
-
-This integral is not actually a scalar.
-That is RGB value due to only \f$F\f$ factor and even more only to \f$F_0\f$.
-In order to simplify future computations \f$F_0\f$ is needed to be moved out of integral.
-Substitution of Schlick's approximation helps to achieve it:
-
-\f[F = F_0+(1-F_0)(1-\cos\theta_{vh})^5 = F_0(1-(1-\cos\theta_{vh})^5) + (1-\cos\theta_{vh})^5\f]
-
-\f[\int\limits_H \frac{DGF}{\cos\theta_v \cos\theta_l} \cos\theta_l\, \mathrm{d}l = F_0 \int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} (1-(1-\cos\theta_{vh})^5) \cos\theta_l\, \mathrm{d}l + \int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} (1-\cos\theta_{vh})^5 \cos\theta_l\, \mathrm{d}l\f]
-
-This form may not look easier, but it has several advantages.
-The first one is independence from globally defined \f$L_i^{indirect}(l)\f$, so that normal orientation does not matter and can be set in any handful way for calculations (Z axis for example).
-The second one results from isotropic illumination system allowing \f$\phi\f$ component of view vector to be set arbitrarily (0 for example) and \f$\cos\theta_v\f$ will be enough to define view direction.
-And the third one is scalar nature of integrals so that only two precomputed numbers are needed to find BRDF part of \f$L_{indirect}^s\f$.
-Considering dependency of these integrals from \f$\cos\theta_v\f$ and \f$r\f$ both of it can be precomputed and stored to 2D look-up image variating these two parameters in range \f$[0, 1]\f$ with two channels consisting of scale and bias for \f$F_0\f$.
-
-Current result for \f$L_{indirect}^s\f$ is computing it using 2D image for BRDF part and omnidirectional image for environment illumination.
-There were a lot of words about Monte-Carlo optimizations techniques and about PDF choice which is important not only in terms of numeric integration but in terms of visual results correctness.
-It's time to talk about that.
-
-@section pbr_importance_sampling Importance sampling
-
-Current goal is to speed up Monte-Carlo integration of Cook-Torrance like integrals with following expression:
-
-\f[\int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} g(v, l) \cos\theta_l\, \mathrm{d}l\f]
-
-Where \f$g(v, l)\f$ is just arbitrary function representing Fresnel's factor itself or its components.
-In order to increase convergence the samples with larger contribution (or in other words with larger function's values) have to appear more frequently than others proportionally to its contribution.
-So that less significant summand with less influence to result will be considered rarely and in opposite way parts brining noticeable changes to the sum will be taken often.
-That is the main idea of **importance sampling technique**.
-\f$p(l)\f$ has to represent significance of sample in terms of integrated function via probability somehow.
-And it will be like that if PDF is already part of original function because in that case probability density directly affects to contribution forming.
-Separating this distribution component is one possible and effective way to realize importance sampling strategy.
-In integral presented above PDF part already exists and that is \f$D\f$ component.
-But it is distribution of micro faces normals or ideally reflection direction or \f$h\f$ in other word and not light directions distribution which is needed in fact.
-Anyway that is good starting point and lets generate \f$h\f$ vectors first.
-\f$D\f$ has the following expression:
-
-\f[D=\frac{\alpha^2}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
-
-Frankly speaking \f$D(h)\f$ is called normal distribution but cannot be directly used as hemisphere distribution.
-Originally it is statistical factor used to define total area of micro faces \f$\mathrm{d}A_h\f$
-whose normals lie withing given infinitesimal solid angle \f$\mathrm{d}h\f$ centered on \f$h\f$ direction using the original small enough area of macro surface \f$\mathrm{d}A\f$ @ref ref_Walter07 "[Walter07]":
-
-\f[dA_h = D(h)\,\mathrm{d}h\, \mathrm{d}A\f]
-
-First of all this factor must be positive:
-
-\f[D(h) \geq 0\f]
-
-But the total area of micro faces landscape is at least equal to origin surface but even bigger in general:
-
-\f[1 \leq \int\limits_H D(h)\, \mathrm{d}h\f]
-
-This trait does not allow to use \f$D\f$ as hemisphere distribution.
-But it can be fixed with following feature:
-
-\f[\forall v\, \int\limits_H D(h)(v \cdot h)\, \mathrm{d}h = (v \cdot n)\f]
-
-Which means that total area of micro faces projected to any direction must be the same as projected area of origin macro surface.
-It is pretty tricky trait in \f$D\f$ definition but it leads to interesting results in condition when \f$v = n\f$:
-
-\f[\int\limits_H D(h)\cos\theta_h\, \mathrm{d}h = 1\f]
-
-So that \f$\cos\theta_h\f$ coefficient normalizes normal distribution in terms of hemisphere and allows to use it as distribution.
-Finally PDF of half vectors can be wrote:
-
-\f[p(\theta_h, \phi_h) = D\cos\theta_h\sin\theta_h = \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
-
-\f$\sin\theta_h\f$ results from spherical coordinate system transfer which was described in Monte-Carlo integration chapter.
-Lets strict to samples generation procedure and find partial probability densities:
-
-\f[p(\phi_h) = \int\limits_0^\frac{\pi}{2} p(\theta_h, \phi_h)\, \mathrm{d}\theta_h = \int\limits_0^\frac{\pi}{2} \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\theta = \frac{1}{2\pi}\f]
-
-\f[p(\theta_h) = \int\limits_0^{2\pi} p(\theta_h, \phi_h)\, \mathrm{d}\phi_h = \int\limits_0^{2\pi} \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\phi = \frac{2 \alpha^2 \cos\theta_h\sin\theta_h}{(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
-
-\f$p(\phi_h)\f$ is unnecessary to be calculated analytically.
-The fact of independency from \f$\phi\f$ is enough to figure out that this coordinate is uniformly distributed.
-Anyway the \f$F(\theta_h)\f$ is next step @ref ref_Cao15 "[Cao15]":
-
-\f[F(\theta_h) = \int\limits_0^{\theta_h} \frac{2 \alpha^2 \cos\theta'_h\sin\theta'_h}{(\cos^2\theta'_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\theta'_h = \int\limits_{\theta_h}^0 \frac{2 \alpha^2}{(\cos^2\theta'_h(\alpha^2-1) + 1)^2}\, \mathrm{d}(\cos^2\theta'_h) = \frac{\alpha^2}{\alpha^2-1}\int\limits_0^{\theta_h} \mathrm{d}\frac{1}{\cos^2\theta'_h(\alpha^2-1)+1} =\f]
-
-\f[ = \frac{\alpha^2}{\alpha^2-1} \left( \frac{1}{\cos^2\theta_h(\alpha^2-1) + 1} - \frac{1}{\alpha^2} \right) = \frac{\alpha^2}{\cos^2\theta_h(\alpha^2-1)^2+(\alpha^2-1)} - \frac{1}{\alpha^2-1}\f]
-
-In order to apply inverse transform sampling the \f$F^{-1}(u)\f$ is needed to be found:
-
-\f[F^{-1}(u) = \theta_h = \arccos\sqrt{\frac{1-u}{u(\alpha^2-1)+1}}\f]
-
-So that there is no more obstacles to generate \f$h\f$.
-But the main goal was \f$l\f$ direction.
-In order to get it the view vector \f$v\f$ has to be reflected related to already found \f$h\f$:
-
-\f[l = 2(v \cdot h)h - v\f]
-
-That is practical side of light direction generation.
-But the theoretical one is needed to be resolved to calculate sum.
-It is time to find \f$p(l)\f$ using known \f$p(h)\f$.
-First of all the fact that \f$l\f$ is just transformed \f$h\f$ is needed to be understood.
-In that way the light direction's PDF has following expression:
-
-\f[p(l) = p(h)|J_T|\f]
-
-Where \f$|J_T|\f$ is Jacobian of reflection transformation.
-Lets find it.
-Right now \f$n\f$ is axis from which \f$\theta\f$ spherical coordinate is encountered.
-The first step is setting \f$v\f$ as starting point of \f$\theta\f$ instead of \f$n\f$.
-This is linear transform so that \f$|J_T| = 1\f$.
-Next step is transfer to spherical coordinate with \f$|J_T| = \sin\theta_{vh}\f$.
-Due to previous step \f$\theta_{vh}\f$ is used instead of \f$\theta_h\f$.
-In this coordinate system reflecting of \f$v\f$ relative to \f$h\f$ is just doubling \f$\theta_{vh}\f$ and Jacobian of it is equal to \f$\frac{1}{2}\f$.
-In series of transform the Jacobians are multiplied so that currently \f$|J_T| = \frac{1}{2}\sin\theta_{vh}\f$.
-And the final step is inverse transform to Cartesian coordinate system with \f$|J_T| = (\sin\theta_{vl})^{-1} = (\sin2\theta_{vh})^{-1}\f$.
-Combining this all together the following expression is obtained for reflection transform Jacobian @ref ref_Schutte18 "[Schutte18]":
-
-\f[|J_T| = \frac{\sin\theta_{vh}}{2\sin2\theta_{vh}} = \frac{\sin\theta_{vh}}{4\sin\theta_{vh}\cos\theta_{vh}} = \frac{1}{4\cos\theta_{vh}}\f]
-
-And finally \f$p(l)\f$ looks like:
-
-\f[p(l) = p(h)|J_T| = \frac{D\cos\theta_h}{4\cos\theta_{vh}}\f]
-
-Lets go back to the Monte-Carlo sum and insert found result to it:
-
-\f[\int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} g(v, l) \cos\theta_l\, \mathrm{d}l \approx \frac{1}{N} \sum_{i=1}^N \frac{DG\, g(v, l_i) \cos\theta_{l_i}}{4\cos\theta_v \cos\theta_{l_i}\, p(l_i)} = \frac{1}{N} \sum_{i=1}^N \frac{G\, g(v, l_i) \cos\theta_{l_i} \cos\theta_{vh_i}}{\cos\theta_v \cos\theta_{l_i} \cos\theta_{h_i}}\f]
-
-Here \f$G\f$ component is recommended to be calculated with original \f$k=\frac{\alpha}{2} = \frac{r^2}{2}\f$ in order to get more plausible result.
-Of course, all \f$\cos\f$ must be clamped to range \f$[0, 1]\f$ because integral is calculated on a hemisphere and all expressions are defined on it.
-\f$\cos\theta_v \cos\theta_{l_i}\f$ in denominator can be reduced with exactly the same part in geometric attenuation factor in order to avoid additional zero division cases.
-
-Summarizing importance sampling strategy described above the convergence of Monte-Carlo integration can be improved using special PDF correlated with integrated function.
-In case of BRDF with normal distribution functions \f$D\f$ the PDF producing procedure is defined.
-Practically half vector \f$h\f$ is generated first and \f$l\f$ is obtained from it by view vector \f$v\f$ reflecting.
-Due to this transformation final form of probability density used in sum is quite different but also has defined algorithm of calculation.
-For isotropic Cook-Torrance BRDF the \f$\cos\theta_v\f$ and roughness \f$r\f$ are enough to start generation so that all integrals of that kind can be precalculated in 2D look-up tables variating these two parameters.
-The same samples generation procedure must be used in specular map baking described in next chapter.
-
-@section pbr_specular_map Specular map
-
-The situation with BRDF part of \f$L_{indirect}^s\f$ is clear now and \f$L_i^{indirect}(l)\f$ sum is left to be discussed.
-That was called **specular map** and has following form:
-
-\f[\frac{1}{N}\sum_{i=1}^N L_i^{indirect}(l_i)\f]
-
-As was mentioned this sum must be calculated for every normal direction using the same samples generation principles as in numeric integration computation.
-This principles require two scalar parameters \f$\cos\theta_v\f$ and \f$r\f$ but now \f$\phi\f$ really matters.
-So that in fact the specular map has to be saved in 3D table consisting omnidirectional textures.
-That is a big expense of computational and memory resources.
-A couple of tricks helps to reduce dimensions.
-First of all the \f$\cos\theta_v\f$ and \f$\phi\f$ can be just excluded.
-In that way \f$v\f$ is considered to be equal to \f$n\f$.
-Of course this approach produces an error and affects the final result.
-It can be fixed more or less by \f$\cos\theta_{l_i}\f$ weighting @ref ref_Karis13 "[Karis13]":
-
-\f[\frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \cos\theta_{l_i}\f]
-
-It is not a complete solution but practice shows that it is enough to get plausible illumination with sacrificing of lengthy reflections at grazing angles which exist in fact if everything is honestly computed.
-The problem is that for \f$v \neq n\f$ considering this sum to be defined related to \f$n\f$ became incorrect.
-For example, for complete mirroring materials with \f$r = 0\f$ this sum must boil down to \f$L_i^{indirect}(v_r)\f$
-but not to \f$L_i^{indirect}(n)\f$ where \f$v_r\f$ is just reflected \f$v\f$ or in other words \f$v_r = 2(v \cdot n)n - v\f$.
-That it just mirroring reflection principle.
-Assumption of \f$n = v\f$ also means that \f$n = v = v_r\f$.
-In that way radiance map better to be considered as averaging of illumination coming from \f$v_r\f$.
-So that it has become to be defined related to reflection direction which has to be calculated before map's fetching.
-
-Anyway, there are just two dimensions in radiance look-up table remain.
-The rest one with \f$r\f$ parameter cannot be reduced.
-There is no other ways except just roughness variation but in order to simplify that computations can be done for several values and the rest ones lying between can be obtained from linear interpolation.
-This is another source of visual artifacts but it also works good in practice and that is pretty common approach.
-But it still requires noticeably amount of samples and that is for every pixel related to each \f$r\f$ value.
-It can be appropriate for precomputations but still limits using dynamic environments in real time rendering or just even static environments but on weak devices such as mobile ones.
-And there are several possible ways to improve radiance map baking performance.
-
-The first one is using textures with smaller resolutions for larger roughnesses.
-The point is that smaller \f$r\f$ values produce map saving more details from origin environment in opposite to larger ones representing lower frequency components and working as low pass filters in fact.
-So less pixels in combination with linear interpolation is enough to store less detailed convolutions.
-Moreover, this approach naturally works with textures levels of details in graphics API
-so that every certain radiance map related to certain \f$r\f$ can be stored on its own mip level and be directly fetched with linear interpolation not only over one texture but over levels too.
-As practice shows 6 levels are enough.
-
-After reducing pixels count it is turn for samples number.
-And again correlation with roughness can be noticed.
-For example map for completely mirroring materials with \f$r = 0\f$ the same sample \f$l_i = v_r\f$ will be produced.
-So that only one sample is enough in this case.
-In opposite way directions for \f$r = 1\f$ will be scattered over almost whole hemisphere what requires as much samples as available.
-The 'locality' of distribution is decreased during increasing roughness and it is possible to assume that samples number might to be proportional to this 'locality' keeping accuracy at the same level.
-But how can 'locality' be interpreted in terms of probability distribution? One possible way is CDF meaning.
-\f$F(\theta_h)\f$ has been already defined and by definition it shows the probability of random value \f$\theta_h\f$ to be less than argument of CDF.
-In other words \f$F(\theta'_h) = u\f$ means that probability of \f$\theta_h\f$ to be in range of \f$[0, \theta'_h]\f$ is \f$u\f$.
-The inverse task of range searching using given \f$u\f$ can be solved with help of \f$F^{-1}(u) = \theta'_h\f$.
-If \f$u\f$ is close to 1 (exact 1 has no sense because in that case \f$\theta'_h = \max\theta_h = \frac{\pi}{2}\f$)
-then \f$\theta'_h\f$ represents the range of the most probable or most frequently generated values and that can be interpreted as 'locality' of distribution.
-After that if samples number of the worst case with \f$r = 1\f$ is set (\f$N(1) = \max N\f$) the other ones can be estimated using following formula:
-
-\f[N(r) = N(1)\frac{\theta'_h(r)}{\frac{\pi}{2}} = N(1)\frac{2\theta'_h(r)}{\pi} = N(1)\frac{2F^{-1}(u)}{\pi} = N(1)\frac{2}{\pi}\arccos\sqrt{\frac{1-u}{u(\alpha^2-1)+1}}\f]
-
-It is approximate expression representing only estimated general proportionality so that cases of \f$r = 0\f$ and \f$r = 1\f$ must be processed separately with \f$N(0) = 1\f$ and \f$N(1) = \max N\f$.
-\f$u\f$ can be parameter of this optimization strategy controlling speed of samples reducing in order to balance performance and quality (\f$u = 1\f$ disables this optimization at all).
-This pretty tricky technique allows reducing calculations for every pixels without sacrificing the quality.
-
-In addition to optimizations mentioned before another one can be applied in order to help to reduce samples numbers as previous one.
-Using less samples produces image noise due to discrete nature of Monte-Carlo approximation.
-But it can be slightly smoothed using some prefiltration.
-The idea is that for the directions with small PDF or in other words for rare directions the samples near of it is unlikely to be generated.
-So that this direction represents the averaged illumination from relatively big area on hemisphere but approximate it by just a constant.
-It wold be better to get from such direction already averaged over bigger area environment.
-It can be achieved using mip levels of origin \f$L_i^{indirect}\f$ whose pixels of one level is exact 4 averaged pixels from previous one.
-Also mip levels generation is build in most common graphic API so there are no problems with it.
-But first of all the area covered by one sample is needed to be found.
-And that can be done as @ref ref_Colbert07 "[Colbert07]":
-
-\f[\Omega_s = \frac{1}{N\,p(l)} = \frac{4\cos\theta_{vh}}{ND\cos\theta_h}\f]
-
-Circumstance of \f$v = v_r = n\f$ leads to \f$\cos\theta_{vh}\f$ and \f$\cos\theta_h\f$ reducing so expression becomes even simpler:
-
-\f[\Omega_s =\frac{4}{ND}\f]
-
-Of course all zero divisions must be avoided by clamping, for example.
-After that the area covered by one pixel of environment map is calculated.
-In case of a cube map it looks like:
-
-\f[\Omega_p = \frac{4\pi}{6k^2}\f]
-
-Where \f$k\f$ is size of one cube map side in pixels (sides are assumed to be quads).
-Finally the mip level of origin environment map which is needed to be fetched for this certain sample is defined by following expression:
-
-\f[lod = \frac{1}{2} \log_2\left(\frac{\Omega_s}{\Omega_p}\right)\f]
-
-The mathematics connected with mip levels sizes lie behind it but this is out of scope of this paper.
-In combination with previous optimization technique this approach allows \f$N(1)\f$ to be smaller keeping visual results good.
-
-That is not all possible optimization tricks but at least these three significantly reduces compute efforts and brings radiance map calculation to weak devices or even to dynamic environments in real time but in reasonable limits.
-
-In that way \f$L_{indirect}^s\f$ can be completely computed without any integral approximations.
-Only 2D look-up table of BRDF part and mip mapped omnidirectional texture of irradiance map are needed.
-The first one can be got even without any environment.
-It was achieved using some rough approximations and assumptions but despite of that the visual result are still plausible and can be compared even with ray traced images.
-In order to complete whole image based lighting the \f$L_{indirect}^d\f$ component is left to be discussed.
-
-@section pbr_spherical_harmonics Spherical harmonics
-
-Lets go back to diffuse indirect illumination component represented by following formula:
-
-\f[L_{indirect}^d = (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f]
-
-Of course, Monte-Carlo algorithm can be applied directly and hemisphere integral can be precalculated for every normal direction
-but dependence from \f$v\f$ in Fresnel's factor does not allow to do it efficiently (every \f$v\f$ direction is needed to be considered again).
-In order to resolve it modified version of Schlick's approximation has been created [[?](TODO)]:
-
-\f[F \approx F_{ss}=F_0+(\max(1-r, F_0))(1-\cos\theta_v)^5\f]
-
-It differs from origin one and loses accuracy a little bit but now there is no light direction inside
-so that it can be considered as kind of screen space defined Fresnel's factor (\f$ss\f$ means exactly 'screen space') and can be removed from integral:
-
-\f[L_{indirect}^d = (1-m)(1-F_{ss})\frac{c}{\pi} \int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
-
-The resulted expression without \f$(1-m)\f$ and \f$(1-F_{ss})\f$ parts is pretty known entity called **irradiance**.
-It can be precalculated using \f$\cos\theta_l\f$ as PDF for importance sampling (actually it is only option in this case excluding uniform distribution).
-But even with that samples will be scattered almost over whole hemisphere.
-As was discussed in previous chapter this case requires significant amount of samples in order to average illumination with appropriate quality.
-Poor accuracy resulted from lack of summand can be noticed especially on high frequency environments having a lot of contrasting details.
-It worth to be mentioned that irradiance is used not only in BRDF.
-Omnidirectional diffuse illumination captured for certain point or even for several points uniformly or hierarchically distributed is base of some baking global illumination techniques.
-There it is called a **light probe**. So that other way to compute and store irradiance maps was found resolving many mentioned problems.
-The Fourier's decomposition analogue for spherical function allows to achieve this.
-That would be easy to explain concept directly on example.
-So lets start from \f$L_i^{indirect}(l)\f$.
-It is spherical function because directions are just points on sphere.
-The decomposition looks like:
-
-\f[L_i^{indirect}(l) = \sum_{i = 0}^\infty \sum_{j=-i}^i L_i^j y_i^j(l)\f]
-
-Where \f$y_i^j(l)\f$ are spherical functions forming orthonormalized basis called spherical harmonics and \f$L_i^j\f$ is decompositions coefficients.
-Orthonormality means that dot product of two basis elements is equal to 1 if this is the same functions and is equal to zero otherwise.
-Dot product on a sphere is defined as integral of functions multiplication. In other words:
-
-\f[\int\limits_S y_i^j(l)\, y_{i'}^{j'}(l)\, \mathrm{d}l = \begin{cases} 1 & \quad i,j = i',j' \\ 0 & \quad \mathrm{otherwise}\end{cases}\f]
-
-Function basis with such traits is known and is described by following formulas @ref ref_Guy18 "[Guy18]":
-
-\f[y_i^{j > 0}(\theta, \phi) = \sqrt{2}K_i^j\cos(j\phi)P_i^j(\cos\theta)\f]
-\f[y_i^{j<0}(\theta, \phi) = \sqrt{2}K_i^j\sin(j\phi)P_i^{|j|}(\cos\theta)\f]
-\f[y_i^0(\theta, \phi) = K_i^0P_i^0(\cos\theta)\f]
-
-\f[K_i^j = \sqrt{\frac{(2i+1)(i-|j|)!}{4\pi(i+|j|)!}}\f]
-\f[P_0^0(x) = 1\f]
-\f[P_1^0(x) = x\f]
-\f[P_i^i(x) = (-1)^i(2i-1)!!(1-x^2)^\frac{i}{2}\f]
-\f[P_i^j(x) = \frac{(2i-1)xP_{i-1}^j(x) - (i + j - 1)P_{i-2}^j}{i - j}\f]
-
-Here \f$K_i^j\f$ are normalization factors and \f$P_i^j\f$ are **Legendre's polynomials**.
-Decomposition coefficients \f$L_i^j\f$ are dot product of origin function (\f$L_i^{indirect}(l)\f$ in current case) and corresponding basis element. It can be written down as:
-
-\f[L_i^j = \int\limits_S L_i^{indirect}(l)\,y_i^j(l)\, \mathrm{d}l\f]
-
-Fact that all calculation happen over a sphere but not over hemisphere right now is important not to be missed.
-That was example of spherical function decomposition but not a solution for original task which looks like:
-
-\f[\int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
-
-First of all, lets transform this integral to be defined not over hemisphere but sphere:
-
-\f[\int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l = \int\limits_S L_i^{indirect}(l)\overline{\cos}\theta_l\, \mathrm{d}l\f]
-
-Where \f$\overline{\cos}\f$ is cosine clamped to zero which can be expressed as:
-
-\f[\overline{\cos}\theta_l = \max(\cos\theta_l, 0)\f]
-
-Resulted expression can be considered as convolution in terms of spherical functions where \f$L_i^{indirect}(l)\f$ is target and \f$\overline{\cos}\theta_l\f$ is core.
-This integral may seem independent but in fact hemisphere is oriented related to \f$n\f$ therefore \f$\overline{\cos}\theta_l\f$ depends on it too and became a kind of 'oriented' version of cosine.
-That is pretty tricky and explanation about meaning of convolution on sphere is out of scope of this paper.
-Fact that this is convolution analogue related to \f$n\f$ is enough for now @ref ref_Aguilar17 "[Aguilar17]", @ref ref_Ramamoorthi01 "[Ramamoorthi01]".
-The goal of looking at integral from this angle is using of convolution's trait allowing to compute decomposition using just only coefficients of function and core.
-\f$\overline{\cos}\theta_l\f$ is independent from \f$\phi_l\f$ and in case of such radial symmetric cores the resulting coefficients boil down to following formula:
-
-\f[(L_i^{indirect}(l) \ast \overline{\cos}\theta_l)_i^j = \frac{1}{K_i^0}L_i^j\, c_i^0 = \sqrt{\frac{4\pi}{2i+1}}L_i^j\, c_i^0\f]
-
-Where \f$c_i^0\f$ are spherical harmonics factors corresponding to \f$\overline{\cos}\theta\f$.
-Therefore the final decomposition looks like:
-
-\f[\int\limits_{H(n)} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l = \int\limits_S L_i^{indirect}(l)\overline{\cos}\theta_l\, \mathrm{d}l = \sum_{i=0}^\infty \sum_{j = -i}^i \sqrt{\frac{4\pi}{2i+1}}L_i^j\, c_i^0\, y_i^j(n)\f]
-
-\f$c_i^0\f$ is left to be found.
-Due to independence from \f$\phi\f$ all \f$c_i^{j \neq 0} = 0\f$.
-The rest ones are calculated by regular dot product with basis functions:
-
-\f[c_i^0 = c_i = \int\limits_S y_i^0(l)\, \overline{\cos}\theta_l\, \mathrm{d}l = \int\limits_0^{2\pi} \mathrm{d}\phi \int\limits_0^\pi y_i^0(\theta, \phi)\, \overline{\cos}\theta \sin\theta\, \mathrm{d}\theta = \int\limits_0^{2\pi} \mathrm{d}\phi \int\limits_0^\frac{\pi}{2} y_i^0(\theta, \phi)\, \cos\theta\sin\theta\, \mathrm{d}\theta = \f]
-
-\f[= 2\pi\int\limits_0^\frac{\pi}{2} y_i^0(\theta, \phi)\, \cos\theta\sin\theta\, \mathrm{d}\theta = 2\pi K_i^0\int\limits_0^\frac{\pi}{2} P_i^0(\cos\theta)\, \cos\theta\sin\theta\, \mathrm{d}\theta\f]
-
-\f$\sin\theta\f$ appears due to transfer from integral over sphere to double integral where \f$\mathrm{d}l = \sin\theta\, \mathrm{d}\theta\, \mathrm{d}\phi\f$.
-There is an analytical solution for this expressions:
-
-\f[c_1 = \sqrt{\frac{\pi}{3}}\f]
-
-\f[c_{odd} = 0 \quad c_{even} = 2\pi\sqrt{\frac{2i+1}{4\pi}}\frac{(-1)^{\frac{i}{2}-1}}{(i+2)(i-1)}\frac{i!}{2^i\left(\frac{i!}{2}\right)^2}\f]
-
-Starting from about the third \f$c_i\f$ the coefficients become less and less valuable so that only couple of them is enough in order to approximate \f$\overline{\cos}\theta\f$ with appropriate accuracy.
-The same principle is true for convolution too because its coefficients are multiplied by \f$c_i\f$.
-So there is no need to use more than even three bands (\f$i = 0, 1, 2\f$) of basis functions.
-Lets write down them all in Cartesian coordinate @ref ref_Ramamoorthi01 "[Ramamoorthi01]":
-
-\f[y_0^0 = \frac{1}{2}\sqrt{\frac{1}{\pi}} = Y_0^0\f]
-
-\f[y_1^{-1} = -\frac{1}{2}\sqrt{\frac{3}{\pi}}y = Y_1^{-1}y\f]
-\f[y_1^0 = \frac{1}{2}\sqrt{\frac{3}{\pi}}z = Y_1^0z\f]
-\f[y_1^1 = -\frac{1}{2}\sqrt{\frac{3}{\pi}}x = Y_1^1x\f]
-
-\f[y_2^{-2} = \frac{1}{2}\sqrt{\frac{15}{\pi}}xy = Y_2^{-2}xy\f]
-\f[y_2^{-1} = -\frac{1}{2}\sqrt{\frac{15}{\pi}}yz = Y_2^{-1}yz\f]
-\f[y_2^0 = \frac{1}{4}\sqrt{\frac{5}{\pi}}(3z^2-1) = Y_2^0(3z^2-1)\f]
-\f[y_2^1 = -\frac{1}{2}\sqrt{\frac{15}{\pi}}xz = Y_2^1xz\f]
-\f[y_2^2 = \frac{1}{4}\sqrt{\frac{15}{\pi}}(x^2-y^2) = Y_2^2(x^2-y^2)\f]
-
-All \f$Y_i^j\f$ are just constants so that it can be moved from integral during calculations and can be taken from precomputed table.
-Other constants related to \f$c_i\f$ can be united and also be calculated beforehand:
-
-\f[\hat{c}_i = \frac{1}{K_i^0}\, c_i = \sqrt{\frac{4\pi}{2i+1}}\, c_i\f]
-
-Finally expression of irradiance map approximation can be defined:
-
-\f[\int\limits_{H(n)} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l \approx \sum_{i=0}^2 \sum_{j=-i}^i L_i^j\, \hat{c}_i\, y_i^j(n)\f]
-
-Where \f$\hat{c}_i\f$ is precalculated constants \f$y_i^j(n)\f$ are pretty easy functions and only \f$L_i^j\f$ are needed to be precomputed.
-Of course \f$L_i^j\f$ are integrals over even whole sphere but now there is only nine of it instead of one for every pixel of omnidirectional image.
-Moreover, texture is not needed at all in that case and only 9 colors representing \f$L_i^j\f$ have to be saved.
-The Monte-Carlo algorithm can be applied with just uniform samples distribution without importance sampling at all.
-\f$Y_i^j\f$ are used twice: in \f$L_i^j\f$ calculations and in sum after that.
-So there is sense to store only squares of it.
-All tables with constants presented below [[14](#(14))]:
-
-| |
-|-|
-| \f$(Y_0^0)^2 \approx (0.282095)^2\f$ |
-| \f$(Y_1^{-1})^2 = (Y_1^0)^2 = (Y_1^1)^2 \approx (0.488603)^2\f$ |
-| \f$(Y_2^{-2})^2 = (Y_2^{-1})^2 = (Y_2^1)^2 \approx (1.092548)^2\f$ |
-| \f$(Y_2^0)^2 \approx (0.315392)^2\f$ |
-| \f$(Y_2^2)^2 \approx (0.546274)^2\f$ |
-
-| | |
-|-|-|
-| \f$\hat{c}_0\f$ | \f$3.141593\f$ |
-| \f$\hat{c}_1\f$ | \f$2.094395\f$ |
-| \f$\hat{c}_2\f$ | \f$0.785398\f$ |
-
-Summarizing all mathematics above spherical harmonics decomposition boils down irradiance map to only 9 values which is needed to be precalculated as integrals.
-As practice shows this is very good approximation of diffuse indirect illumination component.
-
-@section pbr_transparency Transparent materials
-
-TODO
-
-@section pbr_low_discrepancy Low discrepancy sequence
-
-TODO
-
-@section pbr_references References
-
-* @anchor ref_Duvenhage13 **[Duvenhage13]**
-Bernardt Duvenhage, Kadi Bouatouch, D.G. Kourie,
-"Numerical Verification of Bidirectional Reflectance Distribution Functions for Physical Plausibility",
-*Proceedings of the South African Institute for Computer Scientists and Information Technologists Conference*,
-October 2013.
-
-* @anchor ref_Cook81 **[Cook81]**
-Robert Cook, Kenneth Torrance,
-"A Refectance Model for Computer Graphics",
-*SIGGRAPH '81: Proceedings of the 8th annual conference on Computer graphics and interactive techniques*,
-August 1981, pp. 307-316.
-
-* @anchor ref_Karis13 **[Karis13]**
-Brian Karis, "Real Shading in Unreal Engine 4", *SIGGRAPH 2013 Presentation Notes*.
-
-* @anchor ref_Heitz14 **[Heitz14]**
-Eric Heitz, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs",
-*Journal of Computer Graphics Techniques*, Vol. 3, No. 2, 2014.
-
-* @anchor ref_Schlick94 **[Schlick94]**
-Christophe Schlick, "An inexpensive brdf model for physically-based rendering",
-*Computer Graphics Forum 13*, 1994, pp. 233-246.
-
-* @anchor ref_Lazanyi05 **[Lazanyi05]**
-Istvan Lazanyi, Lazslo Szirmay-Kalos, "Fresnel term approximations for Metals", January 2005.
-
-* @anchor ref_Lagarde13 **[Lagarde13]**
-Sebastien Lagarde, "Memo on Fresnel equations",
-*Blog post*: [https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/](https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/).
-
-* @anchor ref_Walter07 **[Walter07]**
-Bruce Walter, Stephen Marschner, Hongsong Li, Kenneth Torrance,
-"Microfacet Models for Refraction through Rough Surfaces", *Proceedings of Eurographics Symposium on Rendering*, 2007.
-
-* @anchor ref_Cao15 **[Cao15]**
-Jiayin Cao, "Sampling microfacet BRDF", November 1, 2015,
-*Blog post*: [https://agraphicsguy.wordpress.com/2015/11/01/sampling-microfacet-brdf/](https://agraphicsguy.wordpress.com/2015/11/01/sampling-microfacet-brdf/).
-
-* @anchor ref_Schutte18 **[Schutte18]**
-Joe Schutte, "Sampling techniques for GGX with Smith Masking-Shadowing: Part 1", March 7, 2018,
-*Blog post*: [https://schuttejoe.github.io/post/ggximportancesamplingpart1/](https://schuttejoe.github.io/post/ggximportancesamplingpart1/).
-
-* @anchor ref_Colbert07 **[Colbert07]**
-Mark Colbert, Jaroslav Krivanek, "GPU-Based Importance Sampling", *NVIDIA GPU Gems 3*, Chapter 20, 2007.
-
-* @anchor ref_Guy18 **[Guy18]**
-Romain Guy, Mathias Agopian, "Physically Based Rendering in Filament", *Part of Google's Filament project documentation*:
-[https://google.github.io/filament/](https://google.github.io/filament/Filament.md.html)
-
-* @anchor ref_Aguilar17 **[Aguilar17]**
-Orlando Aguilar, "Spherical Harmonics", *Blog post*:
-[http://orlandoaguilar.github.io/sh/spherical/harmonics/irradiance/map/2017/02/12/SphericalHarmonics.html](http://orlandoaguilar.github.io/sh/spherical/harmonics/irradiance/map/2017/02/12/SphericalHarmonics.html)
-
-* @anchor ref_Ramamoorthi01 **[Ramamoorthi01]**
-Ravi Ramamoorthi, Pat Hanrahan, "An Efficient Representation for Irradiance Environment Maps",
-*SIGGRAPH '01: Proceedings of the 28th annual conference on Computer graphics and interactive techniques*, August 2001, pp. 497-500
diff --git a/dox/specification/boolean_operations/boolean_operations.md b/dox/specification/boolean_operations/boolean_operations.md
new file mode 100644 (file)
index 0000000..4cd09f4
--- /dev/null
@@ -0,0 +1,3562 @@
+Boolean Operations {#specification__boolean_operations}
+=========================
+
+@tableofcontents
+
+@section specification__boolean_1 Introduction
+
+Boolean operations are used to create new shapes from the combinations of two groups of shapes.
+This document provides a comprehensive description of the algorithms in the Boolean Operations Component as it is implemented in Open CASCADE Technology. The Boolean Component contains:
+
+* General Fuse Operator (GFA), 
+* Boolean Operator (BOA), 
+* Section Operator (SA), 
+* Splitter Operator (SPA). 
+
+GFA is the base algorithm for BOA, SPA, SA.
+
+GFA has a history-based architecture designed to allow using OCAF naming functionality. The architecture of GFA is expandable, that allows creating new algorithms basing on it.
+
+
+@section specification__boolean_2 Overview 
+
+@subsection specification__boolean_2_1 Operators
+
+@subsubsection specification__boolean_2_1_1 Boolean operator
+
+The Boolean operator provides the following operations between two groups *Objects* and *Tools*:
+* FUSE - Union of two groups;
+* COMMON - Intersection of two groups;
+* CUT - Difference between two groups.
+
+Each group consists of an arbitrary number of arguments in terms of *TopoDS_Shape*.
+
+The operator can be represented as:
+
+<i>R<sub>B</sub>=B<sub>j</sub> (G<sub>1</sub>, G<sub>2</sub>),</i>     
+
+where:
+* *R<sub>B</sub>* -- result of the operation;
+* *B<sub>j</sub>* -- operation of type *j* (Common, Fuse, Cut);
+* *G<sub>1</sub>={S<sub>11</sub>, S<sub>12</sub> ... S<sub>1n1</sub>}*  group of arguments (Objects); 
+* *G<sub>2</sub>={S<sub>21</sub>, S<sub>22</sub> ... S<sub>2n2</sub>}*  group of arguments (Tools);
+* *n<sub>1</sub>* -- Number of arguments in *Objects* group; 
+* *n<sub>2</sub>* -- Number of arguments in *Tools* group.
+
+
+**Note** There is an operation *Cut21*, which is an extension for forward Cut operation, i.e <i>Cut21=Cut(G2, G1)</i>.
+
+For more details see @ref specification__boolean_9 "Boolean Operations Algorithm" section.
+
+@subsubsection specification__boolean_2_1_2 General Fuse operator
+
+The General fuse operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*.
+
+The GFA operator can be represented as:
+
+<i>R<sub>GF</sub> = GF (S<sub>1</sub>, S<sub>2</sub> ... S<sub>n</sub>), </i>  
+
+where
+* *R<sub>GF</sub>* -- result of the operation,
+* *S<sub>1</sub>, S<sub>2</sub> ... S<sub>n</sub>* -- arguments of the operation,
+* *n* -- number of arguments.
+
+The result of the Boolean operator, *R<sub>B</sub>*, can be obtained from *R<sub>GF</sub>*.
+
+For example, for two arguments *S<sub>1</sub>* and *S<sub>2</sub>* the result *R<sub>GF</sub>* is
+
+<i>R<sub>GF</sub> = GF (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub> + S<sub>p2</sub> + S<sub>p12</sub></i>  
+
+@figure{/specification/boolean_operations/images/operations_image001.svg,"Operators",320}
+
+This Figure shows that 
+* <i>B<sub>common</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p12</sub>;</i>
+* <i>B<sub>cut12</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub>;</i>
+* <i>B<sub>cut21</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p2</sub>;</i>
+* <i>B<sub>fuse</sub> (S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub>+S<sub>p2</sub>+S<sub>p12</sub></i>
+
+<i>R<sub>GF</sub>=GF (S<sub>1</sub>, S<sub>2</sub>) = B<sub>fuse</sub> = B<sub>common</sub>+ B<sub>cut12</sub>+ B<sub>cut21</sub>.</i>
+
+The fact that *R<sub>GF</sub>* contains the components of *R<sub>B</sub>* allows considering GFA as the general case of BOA. So it is possible to implement BOA as a subclass of GFA.
+
+For more details see @ref specification__boolean_7 "General Fuse Algorithm" section.
+
+@subsubsection specification__boolean_2_1_3 Splitter operator 
+
+The Splitter operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. The arguments are divided into two groups: *Objects* and *Tools*. The result of *SPA* contains all parts that belong to the *Objects* but does not contain the parts that belong to the *Tools*.
+
+The *SPA* operator can be represented as follows:
+
+<i>R<sub>SPA</sub>=SPA (G<sub>1</sub>, G<sub>2</sub>),</i>
+where:
+* <i>R<sub>SPA</sub></i> -- is the result of the operation; 
+* *G<sub>1</sub>={S<sub>11</sub>, S<sub>12</sub> ... S<sub>1n1</sub>}*  group of arguments (*Objects*); 
+* *G<sub>2</sub>={S<sub>21</sub>, S<sub>22</sub> ... S<sub>2n2</sub>}*  group of arguments (*Tools*);
+* *n<sub>1</sub>* -- Number of arguments in *Objects* group; 
+* *n<sub>2</sub>* -- Number of arguments in *Tools* group.
+
+The result *R<sub>SPA</sub>* can be obtained from *R<sub>GF</sub>* .
+
+For example, for two arguments *S<sub>1</sub>* and  *S<sub>2</sub>* the result *R<sub>SPA</sub>* is
+
+<i>R<sub>SPA</sub>=SPA(S<sub>1</sub>,S<sub>2</sub>)=S<sub>p1</sub>+S<sub>p12</sub>.</i>      
+
+In case when all arguments of the *SPA* are *Objects* and there are no *Tools*, the result of *SPA* is equivalent to the result of *GFA*. 
+
+For example, when *G<sub>1</sub>* consists of shapes *S<sub>1</sub>* and *S<sub>2</sub>* the result of *SPA* is
+
+<i>R<sub>SPA</sub>=SPA(S<sub>1</sub>, S<sub>2</sub>) = S<sub>p1</sub> + S<sub>p2</sub> + S<sub>p12</sub> = GF (S<sub>1</sub>, S<sub>2</sub>)</i>
+
+The fact that the *R<sub>GF</sub>* contains the components of *R<sub>SPA</sub>* allows considering *GFA* as the general case of *SPA*. Thus, it is possible to implement *SPA* as a subclass of *GFA*.
+
+For more details see @ref specification__boolean_8 "Splitter Algorithm" section.
+
+@subsubsection specification__boolean_2_1_4 Section operator
+
+The Section operator *SA* can be applied to arbitrary number of arguments in terms of *TopoDS_Shape*. The result of *SA* contains vertices and edges in accordance with interferences between the arguments 
+The SA operator can be represented as follows:
+<i>R<sub>SA</sub>=SA(S1, S2… Sn)</i>, where
+* <i>R<sub>SA</sub></i> -- the operation result;
+* <i>S1, S2 ... Sn</i> -- the operation arguments;
+* *n* -- the number of arguments.
+
+For more details see @ref specification__boolean_10a "Section Algorithm" section.
+
+@subsection specification__boolean_2_2 Parts of algorithms 
+
+GFA, BOA, SPA and SA have the same Data Structure (DS). The main goal of the Data Structure is to store all necessary information for input data and intermediate results.
+
+The operators consist of two main parts:
+*      Intersection Part (IP). The main goal of IP is to compute the interferences between sub-shapes of arguments. The IP uses DS to retrieve input data and store the results of intersections.
+*      Building Part (BP). The main goal of BP is to build required result of an operation. This part also uses DS to retrieve data and store the results.
+
+As it follows from the definition of operator results, the main differences between GFA, BOA, SPA and SA are in the Building Part. The Intersection Part is the same for the algorithms.
+
+@section specification__boolean_3 Terms and Definitions
+
+This chapter provides the background terms and definitions that are necessary to understand how the algorithms work. 
+
+@subsection specification__boolean_3_1 Interferences
+
+There are two groups of interferences.
+
+At first, each shape having a boundary representation (vertex, edge, face) has an internal value of geometrical tolerance. The shapes interfere with each other in terms of their tolerances. The shapes that have a boundary representation interfere when there is a part of 3D space where the distance between the underlying geometry of shapes is less or equal to the sum of tolerances of the shapes. Three types of shapes: vertex, edge and face -- produce six types of **BRep interferences:**
+* Vertex/Vertex,
+* Vertex/Edge,
+* Vertex/Face,
+* Edge/Edge, 
+* Edge/Face and 
+* Face/Face.
+
+At second, there are interferences that occur between a solid *Z1* and a shape *S2* when *Z1* and *S2* have no BRep interferences but *S2* is completely inside of *Z1*. These interferences are **Non-BRep interferences**. There are four possible cases:
+* Vertex/Solid, 
+* Edge/Solid, 
+* Face/Solid and 
+* Solid/Solid.
+
+@subsubsection specification__boolean_3_1_1 Vertex/Vertex interference
+
+For two vertices *Vi* and *Vj*, the distance between their corresponding 3D points is less than the sum of their tolerances *Tol(Vi)* and *Tol(Vj)*.
+
+@figure{/specification/boolean_operations/images/operations_image002.svg,"Vertex/vertex interference",420}
+
+The result is a new vertex *Vn* with 3D point *Pn* and tolerance value <i>Tol(Vn)</i>. 
+
+The coordinates of *Pn* and the value <i>Tol(Vn)</i> are computed as the center and the radius of the sphere enclosing the tolerance spheres of the source vertices <i>(V1, V2)</i>.
+
+@subsubsection specification__boolean_3_1_2    Vertex/Edge interference
+
+For a vertex *Vi* and an edge *Ej*, the distance *D* between 3D point of the vertex and its projection on the 3D curve of edge *Ej* is less or equal than sum of tolerances of vertex *Tol(Vi)* and edge *Tol(Ej)*.
+
+@figure{/specification/boolean_operations/images/operations_image003.svg,"Vertex/edge interference",420}
+
+The result is vertex *Vi* with the corresponding tolerance value <i>Tol(Vi)=Max(Tol(Vi), D+Tol(Ej))</i>, where <i>D = distance (Pi, PPi)</i>; 
+
+and parameter *t<sub>i</sub>* of the projected point *PPi* on 3D curve *Cj* of edge *Ej*.
+
+@subsubsection specification__boolean_3_1_3    Vertex/Face interference
+
+For a vertex *Vi* and a face *Fj* the distance *D* between 3D point of the vertex and its projection on the surface of the face is less or equal than sum of tolerances of the vertex *Tol(Vi)* and the face *Tol(Fj)*. 
+
+@figure{/specification/boolean_operations/images/operations_image004.svg,"Vertex/face interference",420}
+
+The result is vertex *Vi* with the corresponding tolerance value <i>Tol(Vi)=Max(Tol(Vi), D+Tol(Fj))</i>, where <i>D = distance (Pi, PPi)</i>
+
+and parameters <i>u<sub>i</sub>, v<sub>i</sub></i> of the projected point *PPi* on surface *Sj* of face *Fj*.
+
+@subsubsection specification__boolean_3_1_4    Edge/Edge interference
+
+For two edges *Ei* and *Ej* (with the corresponding 3D curves *Ci* and *Cj*) there are some places where the distance between the curves is less than (or equal to) sum of tolerances of the edges. 
+
+Let us examine two cases:
+
+In  the first case two edges have one or several common parts of 3D curves in terms of tolerance.
+
+@figure{/specification/boolean_operations/images/operations_image005.svg,"Edge/edge interference: common parts",420}
+
+The results are: 
+* Parametric range <i>[t<sub>i1</sub>, t<sub>i2</sub> ]</i> for 3D curve *Ci* of edge *Ei*.
+* Parametric range <i>[t<sub>j1</sub>, t<sub>j2</sub> ]</i> for 3D curve *Cj* of edge *Ej*. 
+
+In the second case two edges have one or several common points in terms of tolerance.
+
+@figure{/specification/boolean_operations/images/operations_image006.svg,"Edge/edge interference: common points",420}
+
+The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*.
+
+The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curves *Ci*, *Cj* of source edges *Ei*, *Ej*. 
+
+* Parameter *t<sub>i</sub>* of *Pi* for the 3D curve *Ci*.
+* Parameter *t<sub>j</sub>* of *Pj* for the 3D curve *Cj*.
+
+@subsubsection specification__boolean_3_1_5    Edge/Face interference
+
+For an edge *Ei* (with the corresponding 3D curve *Ci*) and a face *Fj* (with the corresponding 3D surface *Sj*) there are some places in 3D space, where the distance between *Ci* and surface *Sj* is less than (or equal to) the sum of tolerances of edge *Ei* and face *Fj*.
+
+Let us examine two cases:
+
+In the first case Edge *Ei* and Face *Fj* have one or several common parts in terms of tolerance. 
+
+@figure{/specification/boolean_operations/images/operations_image007.svg,"Edge/face interference: common parts",420}
+
+The result is a parametric range <i>[t<sub>i1</sub>, t<sub>i2</sub>]</i> for the 3D curve *Ci* of the edge *Ei*.
+
+In the second case Edge *Ei* and Face *Fj* have one or several common points in terms of tolerance.
+
+@figure{/specification/boolean_operations/images/operations_image008.svg,"Edge/face interference: common points",420}
+
+The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*. 
+
+The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curve *Ci* and surface *Sj* of source edges *Ei*, *Fj*.
+
+*      Parameter *t<sub>i</sub>* of *Pi* for the 3D curve *Ci*.
+*      Parameters *u<sub>i</sub>* and *v<sub>i</sub>* of the projected point *PPi* on the surface *Sj* of the face *Fj*.
+
+@subsubsection specification__boolean_3_1_6    Face/Face Interference
+
+For a face *Fi* and a face *Fj* (with the corresponding surfaces *Si* and *Sj*) there are some places in 3D space, where the distance between the surfaces is less than (or equal to) sum of tolerances of the faces.
+
+@figure{/specification/boolean_operations/images/operations_image009.svg,"Face/face interference: common curves",418}
+
+In the first case the result contains intersection curves *C<sub>ijk</sub> (k = 0, 1, 2…k<sub>N</sub>,* where *k<sub>N</sub>* is the number of intersection curves with corresponding values of tolerances *Tol(C<sub>ijk</sub>)*.
+
+@figure{/specification/boolean_operations/images/operations_image010.svg,"Face/face interference: common points",305}
+
+In the second case Face *Fi* and face *Fj* have one or several new vertices *V<sub>ijm</sub>*, where <i>m=0,1,2, ... mN, mN </i> is the number of intersection points.
+
+The coordinates of a 3D point *P<sub>ijm</sub>* and the value *Tol(V<sub>ijm</sub>)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of the surface *Si*, *Sj* of source shapes *Fi*, *Fj*.
+
+* Parameters *u<sub>j</sub>*, *v<sub>j</sub>* belong to point *PPj* projected on surface *Sj* of face *Fj*.
+* Parameters *u<sub>i</sub>* and *v<sub>i</sub>* belong to point *PPi* projected on surface *Si* of face *Fi*. 
+
+@subsubsection specification__boolean_3_1_7    Vertex/Solid Interference
+
+For a vertex *Vi* and a solid *Zj* there is Vertex/Solid interference if the vertex *Vi* has no BRep interferences with any sub-shape of *Zj* and *Vi* is completely inside the solid *Zj*.
+
+@figure{/specification/boolean_operations/images/operations_image060.png,"Vertex/Solid Interference",220}
+
+@subsubsection specification__boolean_3_1_8 Edge/Soild Interference
+
+For an edge *Ei* and a solid *Zj* there is Edge/Solid interference if the edge *Ei* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Ei* is completely inside the solid *Zj*.
+
+@figure{/specification/boolean_operations/images/operations_image061.png,"Edge/Solid Interference",220}
+
+@subsubsection specification__boolean_3_1_9 Face/Soild Interference
+
+For a face *Fi* and a solid *Zj* there is Face/Solid interference if the face *Fi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Fi* is completely inside the solid *Zj*. 
+
+@figure{/specification/boolean_operations/images/operations_image062.png,"Face/Solid Interference",220}
+
+@subsubsection specification__boolean_3_1_10  Solid/Soild Interference
+
+For a solid *Zi* and a solid *Zj* there is Solid/Solid interference if the solid *Zi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Zi* is completely inside the solid *Zj*. 
+
+@figure{/specification/boolean_operations/images/operations_image063.png,"Solid/Solid Interference",220}
+
+
+@subsubsection specification__boolean_3_1_11 Computation Order
+
+The interferences between shapes are computed on the basis of increasing of the dimension value of the shape in the following order: 
+* Vertex/Vertex, 
+* Vertex/Edge, 
+* Edge/Edge, 
+* Vertex/Face, 
+* Edge/Face, 
+* Face/Face, 
+* Vertex/Solid,
+* Edge/Solid,
+* Face/Solid,
+* Solid/Solid.
+
+This order allows avoiding the computation of redundant interferences between upper-level shapes *Si* and  *Sj* when there are interferences between lower sub-shapes *Sik* and *Sjm*.
+
+@subsubsection specification__boolean_3_1_12   Results
+
+* The result of the interference is a shape that can be either interfered shape itself (or its part) or a new shape.
+* The result of the interference is a shape with the dimension value that is less or equal to the minimal dimension value of interfered shapes. For example, the result of Vertex/Edge interference is a vertex, but not an edge.
+* The result of the interference splits the source shapes on the parts each time as it can do that.
+
+@subsection specification__boolean_3_2 Paves
+
+The result of interferences of the type Vertex/Edge, Edge/Edge and Edge/Face in most cases is a vertex (new or old) lying on an edge.
+
+The result of interferences of the type Face/Face in most cases is intersection curves, which go through some vertices lying on the faces.
+
+The position of vertex *Vi* on curve *C* can be defined by a value of parameter <i>t<sub>i</sub></i> of the 3D point of the vertex on the curve.
+Pave *PVi* on curve *C* is a structure containing the vertex *Vi* and correspondent value of the parameter  <i>t<sub>i</sub></i> of the 3D point of the vertex on the curve. Curve *C* can be a 3D or a 2D curve.
+
+@figure{/specification/boolean_operations/images/operations_image011.svg,"Paves",340}
+
+Two paves *PV1* and *PV2* on the same curve *C* can be compared using the parameter value @code PV1 > PV2 if t1 > t2 @endcode  
+
+The usage of paves allows binding of the vertex to the curve (or any structure that contains a curve: edge, intersection curve).
+
+
+@subsection specification__boolean_3_3 Pave Blocks
+
+A set of paves *PVi (i=1, 2...nPV)*, where *nPV* is the number of paves] of curve *C* can be sorted in the increasing order using the value of parameter *t* on curve *C*.
+
+A pave block *PBi* is a part of the object (edge, intersection curve) between neighboring paves. 
+
+@figure{/specification/boolean_operations/images/operations_image012.svg,"Pave Blocks",340}
+
+Any finite source edge *E* has at least one pave block that contains two paves *PVb* and *PVe*:
+* Pave *PVb* corresponds to the vertex *Vb* with minimal parameter <i>t<sub>b</sub></i> on the curve of the edge.
+* Pave *PVe* corresponds to the vertex *Ve* with maximal parameter <i>t<sub>e</sub></i> on the curve of the edge.
+
+@subsection specification__boolean_3_4 Shrunk Range
+
+Pave block *PV* of curve *C* is bounded by vertices *V1* and *V2* with tolerance values *Tol(V1)* and *Tol(V2)*. Curve *C* has its own tolerance value *Tol(C)*:
+* In case of edge, the tolerance value is the tolerance of the edge.
+* In case of intersection curve, the tolerance value is obtained from an intersection algorithm.
+
+@figure{/specification/boolean_operations/images/operations_image013.svg,"Shrunk Range",340}
+
+The theoretical parametric range of the pave block is <i>[t1C, t2C]</i>.
+
+The positions of the vertices *V1* and *V2* of the pave block can be different. The positions are determined by the following conditions:
+~~~~
+Distance (P1, P1c) is equal or less than Tol(V1) + Tol(C)
+Distance (P2, P2c) is equal or less than Tol(V2) + Tol(C)
+~~~~
+The Figure shows that each tolerance sphere of a vertex can reduce the parametric range of the pave block to a range <i>[t1S, t2S]</i>. The range <i>[t1S, t2S]</i> is the shrunk range of the pave block. 
+
+The shrunk range of the pave block is the part of 3D curve that can interfere with other shapes.
+
+@subsection specification__boolean_3_5 Common Blocks
+
+The interferences of the type Edge/Edge, Edge/Face produce results as common parts.
+
+In case of Edge/Edge interference the common parts are pave blocks that have different base edges. 
+
+@figure{/specification/boolean_operations/images/operations_image014.svg,"Common Blocks: Edge/Edge interference",340}
+
+If the pave blocks <i>PB<sub>1</sub>, PB<sub>2</sub>…PB<sub>NbPB</sub></i> , where *NbPB* is the number of pave blocks have the same bounding vertices and geometrically coincide, the pave blocks form common block *CB*.
+       
+
+In case of Edge/Face interference the common parts are pave blocks lying on a face(s).
+
+@figure{/specification/boolean_operations/images/operations_image015.svg,"Common Blocks: Edge/Face interference",265}
+
+If the pave blocks *PBi* geometrically coincide with a face *Fj*, the pave blocks form common block *CB*.
+
+In general case a common block *CB* contains:
+* Pave blocks *PBi (i=0,1,2, 3… NbPB)*.
+* A set of faces *Fj (j=0,1... NbF), NbF* -- number of faces.
+
+
+@subsection specification__boolean_3_6 FaceInfo
+
+The structure *FaceInfo* contains the following information:
+* Pave blocks that have state **In** for the face;
+* Vertices that have state **In** for the face;
+* Pave blocks that have state **On** for the face;
+* Vertices that have state **On** for the face;
+* Pave blocks built up from intersection curves for the face;
+* Vertices built up from intersection points for the face.
+
+@figure{/specification/boolean_operations/images/operations_image016.svg,"Face Info",420}
+
+In the figure, for face *F1*:
+* Pave blocks that have state **In** for the face: *PB<sub>in1</sub>*.
+* Vertices that have state **In** for the face: *V<sub>in1</sub>*.
+* Pave blocks that have state **On** for the face: *PB<sub>on11</sub>*,  *PB<sub>on12</sub>*, *PB<sub>on2</sub>*, *PB<sub>on31</sub>*, *PB<sub>on32</sub>*, *PB<sub>on4</sub>*.
+* Vertices that have state **On** for the face: *V1, V2, V3, V4, V5, V6*.
+* Pave blocks built up from intersection curves for the face: *PB<sub>sc1</sub>*.
+* Vertices built up from intersection points for the face: none
+
+
+@section specification__boolean_4 Data Structure
+
+Data Structure (DS) is used to:
+* Store information about input data and intermediate results;
+* Provide the access to the information;
+* Provide the links between the chunks of information.
+
+This information includes:
+* Arguments;
+* Shapes;
+* Interferences;
+* Pave Blocks;
+* Common Blocks.
+
+Data Structure is implemented in the class *BOPDS_DS*.
+
+@subsection specification__boolean_4_1 Arguments
+
+The arguments are shapes (in terms of *TopoDS_Shape*):
+* Number of arguments is unlimited.
+* Each argument is a valid shape (in terms of *BRepCheck_Analyzer*).
+* Each argument can be of one of the following types (see the Table):
+
+| No   | Type  | Index of Type |
+| :----- | :----- | :----- |
+| 1    | COMPOUND      | 0 |
+| 2    | COMPSOLID     | 1 |
+| 3    | SOLID | 2 |
+| 4    | SHELL | 3 |
+| 5    | FACE  | 4 |
+| 6    | WIRE  | 5 | 
+| 7    | EDGE  | 6 | 
+| 8    | VERTEX | 7 | 
+
+* The argument of type *0 (COMPOUND)* can include any number of shapes of an arbitrary type (0, 1…7).
+* The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) must share these entities.
+* There are no restrictions on the type of underlying geometry of the shapes. The faces or edges of arguments *S<sub>i</sub>* can have underlying geometry of any type supported by Open CASCADE Technology modeling algorithms (in terms of *GeomAbs_CurveType* and *GeomAbs_SurfaceType*). 
+* The faces or edges of the arguments should have underlying geometry with continuity that is not less than C1.
+
+@subsection specification__boolean_4_2 Shapes
+
+The information about  Shapes is stored in  structure *BOPDS_ShapeInfo*. The objects of type *BOPDS_ShapeInfo* are stored in the container of array type. The array allows getting the access to the information by an index (DS index).
+The structure *BOPDS_ShapeInfo* has the following contents:
+
+
+| Name | Contents |
+| :-------- | :----- |
+| *myShape* |  Shape itself |
+| *myType* |   Type of shape |
+| *myBox* |    3D bounding box of the shape |
+| *mySubShapes* | List of DS indices of sub-shapes |
+| *myReference* | Storage for some auxiliary information |
+| *myFlag* | Storage for some auxiliary information |
+
+@subsection specification__boolean_4_3 Interferences 
+
+The information about interferences is stored in the instances of classes that are inherited from class <i>BOPDS_Interf</i>. 
+
+| Name  | Contents |
+| :----- | :----- | 
+| *BOPDS_Interf* |     Root class for interference |
+| *Index1*     | DS index of the shape 1 |
+| *Index2*     | DS index of the shape 2 |
+| *BOPDS_InterfVV* | Storage for Vertex/Vertex interference |
+| *BOPDS_InterfVE* | Storage for Vertex/Edge interference |
+| *myParam* | The value of parameter of the point of the vertex on the curve of the edge |
+| *BOPDS_InterfVF* | Storage for Vertex/Face interference |
+| *myU, myV* | The value of parameters of the point of the vertex on the surface of the face |
+| *BOPDS_InterfEE* | Storage for Edge/Edge interference |
+| *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) |
+| *BOPDS_InterfEF* | Storage for Edge/Face interference |
+| *myCommonPart*       | Common part (in terms of *IntTools_CommonPart* ) | 
+| *BOPDS_InterfFF* | Storage for Face/Face interference |
+| *myTolR3D, myTolR2D* | The value of tolerances of curves (points) reached in 3D and 2D |
+| *myCurves* | Intersection Curves (in terms of *BOPDS_Curve*) |
+| *myPoints* | Intersection Points (in terms of *BOPDS_Point*) |
+| *BOPDS_InterfVZ* | Storage for Vertex/Solid interference |
+| *BOPDS_InterfEZ* | Storage for Edge/Solid interference |
+| *BOPDS_InterfFZ* | Storage for Face/Solid interference |
+| *BOPDS_InterfZZ* | Storage for Solid/Solid interference | 
+
+
+
+
+
+The Figure shows inheritance diagram for *BOPDS_Interf* classes.
+
+@figure{/specification/boolean_operations/images/operations_image017.svg,"BOPDS_Interf classes",420}
+
+
+@subsection specification__boolean_4_4 Pave, PaveBlock and CommonBlock
+
+The information about the pave is stored in objects of type *BOPDS_Pave*.
+
+| Name | Contents |
+| :--- | :------ |
+| *BOPDS_Pave* | |
+| *myIndex* |  DS index of the vertex |
+| *myParam* |  Value of the parameter of the 3D point of vertex on curve. |
+
+The information about pave blocks is stored in objects of type *BOPDS_PaveBlock*.
+
+| Name | Contents |
+| :--- | :------ |
+| *BOPDS_PaveBlock*    | |
+| *myEdge* | DS index of the edge produced from the pave block |
+| *myOriginalEdge* | DS index of the source edge |
+| *myPave1* | Pave 1 (in terms of *BOPDS_Pave*) |
+| *myPave2* | Pave 2 (in terms of *BOPDS_Pave*) |
+| *myExtPaves* | The list of paves (in terms of *BOPDS_Pave*) that is used to store paves lying inside the pave block during intersection process |
+| *myCommonBlock* | The reference to common block (in terms of *BOPDS_CommonBlock*) if  the pave block is a common block |
+| *myShrunkData* | The shrunk range of the pave block |
+
+* To be bound to an edge (or intersection curve) the structures of type *BOPDS_PaveBlock* are stored in one container of list type <i>(BOPDS_ListOfPaveBlock)</i>.
+* In case of edge, all the lists of pave blocks above are stored in one container of array type. The array allows getting the access to the information by index of the list of pave blocks for the edge. This index (if exists) is stored in the field *myReference*.
+
+The information about common block is stored in objects of type *BOPDS_CommonBlock*.
+
+| Name | Contents |
+| :---- | :------ |
+| *BOPDS_CommonBlock* | |      
+| *myPaveBlocks* | The list of pave blocks that are common in terms of @ref specification__boolean_3_5 "Common Blocks" |
+| *myFaces* | The list of DS indices of the faces, on which the pave blocks lie. |
+
+
+@subsection specification__boolean_4_5 Points and Curves
+The information about intersection point is stored in objects of type *BOPDS_Point*. 
+
+| Name | Contents |
+| :---- | :----- |
+| *BOPDS_Point* | |    
+| *myPnt* |    3D point |
+| *myPnt2D1* | 2D point on the face1 |
+| *myPnt2D2* | 2D point on the face2 |
+
+The information about intersection curve is stored in objects of type *BOPDS_Curve*.
+
+| Name | Contents |
+| :---- | :----- | 
+| *BOPDS_Curve*        | |
+| *myCurve* | The intersection curve (in terms of *IntTools_Curve* ) |
+| *myPaveBlocks* | The list of pave blocks that belong to the curve | 
+| *myBox* | The bounding box of the curve (in terms of *Bnd_Box* ) |
+
+@subsection specification__boolean_4_6 FaceInfo
+The information about *FaceInfo* is stored in a structure *BOPDS_FaceInfo*. 
+The structure *BOPDS_FaceInfo* has the following contents.
+
+| Name | Contents |
+| :---- | :----- |
+| *BOPDS_FaceInfo* | | 
+| *myPaveBlocksIn* | Pave blocks that have state In for the face |
+| *myVerticesIn* | Vertices that have state In for the face | 
+| *myPaveBlocksOn* | Pave blocks that have state On for the face |
+| *myVerticesOn* | Vertices that have state On for the face | 
+| *myPaveBlocksSc* | Pave blocks built up from intersection curves for the face |
+| *myVerticesSc* | Vertices built up from intersection points for the face +
+
+The objects of type *BOPDS_FaceInfo* are stored in one container of array type. The array allows getting the access to the information by index. This index (if exists) is stored in the field *myReference*.
+
+@section specification__boolean_root_classes Root Classes
+
+@subsection specification__boolean_root_classes_1 Class BOPAlgo_Options
+The class *BOPAlgo_Options* provides the following options for the algorithms:
+* Set the appropriate memory allocator;
+* Check the presence of the Errors and Warnings;
+* Turn on/off the parallel processing;
+* Set the additional tolerance for the operation;
+* Break the operations by user request;
+* Usage of Oriented Bounding boxes in the operation.
+
+@subsection specification__boolean_root_classes_2 Class BOPAlgo_Algo
+
+The class *BOPAlgo_Algo* provides the base interface for all algorithms:
+* Perform the operation;
+* Check the input data;
+* Check the result.
+
+@section specification__boolean_5      Intersection Part
+
+Intersection Part (IP) is used to
+* Initialize the Data Structure;
+* Compute interferences between the arguments (or their sub-shapes);
+* Compute same domain vertices, edges;
+* Build split edges;
+* Build section edges;
+* Build p-curves;
+* Store all obtained information in DS.
+
+IP is implemented in the class *BOPAlgo_PaveFiller*.
+
+@figure{/specification/boolean_operations/images/operations_image064.png,"Diagram for Class BOPAlgo_PaveFiller",230}
+
+The description provided in the next paragraphs is coherent with the implementation of the method *BOPAlgo_PaveFiller::Perform()*.
+
+@subsection specification__boolean_5_1 Initialization
+The input data for the step is the Arguments. The description of initialization step is shown in the Table.
+
+| No   | Contents |    Implementation |
+| :--- | :----- | :----- |
+| 1    | Initialization the array of shapes (in terms of @ref specification__boolean_4_2 "Shapes"). Filling the array of shapes. | *BOPDS_DS::Init()* |
+| 2    | Initialization the array pave blocks (in terms of @ref specification__boolean_4_4 "Pave, PaveBlock, CommonBlock") | *BOPDS_DS::Init()* |
+| 3    | Initialization of intersection Iterator. The intersection Iterator is the object that computes intersections between sub-shapes of the arguments in terms of bounding boxes. The intersection Iterator provides approximate number of the interferences for given type (in terms of @ref specification__boolean_3_1 "Interferences") | *BOPDS_Iterator* |
+| 4    | Initialization of intersection Context. The intersection Context is an object that contains geometrical and topological toolkit (classifiers, projectors, etc). The intersection Context is used to cache the tools to increase the algorithm performance. | *IntTools_Context* |
+
+
+@subsection specification__boolean_5_2 Compute Vertex/Vertex Interferences
+
+The input data for this step is the DS after the @ref specification__boolean_5_1 "Initialization". The description of this step is shown in the table :
+
+
+| No | Contents        | Implementation |
+| :--- | :---- | :----- | 
+| 1 | Initialize array of Vertex/Vertex interferences. | *BOPAlgo_PaveFiller::PerformVV()* |
+| 2 | Access to the pairs of interfered shapes <i>(nVi, nVj)k, k=0, 1…nk,</i> where *nVi* and *nVj* are DS indices of vertices *Vi* and *Vj* and *nk* is the number of pairs. | *BOPDS_Iterator* |
+| 3 | Compute the connexity chains of interfered vertices *nV1C, nV2C… nVnC)k, C=0, 1…nCs*, where *nCs* is the number of the connexity chains |    *BOPAlgo_Tools::MakeBlocksCnx()* |
+| 4    | Build new vertices from the chains *VNc. C=0, 1…nCs.* |     *BOPAlgo_PaveFiller::PerformVV()* |
+| 5    | Append new vertices in DS. |  *BOPDS_DS::Append()* |
+| 6    | Append same domain vertices in DS. | *BOPDS_DS::AddShapeSD()* |
+| 7 | Append Vertex/Vertex interferences  in DS. | *BOPDS_DS::AddInterf()* |
+
+* The pairs of interfered vertices are: <i>(nV11, nV12), (nV11, nV13), (nV12, nV13), (nV13, nV15), (nV13, nV14), (nV14, nV15), (nV21, nV22), (nV21, nV23), (nV22, nV23);</i> 
+* These pairs produce two chains: <i>(nV11, nV12, nV13, nV14, nV15)</i> and <i>(nV21, nV22, nV23);</i>
+* Each chain is used to create a new vertex,  *VN1* and *VN2*, correspondingly.
+
+The example of connexity chains of interfered vertices is given in the image:
+
+@figure{/specification/boolean_operations/images/operations_image018.svg,"Connexity chains of interfered vertices",394}
+
+
+@subsection specification__boolean_5_3 Compute Vertex/Edge Interferences
+
+The input data for this step is the DS after computing Vertex/Vertex interferences.
+
+| No | Contents | Implementation  | 
+| :--- | :--- | :--- |
+| 1    | Initialize array of Vertex/Edge interferences | *BOPAlgo_PaveFiller::PerformVE()* |
+| 2    | Access to the pairs of interfered shapes <i>(nVi, nEj)k k=0, 1…nk,</i> where *nVi* is DS index of vertex *Vi*, *nEj* is DS index of edge *Ej* and *nk* is the number of pairs. |    *BOPDS_Iterator* |
+| 3    | Compute paves. See  @ref specification__boolean_3_1_2 "Vertex/Edge Interference" | *BOPInt_Context::ComputeVE()* | 
+| 4    | Initialize pave blocks for the edges *Ej* involved in the interference | *BOPDS_DS:: ChangePaveBlocks()* |
+| 5    | Append the paves into the pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* |
+| 6    | Append Vertex/Edge interferences in DS | *BOPDS_DS::AddInterf()* |
+
+@subsection specification__boolean_5_4 Update Pave Blocks
+The input data for this step is the DS after computing Vertex/Edge Interferences.
+
+| No | Contents | Implementation | 
+| :--- | :---- | :--- | 
+| 1    | Each pave block PB containing internal paves is split by internal paves into new pave blocks *PBN1, PBN2… PBNn*. PB is replaced by new pave blocks *PBN1, PBN2… PBNn* in the DS. |        *BOPDS_DS:: UpdatePaveBlocks()* | 
+
+@subsection specification__boolean_5_5 Compute Edge/Edge Interferences
+
+The input data for this step is the DS after updating Pave Blocks. 
+
+| No | Contents | Implementation  | 
+| :---- | :---- | :----- | 
+| 1 | Initialize array of Edge/Edge interferences | *BOPAlgo_PaveFiller::PerformEE()* |
+| 2    | Access to the pairs of interfered shapes <i>(nEi, nEj)k, k=0, 1…nk,</i> where *nEi* is DS index of the edge *Ei*, *nEj* is  DS index of the edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* |
+| 3    | Initialize pave blocks for the edges involved in the interference, if it is necessary. |      *BOPDS_DS:: ChangePaveBlocks()* |
+| 4    | Access to the pave blocks of interfered shapes: <i>(PBi1, PBi2…PBiNi)</i> for edge *Ei* and <i>(PBj1, PBj2…PBjNj)</i> for  edge *Ej* | *BOPAlgo_PaveFiller::PerformEE()* |
+| 5    | Compute shrunk data for pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock", if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* |
+| 6    | Compute Edge/Edge interference for pave blocks *PBix* and *PBiy*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeEdge* |
+| 7.1 | For each *CommonPart* of type *VERTEX:*        Create new vertices *VNi (i =1, 2…,NbVN),* where *NbVN* is the number of new vertices. Intersect the vertices *VNi* using the steps Initialization and compute Vertex/Vertex interferences as follows: a) create a new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* |
+| 7.2 |        For each *CommonPart* of type *EDGE:*   Compute the coinciding connexity chains of  pave blocks <i>(PB1C, PB2C… PNnC)k, C=0, 1…nCs,</i> where *nCs* is the number of the connexity chains. Create common blocks <i>(CBc. C=0, 1…nCs)</i> from the chains. Attach the common blocks to the pave blocks. |  *BOPAlgo_Tools::PerformCommonBlocks()* |
+| 8    | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* |
+| 9    | Split common blocks CBc by the paves. | *BOPDS_DS:: UpdateCommonBlock()* |
+| 10 | Append Edge/Edge interferences in the DS. |     *BOPDS_DS::AddInterf()* |
+
+The example of coinciding chains of pave blocks is given in the image:
+
+@figure{/specification/boolean_operations/images/operations_image019.png,"Coinciding chains of pave blocks",420}
+
+* The pairs of coincided pave blocks are: <i>(PB11, PB12), (PB11, PB13), (PB12, PB13), (PB21, PB22), (PB21, PB23), (PB22, PB23).</i>
+* The pairs produce  two chains: <i>(PB11, PB12, PB13)</i> and <i>(PB21, PB22, PB23).</i>
+
+@subsection specification__boolean_5_6 Compute Vertex/Face Interferences
+
+The input data for this step is the DS after computing Edge/Edge interferences.
+
+| No | Contents | Implementation  |
+| :---- | :--- | :---- |
+| 1    | Initialize array of Vertex/Face interferences | *BOPAlgo_PaveFiller::PerformVF()* |
+| 2    | Access to the pairs of interfered shapes <i>(nVi, nFj)k, k=0, 1…nk,</i> where *nVi* is DS index of the vertex *Vi*, *nFj* is DS index of the edge *Fj* and *nk* is the number of  pairs. |  *BOPDS_Iterator* |
+| 3    | Compute interference  See  @ref specification__boolean_3_1_3 "Vertex/Face Interference" | *BOPInt_Context::ComputeVF()* |
+| 4    | Append Vertex/Face interferences in the DS |  *BOPDS_DS::AddInterf()* |
+| 5    | Repeat steps 2-4 for each new vertex *VNXi (i=1, 2…,NbVNX),* where *NbVNX* is the number of vertices. | *BOPAlgo_PaveFiller::TreatVerticesEE()* |
+
+@subsection specification__boolean_5_7 Compute Edge/Face Interferences
+The input data for this step is the DS after computing Vertex/Face Interferences. 
+
+| No | Contents        | Implementation |
+| :---- | :---- | :---- | 
+| 1    | Initialize array of Edge/Face interferences | *BOPAlgo_PaveFiller::PerformEF()* |
+| 2    | Access to the pairs of interfered shapes <i>(nEi, nFj)k, k=0, 1…nk,</i> where *nEi* is DS index of edge *Ei*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. |     *BOPDS_Iterator* |
+| 3    | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS::ChangePaveBlocks()* |
+| 4    | Access to the pave blocks of interfered edge <i>(PBi1, PBi2…PBiNi)</i> for edge *Ei*        | *BOPAlgo_PaveFiller::PerformEF()* |
+| 5    | Compute shrunk data for pave blocks (in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock") if it is necessary. |     *BOPAlgo_PaveFiller::FillShrunkData()* |
+| 6    | Compute Edge/Face interference for pave block *PBix*, and face *nFj*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeFace* |
+| 7.1 |        For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i=1, 2…,NbVN),* where *NbVN* is the number of new vertices. Merge vertices *VNi* as follows: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* and *BOPAlgo_PaveFiller::PerformVertices1()* |
+| 7.2 | For each *CommonPart* of type *EDGE:* Create common blocks <i>(CBc. C=0, 1…nCs)</i> from pave blocks that lie on the faces. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* |
+| 8    | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock". | *BOPDS_PaveBlock:: AppendExtPave()* |
+| 9    | Split pave blocks and common blocks *CBc* by the paves. |     *BOPAlgo_PaveFiller::PerformVertices1()*, *BOPDS_DS:: UpdatePaveBlock()* and *BOPDS_DS:: UpdateCommonBlock()* |
+| 10 | Append Edge/Face interferences in the DS        | *BOPDS_DS::AddInterf()* |
+| 11 | Update *FaceInfo*  for all faces having EF common parts. | *BOPDS_DS:: UpdateFaceInfoIn()* |
+
+
+@subsection specification__boolean_5_8 Build Split Edges
+
+The input data for this step is the DS after computing Edge/Face Interferences.
+
+For each pave block *PB* take the following steps: 
+       
+| No | Contents | Implementation |
+| :--- | :--- | :--- | 
+| 1    | Get the real pave block *PBR*, which is equal to *PB* if *PB* is not a common block and to *PB<sub>1</sub>* if *PB* is a common block. *PB<sub>1</sub>* is the first pave block in the pave blocks list of the common block.  See  @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock". | *BOPAlgo_PaveFiller::MakeSplitEdges()* | 
+| 2    | Build the split edge *Esp* using the information from *DS* and *PBR*. | *BOPTools_Tools::MakeSplitEdge()* |
+| 3    | Compute *BOPDS_ShapeInfo* contents for Esp | *BOPAlgo_PaveFiller::MakeSplitEdges()* |
+| 4    | Append *BOPDS_ShapeInfo* contents to the DS | *BOPDS_DS::Append()* |
+
+@subsection specification__boolean_5_9 Compute Face/Face Interferences
+
+The input data for this step is DS after building Split Edges. 
+
+| No | Contents | Implementation |
+| :--- | :--- | :--- | 
+| 1 | Initialize array of Face/Face interferences | *BOPAlgo_PaveFiller::PerformFF()* |
+| 2    | Access to the pairs of interfered shapes <i>(nFi, nFj)k, k=0, 1…nk,</i> where *nFi* is DS index of edge *Fi*, *nFj* is  DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* |
+| 3    | Compute Face/Face interference | *IntTools_FaceFace* |
+| 4    | Append Face/Face interferences in the DS. | *BOPDS_DS::AddInterf()* |
+
+@subsection specification__boolean_5_10        Build Section Edges
+
+The input data for this step is the DS after computing Face/Face interferences.
+
+| No | Contents        | Implementation  |
+| :---- | :---- | :---- |
+| 1 | For each Face/Face interference *nFi, nFj*, retrieve @ref specification__boolean_4_6 "FaceInfo". Create draft vertices from intersection points *VPk (k=1, 2…, NbVP)*, where *NbVP* is the number of new vertices, and the draft vertex *VPk* is created from an intersection point if *VPk ≠ Vm (m = 0, 1, 2… NbVm)*, where *Vm* is an existing vertex for the faces *nFi* and *nF,j* (*On* or *In* in terms of *TopoDs_Shape*),  *NbVm* is the number of vertices existing on faces *nFi* and *nF,j* and ≠ -- means non-coincidence in terms of @ref specification__boolean_3_1_1 "Vertex/Vertex interference". | *BOPAlgo_PaveFiller::MakeBlocks()* |
+| 2    | For each intersection curve *Cijk* | |        
+| 2.1 | Create paves PVc for the curve using existing vertices, i.e. vertices On or In (in terms of *FaceInfo*) for faces *nFi* and *nFj*. Append the paves *PVc* | *BOPAlgo_PaveFiller::PutPaveOnCurve()* and *BOPDS_PaveBlock::AppendExtPave()* |
+| 2.2 |        Create technological vertices *Vt*, which are the bounding points of an intersection curve (with the value of tolerance *Tol(Cijk)*). Each vertex *Vt* with parameter *Tt* on curve *Cijk* forms pave *PVt* on curve *Cijk*. Append technological paves. | *BOPAlgo_PaveFiller::PutBoundPaveOnCurve()* |
+| 2.3 |        Create pave blocks *PBk* for the curve using paves <i>(k=1, 2…, NbPB)</i>, where *NbPB* is the number of pave blocks |        *BOPAlgo_PaveFiller::MakeBlocks()* |
+| 2.4 |        Build draft section edges *ESk* using the pave blocks <i>(k=1, 2…, NbES)</i>, where *NbES* is the number of draft section edges       The draft section edge is created from a pave block *PBk* if *PBk* has state *In* or *On* for both faces *nFi* and *nF,j* and *PBk ≠ PBm (m=0, 1, 2… NbPBm)*, where *PBm* is an existing pave block for faces *nFi* and *nF,j* (*On* or *In* in terms of *FaceInfo*), *NbVm* is the number of existing pave blocks for faces *nFi* and *nF,j* and ≠ -- means non-coincidence (in terms of @ref specification__boolean_3_1_3 "Vertex/Face interference"). | *BOPTools_Tools::MakeEdge()* |
+| 3    | Intersect the draft vertices *VPk (k=1, 2…, NbVP)* and the draft section edges *ESk (k=1, 2…, NbES)*. For this: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use vertices *VPk* and edges *ESk* as arguments (in terms of @ref specification__boolean_4_1 "Arguments") of *PFn*; c) invoke method *Perform()* for *PFn*. Resulting vertices *VPXk (k=1, 2… NbVPX)* and edges *ESXk (k=1, 2… NbESX)* are obtained via mapping between *VPk, ESk* and the results of *PVn*. | *BOPAlgo_PaveFiller::PostTreatFF()* |
+| 4    | Update face info (sections about pave blocks and vertices) | *BOPAlgo_PaveFiller::PerformFF()* |
+
+@subsection specification__boolean_5_11 Build P-Curves
+The input data for this step is the DS after building section edges.
+
+| No | Contents        | Implementation |
+| :---- | :---- | :---- |
+| 1    | For each Face/Face interference *nFi* and *nFj* build p-Curves on *nFi* and *nFj* for each section edge *ESXk*. |     *BOPAlgo_PaveFiller::MakePCurves()* |
+| 2    | For each pave block that is common for faces *nFi* and *nFj* build p-Curves on *nFi* and *nFj*. |     *BOPAlgo_PaveFiller::MakePCurves()* |
+
+@subsection specification__boolean_5_12        Process Degenerated Edges
+The input data for this step is the DS  after building P-curves.
+
+| No | Contents | Implementation |
+| :---- | :---- | :---- |
+| | For each degenerated edge *ED* having vertex *VD* | BOPAlgo_PaveFiller::ProcessDE() |
+| 1    | Find pave blocks *PBi (i=1,2… NbPB)*, where *NbPB* is the number of pave blocks, that go through vertex *VD*. | *BOPAlgo_PaveFiller::FindPaveBlocks()* |
+| 2    | Compute paves for the degenerated edge *ED* using a 2D curve of *ED* and a 2D curve of *PBi*. Form pave blocks *PBDi (i=1,2… NbPBD)*, where *NbPBD* is the number of the pave blocks for the degenerated edge *ED* | *BOPAlgo_PaveFiller::FillPaves()* |
+| 3    | Build split edges *ESDi (i=1,2…NbESD)*, where *ESD* is the number of split edges, using the pave blocks *PBDi* |    *BOPAlgo_PaveFiller:: MakeSplitEdge()* |
+
+@section specification__boolean_6      General description of the Building Part
+
+Building Part (BP) is used to 
+* Build the result of the operation 
+* Provide history information (in terms of <i>\::Generated(), \::Modified()</i> and <i>\::IsDeleted()</i>)
+BP uses the DS prepared by *BOPAlgo_PaveFiller* described at chapter 5 as input data.
+BP is implemented in the following classes:
+* *BOPAlgo_Builder* -- for the General Fuse operator  (GFA).
+* *BOPAlgo_BOP* -- for the Boolean Operation operator   (BOA).
+* *BOPAlgo_Section* -- for the Section operator  (SA).
+* *BOPAlgo_MakerVolume* -- for the Volume Maker operator.
+* *BOPAlgo_Splitter* -- for the Splitter operator.
+* *BOPAlgo_CellsBuilder* -- for the Cells Builder operator.
+
+@figure{/specification/boolean_operations/images/operations_image020.png,"Diagram for BP classes",300}
+
+The class *BOPAlgo_BuilderShape* provides the interface for algorithms that have:
+* A Shape as the result;
+* History information (in terms of <i>\::Generated(), \::Modified()</i> and <i>\::IsDeleted()).</i>
+
+@section specification__boolean_7      General Fuse Algorithm
+@subsection specification__boolean_7_1 Arguments
+The arguments of the algorithm are shapes (in terms of *TopoDS_Shape*). The main requirements for the arguments are described in @ref specification__boolean_4 "Data Structure" chapter.
+
+@subsection specification__boolean_7_2 Results
+
+During the operation argument *Si* can be split into several parts *Si1, Si2… Si1NbSp*, where *NbSp* is the number of parts. The set <i>(Si1, Si2… Si1NbSp)</i> is an image of argument *Si*.
+* The result of the General Fuse operation is a compound. Each sub-shape of the compound corresponds to the certain argument shape S1, S2…Sn and has shared sub-shapes in accordance with interferences between the arguments.
+* For the arguments of the type EDGE, FACE, SOLID the result contains split parts of the argument.
+* For the arguments of the type WIRE, SHELL, COMPSOLID, COMPOUND the result contains the image of the shape of the corresponding type (i.e. WIRE, SHELL, COMPSOLID or COMPOUND).
+The types of resulting shapes depend on the type of the corresponding argument participating in the operation. See the table below:
+
+| No | Type of argument | Type of resulting shape | Comments |
+| :--- | :---- | :--- | :--- |
+| 1 | COMPOUND | COMPOUND | The resulting COMPOUND is built from images of sub-shapes of type COMPOUND COMPSOLID, SHELL, WIRE and VERTEX. Sets of split sub-shapes of type SOLID, FACE, EDGE. | 
+| 2    | COMPSOLID     | COMPSOLID     | The resulting COMPSOLID is built from split SOLIDs. |
+| 3    | SOLID | Set of split SOLIDs | |
+| 4    | SHELL | SHELL | The resulting SHELL is built from split FACEs |
+| 5    | FACE  | Set of split FACEs | |
+| 6    | WIRE | WIRE | The resulting WIRE is built from split EDGEs |
+| 7    | EDGE  | Set of split EDGEs    | |
+| 8    | VERTEX | VERTEX | |
+
+@subsection specification__boolean_7_3a Options
+
+The General Fuse algorithm has a set of options, which allow speeding-up the operation and improving the quality of the result:
+* Parallel processing option allows running the algorithm in parallel mode;
+* Fuzzy option allows setting the additional tolerance for the operation;
+* Safe input shapes option allows preventing modification of the input shapes;
+* Gluing option allows speeding-up the intersection of the arguments;
+* Possibility to disable the check for the inverted solids among input shapes;
+* Usage of Oriented Bounding Boxes in the operation;
+* History support.
+
+For more detailed information on these options, see the @ref specification__boolean_11a "Advanced options" section.
+
+@subsection specification__boolean_7_3b Usage
+
+The following example illustrates how to use the GF algorithm:
+
+#### Usage of the GF algorithm on C++ level
+
+~~~~
+BOPAlgo_Builder aBuilder;
+// Setting arguments
+TopTools_ListOfShape aLSObjects = …; // Objects
+aBuilder.SetArguments(aLSObjects);
+
+// Setting options for GF
+
+// Set parallel processing mode (default is false)
+Standard_Boolean bRunParallel = Standard_True;
+aBuilder.SetRunParallel(bRunParallel);
+
+// Set Fuzzy value (default is Precision::Confusion())
+Standard_Real aFuzzyValue = 1.e-5;
+aBuilder.SetFuzzyValue(aFuzzyValue);
+
+// Set safe processing mode (default is false)
+Standard_Boolean bSafeMode = Standard_True;
+aBuilder.SetNonDestructive(bSafeMode);
+
+// Set Gluing mode for coinciding arguments (default is off)
+BOPAlgo_GlueEnum aGlue = BOPAlgo_GlueShift;
+aBuilder.SetGlue(aGlue);
+
+// Disabling/Enabling the check for inverted solids (default is true)
+Standard Boolean bCheckInverted = Standard_False;
+aBuilder.SetCheckInverted(bCheckInverted);
+
+// Set OBB usage (default is false)
+Standard_Boolean bUseOBB = Standard_True;
+aBuilder.SetUseOBB(buseobb);
+
+// Perform the operation
+aBuilder.Perform();
+
+// Check for the errors
+if (aBuilder.HasErrors())
+{
+  return;
+}
+
+// Check for the warnings
+if (aBuilder.HasWarnings())
+{
+  // treatment of the warnings
+  ...
+}
+
+// result of the operation
+const TopoDS_Shape& aResult = aBuilder.Shape();
+~~~~
+
+#### Usage of the GF algorithm on Tcl level
+
+~~~~
+# prepare the arguments
+box b1 10 10 10 
+box b2 3 4 5 10 10 10 
+box b3 5 6 7 10 10 10 
+
+# clear inner contents
+bclearobjects; bcleartools;
+
+# set the arguments
+baddobjects b1 b2 b3
+
+# setting options for GF
+
+# set parallel processing mode (default is 0)
+brunparallel 1
+
+# set Fuzzy value
+bfuzzyvalue 1.e-5
+
+# set safe processing mode (default is 0)
+bnondestructive 1
+
+# set gluing mode (default is 0)
+bglue 1
+
+# set check for inverted (default is 1)
+bcheckinverted 0
+
+# set obb usage (default is 0)
+buseobb 1
+
+# perform intersection
+bfillds
+
+# perform GF operaton
+bbuild result
+~~~~
+
+@subsection specification__boolean_7_3 Examples
+
+Have a look at the examples to better understand the definitions.
+
+@subsubsection specification__boolean_7_3_1    Case 1: Three edges intersecting at a point 
+
+Let us consider three edges: *E1, E2* and *E3* that intersect in one 3D point.
+
+@figure{/specification/boolean_operations/images/operations_image021.svg,"Three Intersecting Edges",420}
+
+The result of the GFA operation is a compound containing 6 new edges: *E11, E12, E21, E22, E31*, and *E32*. These edges have one shared vertex *Vn1*.
+
+In this case:
+* The argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*).
+* The argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*).
+* The argument edge *E3* has resulting split edges *E31* and *E32* (image of *E3*).
+
+@subsubsection specification__boolean_7_3_2 Case 2: Two wires and an edge
+
+Let us consider two wires *W1 (Ew11, Ew12, Ew13)* and *W2 (Ew21, Ew22, Ew23)* and edge *E1*.
+
+@figure{/specification/boolean_operations/images/operations_image022.svg,"Two wires and an edge",420}
+
+The result of the GF operation is a compound consisting of 2 wires: *Wn1 (Ew11, En1, En2, En3, Ew13)* and *Wn2 (Ew21, En2, En3, En4, Ew23)* and two edges: *E11* and *E12*. 
+
+In this case :
+* The argument *W1* has image *Wn1*.
+* The argument *W2* has image *Wn2*.
+* The argument edge *E1* has split edges *E11* and *E12*. (image of *E1*).
+The edges *En1, En2, En3, En4* and vertex *Vn1* are new shapes created during the operation. Edge *Ew12* has split edges *En1, En2* and *En3* and edge *Ew22* has split edges *En2, En3* and *En4*.
+
+@subsubsection specification__boolean_7_3_3 Case 3: An edge intersecting with a face
+
+Let us consider edge *E1* and face *F2*:
+
+@figure{/specification/boolean_operations/images/operations_image023.svg,"An edge intersecting with a face",420}
+
+The result of the GF operation is a compound consisting of 3 shapes: 
+* Split edge parts *E11* and *E12* (image of *E1*).
+* New face *F21* with internal edge *E12* (image of *F2*).
+
+@subsubsection specification__boolean_7_3_4 Case 4: An edge lying on a face
+
+Let us consider edge *E1* and face *F2*:
+
+@figure{/specification/boolean_operations/images/operations_image024.svg,"An edge lying on a face",420}
+
+The result of the GF operation is a compound consisting of 5 shapes: 
+* Split edge parts *E11, E12* and *E13* (image of *E1*).
+* Split face parts  *F21* and *F22* (image of *F2*).
+
+
+@subsubsection specification__boolean_7_3_5 Case 5: An edge and a shell
+
+Let us consider edge *E1* and shell *Sh2* that consists of 2 faces: *F21* and *F22*
+
+@figure{/specification/boolean_operations/images/operations_image025.svg,"An edge and a shell",488}
+
+The result of the GF operation is a compound consisting of 5 shapes: 
+* Split edge parts *E11, E12 , E13* and *E14* (image of *E1*).
+* Image shell *Sh21* (that contains split face parts  *F211, F212, F221* and *F222*).
+
+@subsubsection specification__boolean_7_3_6 Case 6: A wire and a shell
+
+Let us consider  wire *W1 (E1, E2, E3, E4)* and  shell *Sh2 (F21, F22)*. 
+@figure{/specification/boolean_operations/images/operations_image026.svg,"A wire and a shell",427}
+
+The result of the GF operation is a compound consisting of 2 shapes: 
+
+* Image wire *W11* that consists of split edge parts from wire *W1: E11, E12, E13* and *E14*.
+* Image shell *Sh21* that contains split face parts: *F211, F212, F213, F221, F222* and *F223*.
+
+@subsubsection specification__boolean_7_3_7 Case 7: Three faces
+
+Let us consider 3 faces: *F1, F2* and *F3*. @figure{/specification/boolean_operations/images/operations_image027.png,"Three faces",420}
+
+The result of the GF operation is a compound consisting of 7 shapes:
+* Split face parts: *Fn1, Fn2, Fn3, Fn4, Fn5, Fn6* and *Fn7*.
+
+@subsubsection specification__boolean_7_3_8 Case 8: A face and a shell
+
+Let us consider shell *Sh1 (F11, F12, F13)* and face *F2*.
+@figure{/specification/boolean_operations/images/operations_image028.png,"A face and a shell",420}
+
+The result of the GF operation is a compound consisting of 4 shapes:
+* Image shell *Sh11* that consists of split face parts from shell *Sh1: Fn1, Fn2, Fn3, Fn4, Fn5* and *Fn6*.
+* Split parts of face *F2: Fn3, Fn6* and *Fn7*.
+
+@subsubsection specification__boolean_7_3_9 Case 9: A shell and a solid
+
+Let us consider shell *Sh1 (F11, F12…F16)* and solid *So2*. @figure{/specification/boolean_operations/images/operations_image029.png,"A shell and a solid: arguments",220}
+
+The result of the GF operation is a compound consisting of 2 shapes:
+* Image shell *Sh11* consisting of split face parts of *Sh1: Fn1, Fn2 ... Fn8.*
+* Solid *So21* with internal shell. (image of *So2*).
+@figure{/specification/boolean_operations/images/operations_image030.png,"A shell and a solid: results",420}
+
+@subsubsection specification__boolean_7_3_10 Case 10: A compound and a solid
+
+Let us consider compound *Cm1* consisting of 2 solids *So11* and *So12*) and solid *So2*.
+@figure{/specification/boolean_operations/images/operations_image031.png,"A compound and a solid: arguments",220}
+
+The result of the GF operation is a compound consisting of 4 shapes:
+* Image compound *Cm11* consisting of split solid parts from *So11* and *So12 (Sn1, Sn2, Sn3, Sn4)*.
+* Split parts of solid *So2 (Sn2, Sn3, Sn5)*.
+
+@figure{/specification/boolean_operations/images/operations_image032.png,"A compound and a solid: results",420}
+
+@subsection specification__boolean_7_4 Class BOPAlgo_Builder
+
+GFA is implemented in the class *BOPAlgo_Builder*.
+
+@subsubsection specification__boolean_7_4_1 Fields
+
+The main fields of the class are described in the Table: 
+
+| Name | Contents |
+| :---- | :---- |
+| *myPaveFiller* |     Pointer to the *BOPAlgo_PaveFiller* object |
+| *myDS* |     Pointer to the *BOPDS_DS* object |
+| *myContext* | Pointer to the intersection Context |
+| *myImages* | The Map between the source shape and its images | 
+| *myShapesSD* |       The Map between the source shape (or split part of source shape) and the shape (or part of shape) that will be used in result due to same domain property. |
+
+@subsubsection specification__boolean_7_4_2 Initialization
+
+The input data for this step is a *BOPAlgo_PaveFiller* object (in terms of @ref  specification__boolean_5 "Intersection") at the state after @ref specification__boolean_5_12 "Processing of degenerated edges"  with the corresponding DS.
+
+| No | Contents        | Implementation |
+| :---- | :---- | :---- |
+| 1    | Check the readiness of the DS and *BOPAlgo_PaveFiller*. | *BOPAlgo_Builder::CheckData()* | 
+| 2    | Build an empty result of type Compound. | *BOPAlgo_Builder::Prepare()* |
+
+@subsubsection specification__boolean_7_4_3 Build Images for Vertices
+
+The input data for this step is *BOPAlgo_Builder* object  after Initialization.
+
+| No | Contents | Implementation  |
+| :--- | :--- | :--- | 
+| 1    | Fill *myShapesSD*  by SD vertices using the information from the DS. |        *BOPAlgo_Builder::FillImagesVertices()* |
+
+@subsubsection specification__boolean_7_4_4 Build Result of Type Vertex
+
+The input data for this step is *BOPAlgo_Builder* object  after building images for vertices and *Type*, which is the shape type (*TopAbs_VERTEX*).
+
+| No | Contents | Implementation |
+| :--- | :--- | :----- |
+| 1 |  For the arguments of type *Type*.       If there is an image for the argument: add the image to the result. If there is no image for the argument: add the argument to the result. | *BOPAlgo_Builder::BuildResult()* |
+
+@subsubsection specification__boolean_7_4_5 Build Images for Edges
+
+The input data for this step is *BOPAlgo_Builder object* after building result of type vertex.
+
+| No | Contents | Implementation |
+| :---- | :---- | :----- | 
+| 1    | For all pave blocks in the DS. Fill *myImages*  for the original edge *E* by split edges *ESPi* from pave blocks. In case of common blocks on edges, use edge *ESPSDj* that corresponds to the leading pave block and fill *myShapesSD* by the pairs *ESPi/ESPSDj*. | *BOPAlgo_Builder::FillImagesEdges()* |
+
+@subsubsection specification__boolean_7_4_6 Build Result of Type Edge
+
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type *Edge*.
+
+@subsubsection specification__boolean_7_4_7 Build Images for Wires
+
+The input data for this step is: 
+* *BOPAlgo_Builder* object after building result of type *Edge*;
+* Original Shape -- Wire
+* *Type* -- the shape type <i>(TopAbs_WIRE).</i>
+
+| No | Contents | Implementation |
+| :---- | :---- | :----- | 
+| 1    | For all arguments of the type *Type*. Create a container C of the type *Type*. | *BOPAlgo_Builder::FillImagesContainers()* |
+| 2    | Add to C the images or non-split parts of the *Original Shape*, taking into account its orientation. | *BOPAlgo_Builder::FillImagesContainers()* *BOPTools_Tools::IsSplitToReverse()* |
+| 3    | Fill *myImages*  for the *Original Shape* by the information above. | *BOPAlgo_Builder::FillImagesContainers()* | 
+
+@subsubsection specification__boolean_7_4_8    Build Result of Type Wire
+
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex" but for the type *Wire*.
+
+@subsubsection specification__boolean_7_4_9    Build Images for Faces
+
+The input data for this step is *BOPAlgo_Builder* object after building result of type *Wire*.
+| No | Contents        | Implementation |
+| :--- | :--- | :--- |
+| 1    | Build Split Faces     for all interfered DS shapes *Fi* of type *FACE*. | |   
+| 1.1 | Collect all edges or their images of *Fi(ESPij)*. |    *BOPAlgo_Builder::BuildSplitFaces()* |
+| 1.2 |        Impart to ESPij the orientation to be coherent with the original one. | *BOPAlgo_Builder::BuildSplitFaces()* |
+| 1.3 | Collect all section edges *SEk* for *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* |
+| 1.4 |        Build split faces for *Fi (Fi1, Fi2…FiNbSp)*, where *NbSp* is the number of split parts (see @ref specification__boolean_7_2 "Building faces from a set of edges" for more details). | *BOPAlgo_BuilderFace* | 
+| 1.5 |        Impart to <i>(Fi1, Fi2…FiNbSp)</i> the orientation coherent with the original face *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* | 
+| 1.6 |        Fill the map mySplits with *Fi/(Fi1, Fi2…FiNbSp)* | *BOPAlgo_Builder::BuildSplitFaces()* |
+| 2 | Fill Same Domain faces | *BOPAlgo_Builder::FillSameDomainFaces* | 
+| 2.1 |  Find and collect in the contents of *mySplits* the pairs of same domain split faces <i>(Fij, Fkl)m</i>, where *m* is the number of pairs. | *BOPAlgo_Builder::FillSameDomainFaces* *BOPTools_Tools::AreFacesSameDomain()* |
+| 2.2 |        Compute the connexity chains 1) of same domain faces <i>(F1C, F2C… FnC)k, C=0, 1…nCs,</i> where *nCs* is the number of connexity chains. | *BOPAlgo_Builder::FillSameDomainFaces()* | 
+| 2.3 |        Fill *myShapesSD* using the chains <i>(F1C, F2C… FnC)k</i> |  *BOPAlgo_Builder::FillSameDomainFaces()* |
+| 2.4 | Add internal vertices to split faces. | *BOPAlgo_Builder::FillSameDomainFaces()* |
+| 2.5 |        Fill *myImages* using *myShapesSD* and *mySplits*.      | *BOPAlgo_Builder::FillSameDomainFaces()* |
+
+
+The example of chains of same domain faces is given in the image:
+
+@figure{/specification/boolean_operations/images/operations_image033.svg,"Chains of same domain faces",420}
+
+* The pairs of same domain faces are: <i>(F11, F21), (F22, F31), (F41, F51) , (F41, F6)</i> and <i>(F51, F6)</i>.
+* The pairs produce the three chains: <i>(F11, F21), (F22, F31)</i> and <i>(F41, F51, F6)</i>.
+
+@subsubsection specification__boolean_7_4_10   Build Result of Type Face
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex" but for the type *Face*.
+
+@subsubsection specification__boolean_7_4_11   Build Images for Shells
+The input data for this step is:
+* *BOPAlgo_Builder* object  after building result of type face;
+* *Original Shape* -- a Shell;
+* *Type* -- the type of the shape <i>(TopAbs_SHELL)</i>.
+
+The procedure is the same as for building images for wires. 
+
+@subsubsection specification__boolean_7_4_12   Build Result of Type Shell
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex" but for the type *Shell*.
+
+@subsubsection specification__boolean_7_4_13 Build Images for Solids
+
+The input data for this step is *BOPAlgo_Builder* object after building result of type *Shell*. 
+
+The following procedure is executed for all interfered DS shapes *Si* of type *SOLID*.  
+
+| No | Contents | Implementation | 
+| :--- | :--- | :--- | 
+| 1    | Collect all images or non-split parts for all faces <i>(FSPij)</i> that have 3D state *In Si*. | *BOPAlgo_Builder::FillIn3DParts ()* | 
+| 2    | Collect all images or non-split parts for all faces of *Si* | *BOPAlgo_Builder::BuildSplitSolids()* |
+| 3    | Build split solids for *Si -> (Si1, Si2…SiNbSp)*, where *NbSp* is the number of split parts (see @ref specification__boolean_7_2 "Building faces from a set of edges" for more details) | *BOPAlgo_BuilderSolid* |
+| 4    | Fill the map Same Domain solids *myShapesSD* | *BOPAlgo_Builder::BuildSplitSolids()* |
+| 5    | Fill the map *myImages* |  *BOPAlgo_Builder::BuildSplitSolids()* |
+| 6    | Add internal vertices to split solids | *BOPAlgo_Builder::FillInternalShapes()* |
+
+@subsubsection specification__boolean_7_4_14 Build Result of Type Solid
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type Solid.
+
+@subsubsection specification__boolean_7_4_15 Build Images for Type CompSolid
+
+The input data for this step is:
+* *BOPAlgo_Builder* object after building result of type solid;
+* *Original Shape* -- a Compsolid;
+* *Type* -- the type of the shape <i>(TopAbs_COMPSOLID)</i>.
+
+The procedure is the same as for building images for wires. 
+
+@subsubsection specification__boolean_7_4_16 Build Result of Type Compsolid
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type Compsolid.
+
+@subsubsection specification__boolean_7_4_17 Build Images for Compounds
+The input data for this step is as follows:
+* *BOPAlgo_Builder* object after building results of type *compsolid*;
+* *Original Shape* -- a Compound;
+* *Type* -- the type of the shape <i>(TopAbs_COMPOUND)</i>.
+
+The procedure is the same as for building images for wires. 
+
+@subsubsection specification__boolean_7_4_18 Build Result of Type Compound
+
+This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type Compound.
+
+@subsubsection specification__boolean_7_4_19 Post-Processing
+The purpose of the step is to correct tolerances of the result to provide its validity in terms of *BRepCheck_Analyzer.*
+
+The input data for this step is a *BOPAlgo_Builder* object after building result of type compound.
+
+| No | Contents | Implementation  |
+| :---- | :---- | :----- |
+| 1    | Correct tolerances of vertices on curves | *BOPTools_Tools::CorrectPointOnCurve()* |
+| 2    | Correct tolerances of edges on faces | *BOPTools_Tools::CorrectCurveOnSurface()* |
+
+
+@section specification__boolean_8  Splitter Algorithm
+
+The Splitter algorithm allows splitting a group of arbitrary shapes by another group of arbitrary shapes.<br>
+It is based on the General Fuse  algorithm, thus all options of the General Fuse (see @ref specification__boolean_7_3a "GF Options") are also available in this algorithm.
+
+@subsection specification__boolean_8_1 Arguments
+
+* The arguments of the Splitter algorithm are divided into two groups - *Objects* (shapes that will be split) and *Tools* (shapes, by which the *Objects* will be split);
+* The requirements for the arguments (both for *Objects* and *Tools*) are the same as for the General Fuse algorithm - there can be any number of arguments of any type in each group, but each argument should be valid and not self-interfered.
+
+@subsection specification__boolean_8_2 Results
+
+* The result of Splitter algorithm contains only the split parts of the shapes included into the group of *Objects*;
+* The split parts of the shapes included only into the group of *Tools* are excluded from the result;
+* If there are no shapes in the group of *Tools* the result of the operation will be equivalent to the result of General Fuse operation;
+* The shapes can be split by other shapes from the same group (if these shapes are interfering).
+
+@subsection specification__boolean_8_3 Usage
+
+@subsubsection specification__boolean_8_3_1 API
+
+On the low level the Splitter algorithm is implemented in class *BOPAlgo_Splitter*. The usage of this algorithm looks as follows:
+~~~~~
+BOPAlgo_Splitter aSplitter;
+// Setting arguments and tools
+TopTools_ListOfShape aLSObjects = …; // Objects
+TopTools_ListOfShape aLSTools = …; // Tools
+aSplitter.SetArguments(aLSObjects);
+aSplitter.SetTools(aLSTools);
+
+// Set options for the algorithm
+// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+...
+
+// Perform the operation
+aSplitter.Perform();
+if (aSplitter.HasErrors()) { //check error status
+  return;
+}
+//
+const TopoDS_Shape& aResult = aSplitter.Shape(); // result of the operation
+~~~~~
+
+@subsubsection specification__boolean_8_3_2 DRAW
+
+The command *bsplit* implements the Splitter algorithm in DRAW. Similarly to the *bbuild* command for the General Fuse algorithm, the *bsplit* command should be used after the Pave Filler is filled.
+~~~~~
+# s1 s2 s3 - objects
+# t1 t2 t3 - tools
+bclearobjects
+bcleartools
+baddobjects s1 s2 s3
+baddtools t1 t2 t3
+bfillds
+bsplit result
+~~~~~
+
+@subsection specification__boolean_8_4 Examples
+
+@subsubsection specification__boolean_8_4_1 Example 1
+
+Splitting a face by the set of edges:
+
+~~~~
+# draw script for reproducing
+bclearobjects
+bcleartools
+
+set height 20
+cylinder cyl 0 0 0 0 0 1 10
+mkface f cyl 0 2*pi -$height $height
+baddobjects f
+
+# create tool edges
+compound edges
+
+set nb_uedges 10
+set pi2 [dval 2*pi]
+set ustep [expr $pi2/$nb_uedges]
+for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} {
+  uiso c cyl $i
+  mkedge e c -25 25
+  add e edges
+}
+
+set nb_vedges 10
+set vstep [expr 2*$height/$nb_vedges]
+for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} {
+  viso c cyl $i
+  mkedge e c
+  add e edges
+}
+baddctools edges
+
+bfillds
+bsplit result
+~~~~
+
+<table align="center">
+<tr>
+  <td>@figure{/specification/boolean_operations/images/bsplit_image001.png,"Arguments",160}</td>
+  <td>@figure{/specification/boolean_operations/images/bsplit_image002.png,"Result",160}</td>
+</tr>
+</table>
+
+@subsubsection specification__boolean_8_4_2 Example 2
+
+Splitting a plate by the set of cylinders:
+
+~~~~
+# draw script for reproducing:
+bclearobjects
+bcleartools
+
+box plate 100 100 1
+baddobjects plate
+
+pcylinder p 1 11
+compound cylinders
+for {set i 0} {$i < 101} {incr i 5} {
+  for {set j 0} {$j < 101} {incr j 5} {
+    copy p p1;
+    ttranslate p1 $i $j -5;
+    add p1 cylinders
+  }
+}
+baddtools cylinders
+
+bfillds
+bsplit result
+~~~~
+
+<table align="center">
+<tr>
+  <td>@figure{/specification/boolean_operations/images/bsplit_image003.png,"Arguments",160}</td>
+  <td>@figure{/specification/boolean_operations/images/bsplit_image004.png,"Result",160}</td>
+</tr>
+</table>
+
+@subsubsection specification__boolean_8_4_3 Example 3
+
+Splitting shell hull by the planes:
+<table align="center">
+<tr>
+  <td>@figure{/specification/boolean_operations/images/bsplit_image005.png,"Arguments",160}</td>
+  <td>@figure{/specification/boolean_operations/images/bsplit_image006.png,"Results",160}</td>
+</tr>
+</table>
+
+@section specification__boolean_9      Boolean Operations Algorithm
+
+@subsection specification__boolean_9_1 Arguments
+
+* The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the @ref specification__boolean_4 "Data Structure"
+* There are two groups of arguments in BOA:
+       * Objects <i>(S1=S11, S12, ...)</i>;
+       * Tools <i>(S2=S21, S22, ...)</i>.
+* The following table contains the values of dimension for different types of arguments:
+
+| No | Type of Argument        | Index of Type | Dimension |
+| :---- | :---- | :----- | :---- |
+| 1 | COMPOUND | 0 | One of 0, 1, 2, 3 |
+| 2    | COMPSOLID     | 1     | 3 |
+| 3    | SOLID | 2     | 3 |
+| 4    | SHELL | 3     | 2 |
+| 5    | FACE | 4 | 2 |
+| 6    | WIRE | 5 | 1 |
+| 7 | EDGE | 6 | 1 |
+| 8 | VERTEX | 7 | 0 |
+
+* For Boolean operation Fuse all arguments should have equal dimensions.
+* For Boolean operation Cut the minimal dimension of *S2* should not be less than the maximal dimension of *S1*.
+* For Boolean operation Common the arguments can have any dimension.
+
+@subsection specification__boolean_9_3 Results. General Rules
+
+* The result of the Boolean operation is a compound (if defined). Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments. 
+* The content of the result depends on the type of the operation (Common, Fuse, Cut12, Cut21) and the dimensions of the arguments. 
+* The result of the operation Fuse is defined for arguments *S1* and *S2* that have the same dimension value : *Dim(S1)=Dim(S2)*. If the arguments have different dimension values the result of the operation Fuse is not defined. The dimension of the result is equal to the dimension of the arguments. For example, it is impossible to fuse an edge and a face.
+* The result of the operation Fuse for arguments *S1* and *S2* contains the parts of arguments that have states **OUT** relative to the opposite arguments.
+* The result of the operation Fuse for arguments *S1* and *S2* having dimension value 3 (Solids) is refined by removing all possible internal faces to provide minimal number of solids.
+* The result of the operation Common for arguments *S1* and *S2* is defined for all values of the dimensions of the arguments. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the arguments. For example, the result of the operation Common between edges cannot be a vertex. 
+* The result of the operation Common for the arguments *S1* and *S2* contains the parts of the argument that have states **IN** and **ON** relative to the opposite argument.
+* The result of the operation Cut is defined for arguments *S1* and *S2* that have values of dimensions *Dim(S2)* that should not be less than *Dim(S1)*. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the objects *Dim(S1)*. The result of the operation *Cut12* is not defined for other cases. For example, it is impossible to cut an edge from a solid, because a solid without an edge is not defined. 
+* The result of the operation *Cut12* for arguments *S1* and *S2* contains the parts of argument *S1* that have state **OUT** relative to the opposite argument *S2*.
+* The result of the operation *Cut21* for arguments *S1* and *S2* contains the parts of argument *S2* that have state **OUT** relative to the opposite argument *S1*.
+* For the arguments of collection type (WIRE, SHELL, COMPSOLID) the type will be passed in the result. For example, the result of Common operation between Shell and Wire will be a compound containing Wire.
+* For the arguments of collection type (WIRE, SHELL, COMPSOLID) containing overlapping parts the overlapping parts passed into result will be repeated for each container from the input shapes containing such parts. The containers completely included in other containers will be avoided in the result.
+* For the arguments of collection type (WIRE, SHELL, COMPSOLID) the containers included into result will have the same orientation as the original containers from arguments. In case of duplication its orientation will be defined by the orientation of the first container in arguments. Each container included into result will have coherent orientation of its sub-shapes.
+* The result of the operation Fuse for the arguments of collection type (WIRE, SHELL) will consist of the shapes of the same collection type. The overlapping parts (EDGES/FACES) will be shared among containers, but duplicating containers will be avoided in the result. For example, the result of Fuse operation between two fully coinciding wires will be one wire, but the result of Fuse operation between two partially coinciding wires will be two wires sharing coinciding edges.
+* The result of the operation Fuse for the arguments of type COMPSOLID will consist of the compound containing COMPSOLIDs created from connexity blocks of fused solids.
+* The result of the operation Common for the arguments of collection type (WIRE, SHELL, COMPSOLID) will consist of the unique containers containing the overlapping parts. For example, the result of Common operation between two fully overlapping wires will be one wire containing all splits of edges. The number of wires in the result of Common operation between two partially overlapping wires will be equal to the number of connexity blocks of overlapping edges.
+
+@subsection specification__boolean_9_4 Examples
+
+@subsubsection specification__boolean_9_4_1    Case 1: Two Vertices
+
+Let us consider two interfering vertices *V1* and *V2*:
+
+@figure{/specification/boolean_operations/images/boolean_image001.svg,"",160}
+
+* The result of *Fuse* operation is the compound that contains new vertex *V*.
+
+@figure{/specification/boolean_operations/images/boolean_image002.svg,"",160}
+
+* The result of *Common* operation is a compound containing new vertex *V*.
+
+* The result of *Cut12* operation is an empty compound.
+* The result of *Cut21* operation is an empty compound.
+
+@subsubsection specification__boolean_9_4_2    Case 2: A Vertex and an Edge
+
+Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image004.png,"",230}
+
+* The result of *Fuse* operation is result is not defined because the dimension of the vertex (0) is not equal to the dimension of the edge (1).
+
+* The result of *Common* operation is a compound containing vertex *V<sub>1</sub>* as the argument *V<sub>1</sub>* has a common part with edge *E2*.
+
+@figure{/specification/boolean_operations/images/boolean_image005.png,"",230}
+
+* The result of *Cut12* operation is an empty compound.
+* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the edge (1).
+
+@subsubsection specification__boolean_9_4_3    Case 3: A Vertex and a Face
+
+Let us consider  vertex *V1* and face *F2*, that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image006.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the face (2).
+
+* The result of *Common* operation is a compound containing vertex *V<sub>1</sub>* as the argument *V<sub>1</sub>* has a common part with face *F2*.
+
+@figure{/specification/boolean_operations/images/boolean_image007.png,"",230}
+
+* The result of *Cut12* operation is an empty compound.
+* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the face (2).
+
+@subsubsection specification__boolean_9_4_4    Case 4: A Vertex and a Solid
+
+Let us consider  vertex *V1* and solid *S2*, that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image008.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the solid (3).
+
+* The result of *Common* operation is a compound containing vertex *V<sub>1</sub>* as the argument *V<sub>1</sub>* has a common part with solid *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image009.png,"",230}
+
+* The result of *Cut12* operation is an empty compound.
+* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the solid (3).
+
+@subsubsection specification__boolean_9_4_5    Case 5: Two edges intersecting at one point
+
+Let us consider edges *E1* and *E2* that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image010.svg,"",230}
+
+* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 4 new edges *E11, E12, E21*, and *E22*. These edges have one shared vertex *Vn1*. 
+In this case: 
+       * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*);
+       * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*).
+       
+@figure{/specification/boolean_operations/images/boolean_image011.svg,"",230}
+
+* The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edges (vertex) is less than the dimension of the arguments (1).
+
+* The result of *Cut12* operation is a compound containing split parts of the argument  *E1*, i.e. 2 new edges *E11* and *E12*. These edges have one shared vertex *Vn1*. 
+
+In this case the argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*).
+
+@figure{/specification/boolean_operations/images/boolean_image012.svg,"",230}
+
+* The result of *Cut21* operation is a compound containing split parts of the argument  *E2*, i.e. 2 new edges *E21* and *E12*. These edges have one shared vertex *Vn1*. 
+
+In this case the argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*).
+
+@figure{/specification/boolean_operations/images/boolean_image013.svg,"",70}
+
+@subsubsection specification__boolean_9_4_6    Case 6: Two edges having a common block
+
+Let us consider edges *E1* and *E2* that have a common block:
+
+@figure{/specification/boolean_operations/images/boolean_image014.svg,"",230}
+
+* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 3 new edges *E11*, *E12* and *E22*. These edges have two shared vertices. 
+In this case: 
+       * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*);
+       * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*);
+       * edge *E12* is common for the images of *E1* and *E2*.
+       
+@figure{/specification/boolean_operations/images/boolean_image015.svg,"",230}
+
+* The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new edge *E12*. In this case edge *E12* is common for the images of *E1* and *E2*. 
+The common part between the edges (edge) has the same dimension (1) as the dimension of the arguments (1).
+
+@figure{/specification/boolean_operations/images/boolean_image016.svg,"",230}
+
+* The result of *Cut12* operation is a compound containing a split part of argument  *E1*, i.e. new edge *E11*. 
+
+@figure{/specification/boolean_operations/images/boolean_image017.svg,"",230}
+
+* The result of *Cut21* operation is a compound containing a split part of argument  *E2*, i.e. new edge *E22*.
+
+@figure{/specification/boolean_operations/images/boolean_image018.svg,"",230}
+
+
+@subsubsection specification__boolean_9_4_7    Case 7: An Edge and a Face intersecting at a point
+
+Let us consider edge *E1* and face *F2* that intersect at a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image019.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2).
+       
+* The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edge and face (vertex) is less than the dimension of the arguments (1).
+
+* The result of *Cut12* operation is a compound containing split parts of the argument  *E1*, i.e. 2 new edges *E11* and *E12*.  
+
+In this case the argument edge *E1* has no common parts with the face *F2* so the whole image of *E1* is in the result.
+
+@figure{/specification/boolean_operations/images/boolean_image020.png,"",230}
+
+* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2).
+
+@subsubsection specification__boolean_9_4_8    Case 8: A Face and an Edge that have a common block
+
+Let us consider edge *E1* and face *F2* that have a common block:
+
+@figure{/specification/boolean_operations/images/boolean_image021.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2).
+       
+* The result of *Common* operation is a compound containing a split part of the argument  *E1*, i.e. new edge *E12*. 
+
+In this case the argument edge *E1* has a common part with face *F2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *F2*.
+
+@figure{/specification/boolean_operations/images/boolean_image022.png,"",230}
+
+* The result of *Cut12* operation is a compound containing split part of the argument  *E1*, i.e. new edge *E11*.  
+
+In this case the argument edge *E1* has a common part with face *F2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of F2.
+
+@figure{/specification/boolean_operations/images/boolean_image023.png,"",230}
+
+* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2).
+
+@subsubsection specification__boolean_9_4_9    Case 9: An Edge and a Solid intersecting at a point 
+
+Let us consider edge *E1* and solid *S2* that intersect at a point:
+
+@figure{/specification/boolean_operations/images/boolean_image024.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3).
+       
+* The result of *Common* operation is a compound containing a split part of the argument  *E1*, i.e. new edge *E12*. 
+
+In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image025.png,"",230}
+
+* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*.  
+
+In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image071.png,"",230}
+
+* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3).
+
+@subsubsection specification__boolean_9_4_10 Case 10: An Edge and a Solid that have a common block 
+
+Let us consider edge *E1* and solid *S2* that have a common block:
+
+@figure{/specification/boolean_operations/images/boolean_image072.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3).
+       
+* The result of *Common* operation is a compound containing a split part of the argument  *E1*, i.e. new edge *E12*. 
+
+In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image073.png,"",230}
+
+* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*.  
+
+In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image026.png,"",230}
+
+* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3).
+
+@subsubsection specification__boolean_9_4_11   Case 11: Two intersecting faces 
+
+Let us consider two intersecting faces *F1* and *F2*:
+
+@figure{/specification/boolean_operations/images/boolean_image027.png,"",230}
+
+* The result of *Fuse* operation is a compound containing split parts of arguments  i.e. 2 new faces *F11* and *F21*. These faces have one shared edge *En1*.
+
+@figure{/specification/boolean_operations/images/boolean_image028.png,"",230}
+
+
+* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge) is less than the dimension of arguments (2).
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.  
+
+@figure{/specification/boolean_operations/images/boolean_image029.png,"",230}
+
+* The result of *Cut21* operation is a compound containing split parts of the argument  *F2*, i.e. 1 new face *F21*.
+
+@figure{/specification/boolean_operations/images/boolean_image030.png,"",127}
+       
+@subsubsection specification__boolean_9_4_12   Case 12: Two faces that have a common part
+
+Let us consider two faces *F1* and *F2* that have a common part:
+
+@figure{/specification/boolean_operations/images/boolean_image031.png,"",230}
+
+* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 3 new faces: *F11*, *F12* and *F22*. These faces are shared through edges In this case: 
+       * the argument edge *F1* has resulting split faces *F11* and *F12* (image of *F1*)
+       * the argument face *F2* has resulting split faces *F12* and *F22* (image of *F2*)
+       * the face *F12* is common for the images of *F1* and *F2*.
+       
+@figure{/specification/boolean_operations/images/boolean_image032.png,"",230}
+
+* The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new face *F12*. 
+In this case: face *F12* is common for the images of *F1* and *F2*.
+The common part between the faces (face) has the same dimension (2) as the dimension of the arguments (2).
+
+
+@figure{/specification/boolean_operations/images/boolean_image033.png,"",230}
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.  
+       
+@figure{/specification/boolean_operations/images/boolean_image034.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing split parts of the argument  *F2*, i.e. 1 new face *F21*.
+
+@figure{/specification/boolean_operations/images/boolean_image035.png,"",230}
+
+@subsubsection specification__boolean_9_4_13   Case 13: Two faces that have a common edge
+
+Let us consider two faces *F1* and *F2* that have a common edge:
+
+@figure{/specification/boolean_operations/images/boolean_image036.png,"",230}
+
+* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared edge *En1*.
+       
+@figure{/specification/boolean_operations/images/boolean_image037.png,"",230}
+
+* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge)is less than the dimension of the arguments (2)
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.  The vertices are shown just to clarify the fact that the edges are spitted.
+       
+@figure{/specification/boolean_operations/images/boolean_image038.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing split parts of the argument  *F2*, i.e. 1 new face *F21*.  The vertices are shown just to clarify the fact that the edges are spitted.
+
+@figure{/specification/boolean_operations/images/boolean_image039.png,"",230}
+
+@subsubsection specification__boolean_9_4_14   Case 14: Two faces that have a common vertex
+
+Let us consider two faces *F1* and *F2* that have a common vertex:
+
+@figure{/specification/boolean_operations/images/boolean_image040.png,"",230}
+
+* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared vertex *Vn1*.
+       
+@figure{/specification/boolean_operations/images/boolean_image041.png,"",230}
+
+* The result of *Common* operation is an empty compound because the dimension (0) of the common part between *F1* and *F2* (vertex) is less than the dimension of the arguments (2)
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*.  
+       
+@figure{/specification/boolean_operations/images/boolean_image042.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing split parts of the argument  *F2*, i.e. 1 new face *F21*. 
+
+@figure{/specification/boolean_operations/images/boolean_image043.png,"",230}
+
+
+@subsubsection specification__boolean_9_4_15   Case 15: A Face and a Solid that have an intersection curve.
+
+Let us consider face *F1* and solid *S2* that have an intersection curve:
+
+@figure{/specification/boolean_operations/images/boolean_image044.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
+       
+* The result of *Common* operation is a compound containing split part of the argument  *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is in the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image045.png,"",230}
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case  argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
+       
+@figure{/specification/boolean_operations/images/boolean_image046.png,"",230}
+       
+* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
+
+@subsubsection specification__boolean_9_4_16   Case 16: A Face and a Solid that have overlapping faces.
+
+Let us consider face *F1* and solid *S2* that have overlapping faces:
+
+@figure{/specification/boolean_operations/images/boolean_image047.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
+
+* The result of *Common* operation is a compound containing split part of the argument  *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is included in the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
+
+@figure{/specification/boolean_operations/images/boolean_image048.png,"",230}
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case  argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
+       
+@figure{/specification/boolean_operations/images/boolean_image049.png,"",230}
+       
+* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
+
+
+@subsubsection specification__boolean_9_4_17   Case 17: A Face and a Solid that have overlapping edges.
+
+Let us consider face *F1* and solid *S2* that have overlapping edges:
+
+@figure{/specification/boolean_operations/images/boolean_image050.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
+       
+* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (edge) is less than the lower dimension of the arguments (2).
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case  argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
+       
+@figure{/specification/boolean_operations/images/boolean_image051.png,"",230}
+       
+* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
+
+@subsubsection specification__boolean_9_4_18   Case 18: A Face and a Solid that have overlapping vertices.
+
+Let us consider face *F1* and solid *S2* that have overlapping vertices:
+
+@figure{/specification/boolean_operations/images/boolean_image052.png,"",230}
+
+* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3).
+       
+* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (vertex) is less than the lower dimension of the arguments (2).
+
+* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case  argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*.
+       
+@figure{/specification/boolean_operations/images/boolean_image053.png,"",230}
+       
+* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3).
+
+@subsubsection specification__boolean_9_4_19   Case 19: Two intersecting Solids.
+
+Let us consider two intersecting solids *S1* and *S2*:
+
+@figure{/specification/boolean_operations/images/boolean_image054.png,"",230}
+
+* The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* <i>(Cut12, Common, Cut21)</i>. All inner webs are removed, so the result is one new solid *R*. 
+       
+@figure{/specification/boolean_operations/images/boolean_image055.png,"",230}
+       
+* The result of *Common* operation is a compound containing split parts of arguments i.e. one new solid *S12*.  In this case solid *S12* is common for the images of *S1* and *S2*. The common part between the solids (solid) has the same dimension (3) as the dimension of the arguments (3). The yellow contour is not a part of the result. It only shows the place of *S1*. 
+
+@figure{/specification/boolean_operations/images/boolean_image056.png,"",176}
+
+* The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*.
+       
+@figure{/specification/boolean_operations/images/boolean_image057.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*.
+
+@figure{/specification/boolean_operations/images/boolean_image058.png,"",230}
+
+@subsubsection specification__boolean_9_4_20   Case 20: Two Solids that have overlapping faces.
+
+Let us consider two solids *S1* and *S2* that have a common part on face:
+
+@figure{/specification/boolean_operations/images/boolean_image059.png,"",230}
+
+* The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* <i>(Cut12, Common, Cut21)</i>. All inner webs are removed, so the result is one new solid *R*. 
+       
+@figure{/specification/boolean_operations/images/boolean_image060.png,"",230}
+       
+* The result of *Common* operation is an  empty compound because the dimension (2) of the common part between *S1* and *S2* (face) is less than the lower dimension of the arguments (3). 
+
+* The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*.
+       
+@figure{/specification/boolean_operations/images/boolean_image061.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*.
+@figure{/specification/boolean_operations/images/boolean_image062.png,"",230}
+
+
+@subsubsection specification__boolean_9_4_21   Case 21: Two Solids that have overlapping edges.
+
+Let us consider two solids *S1* and *S2* that have overlapping edges:
+
+@figure{/specification/boolean_operations/images/boolean_image063.png,"",230}
+
+* The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids have one shared edge *En1*.
+       
+@figure{/specification/boolean_operations/images/boolean_image064.png,"",230}
+       
+* The result of *Common* operation is an  empty compound because the dimension (1) of the common part between *S1* and *S2* (edge) is less than the lower dimension of the arguments (3). 
+
+* The result of *Cut12* operation is a compound containing split part of the argument *S1*. In this case 
+argument *S1* has a common part with solid *S2* so the corresponding part is not included into the result.
+       
+@figure{/specification/boolean_operations/images/boolean_image065.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing split part of the argument *S2*. In this case 
+argument *S2* has a common part with solid *S1* so the corresponding part is not included into the result.
+
+@figure{/specification/boolean_operations/images/boolean_image066.png,"",230}
+
+@subsubsection specification__boolean_9_4_22   Case 22: Two Solids that have overlapping vertices.
+
+Let us consider two solids *S1* and *S2* that have overlapping vertices:
+
+@figure{/specification/boolean_operations/images/boolean_image067.png,"",230}
+
+* The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids share *Vn1*.
+       
+@figure{/specification/boolean_operations/images/boolean_image068.png,"",230}
+       
+* The result of *Common* operation is an  empty compound because the dimension (0) of the common part between *S1* and *S2* (vertex) is less than the lower dimension of the arguments (3). 
+
+* The result of *Cut12* operation is a compound containing split part of the argument *S1*.
+       
+@figure{/specification/boolean_operations/images/boolean_image069.png,"",230}
+       
+* The result of *Cut21* operation is a  compound containing split part of the argument *S2*. 
+
+@figure{/specification/boolean_operations/images/boolean_image070.png,"",230}
+
+@subsubsection specification__boolean_9_4_23   Case 23: A Shell and a Wire cut by a Solid.
+
+Let us consider Shell *Sh* and Wire *W* as the objects and Solid *S* as the tool:
+
+@figure{/specification/boolean_operations/images/boolean_image136.png,"",230}
+
+* The result of *Fuse* operation is not defined as the dimension of the arguments is not the same.
+       
+* The result of *Common* operation is a compound containing the parts of the initial Shell and Wire common for the Solid. The new Shell and Wire are created from the objects.
+
+@figure{/specification/boolean_operations/images/boolean_image137.png,"",230}
+
+* The result of *Cut12* operation is a  compound containing new Shell and Wire split from the arguments *Sh* and *W*. In this case they have a common part with solid *S* so the corresponding part is not included into the result.
+       
+@figure{/specification/boolean_operations/images/boolean_image138.png,"",230}
+       
+* The result of *Cut21* operation is not defined as the objects have a lower dimension than the tool. 
+
+@subsubsection specification__boolean_9_4_24   Case 24: Two Wires that have overlapping edges.
+
+Let us consider two Wires that have overlapping edges, *W1* is the object and *W2* is the tool:
+
+@figure{/specification/boolean_operations/images/boolean_image139.png,"",230}
+
+* The result of *Fuse* operation is a compound containing two Wires, which share an overlapping edge. The new Wires are created from the objects:
+
+@figure{/specification/boolean_operations/images/boolean_image140.png,"",230}
+       
+* The result of *Common* operation is a compound containing one Wire consisting of an overlapping edge. The new Wire is created from the objects:
+
+@figure{/specification/boolean_operations/images/boolean_image141.png,"",230}
+
+* The result of *Cut12* operation is a compound containing a wire split from object *W1*. Its common part with *W2* is not included into the result.
+       
+@figure{/specification/boolean_operations/images/boolean_image142.png,"",230}
+       
+* The result of *Cut21* operation is a compound containing a wire split from *W2*. Its common part with *W1* is not included into the result.
+       
+@figure{/specification/boolean_operations/images/boolean_image143.png,"",230}
+
+
+@subsection specification__boolean_9_5 Class BOPAlgo_BOP
+
+BOA is implemented in the class *BOPAlgo_BOP*. The main fields of this class are described in the Table:
+
+| Name | Contents |
+| :---- | :--- |       
+| *myOperation* | The type of the Boolean operation (Common, Fuse, Cut) |
+| *myTools* |  The tools |
+| *myDims[2]* | The values of the dimensions of the arguments |
+| *myRC* | The draft result (shape) |
+
+The main steps of the *BOPAlgo_BOP* are the same as of @ref specification__boolean_7_4 "BOPAlgo_Builder" except for some aspects described in the next paragraphs.
+
+@subsection specification__boolean_9_6 Building Draft Result
+
+The input data for this step is as follows:
+* *BOPAlgo_BOP* object after building result of type *Compound*;
+* *Type* of the Boolean operation.
+
+| No | Contents        | Implementation |
+| :---- | :----- | :----- | 
+| 1 |  For the Boolean operation *Fuse* add to *myRC* all images of arguments. | *BOPAlgo_BOP::BuildRC()* |
+| 2 |  For the Boolean operation *Common* or *Cut* add to *myRC* all images of argument *S1* that are *Common* for the Common operation and are *Not Common* for the Cut operation |   *BOPAlgo_BOP::BuildRC()* |
+@subsection specification__boolean_9_7 Building the Result
+
+The input data for this step is as follows:
+* *BOPAlgo_BOP* object the state after building draft result. 
+
+| No | Contents        | Implementation |
+| :---- | :---- | :------ |
+| 1 | For the Type of the Boolean operation Common, Cut with any dimension and operation Fuse with *myDim[0] < 3* | |
+| 1.1 |        Find containers (WIRE, SHELL, COMPSOLID) in the arguments | *BOPAlgo_BOP:: BuildShape()* |
+| 1.2 |        Make connexity blocks from splits of each container that are in *myRC* |        *BOPTools_Tools::MakeConnexityBlocks()* |
+| 1.3 |        Build the result from shapes made from the connexity blocks | *BOPAlgo_BOP:: BuildShape()* |
+| 1.4 |        Add the remaining shapes from *myRC* to the result | *BOPAlgo_BOP:: BuildShape()* |
+| 2    | For the Type of the Boolean operation Fuse with *myDim[0] = 3* | |    
+| 2.1 |        Find internal faces <i>(FWi)</i> in *myRC* | *BOPAlgo_BOP::BuildSolid()* |
+| 2.2 |        Collect all faces of *myRC* except for internal faces <i>(FWi) -> SFS</i> | *BOPAlgo_BOP::BuildSolid ()* |
+| 2.3 |        Build solids <i>(SDi)</i> from *SFS*. | *BOPAlgo_BuilderSolid* |
+| 2.4 |        Add the solids <i>(SDi)</i> to the result       | |
+
+@subsection specification__boolean_bop_on_opensolids Boolean operations on open solids
+
+The Boolean operations on open solids are tricky enough that the standard approach of Boolean operations for building the result, based on the splits of solids does not work.
+It happens because the algorithm for splitting solids (*BOPAlgo_BuilderSolid*) always tries to create the closed loops (shells) and make solids from them. But if the input solid is not closed, what can be expected from its splits?
+For performing Boolean Operations on open solids another approach is used, which does not rely on the splits of the solids to be correct, but tries to select the splits of faces, which are necessary for the given type of operation.
+The point here is that the type of Boolean operation clearly defines the states for the faces to be taken into result:
+- For **COMMON** operation all the faces from the arguments located inside any solid of the opposite group must be taken;
+- For **FUSE** operation all the faces from the arguments located outside of all solids of the opposite group must be taken;
+- For **CUT** operation all the faces from the Objects located outside of all solids of the Tools and all faces from the Tools located inside any solid of the Objects must be taken;
+- For **CUT21** operation all the faces from the Objects located inside any solid of the Tools and all faces from the Tools located outside of all solids of the Objects must be taken.
+From the selected faces the result solids are built. Please note, that the result may contain as normal (closed) solids as the open ones.
+
+Even with this approach, the correct result of Boolean operation on open solids cannot be always guaranteed.
+This is explained by non-manifold nature of open solids: in some cases classification of a face depends on the point of the face chosen for classification.
+
+@section specification__boolean_10a Section Algorithm 
+
+@subsection specification__boolean_10a_1 Arguments
+
+The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the Algorithms.
+
+@subsection specification__boolean_10a_2 Results and general rules
+* The result of Section operation is a compound. Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments. 
+* The result of Section operation contains shapes that have dimension that is  less then 2 i.e. vertices and edges. 
+* The result of Section operation contains standalone vertices if these vertices do not belong to the edges of the result.
+* The result of Section operation contains vertices and edges of the arguments (or images of the arguments) that belong to at least two arguments (or two images of the arguments).
+* The result of Section operation contains Section vertices and edges obtained from Face/Face interferences.
+* The result of Section operation contains vertices that are the result of interferences between vertices and faces.
+* The result of Section operation contains edges that are the result of interferences between edges and faces (Common Blocks),
+
+@subsection specification__boolean_10a_3  Examples
+
+@subsubsection specification__boolean_10a_3_1 Case 1: Two Vertices
+
+Let us consider two interfering vertices: *V1* and *V2*.
+
+@figure{/specification/boolean_operations/images/boolean_image080.png,"",131}
+
+The result of *Section* operation is the compound that contains a new vertex *V*.
+
+@figure{/specification/boolean_operations/images/boolean_image081.png,"",128}
+
+@subsubsection specification__boolean_10a_3_2 Case 1: Case 2: A Vertex and an Edge
+
+Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image082.png,"",230}
+
+The result of *Section* operation is the compound that contains vertex *V1*.
+
+@figure{/specification/boolean_operations/images/boolean_image083.png,"",230}
+
+@subsubsection specification__boolean_10a_3_3 Case 1: Case 2: A Vertex and a Face
+Let us consider vertex *V1* and face *F2*, that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image084.png,"",230}
+
+The result of *Section* operation is the compound that contains vertex *V1*.
+
+@figure{/specification/boolean_operations/images/boolean_image085.png,"",230}
+
+@subsubsection specification__boolean_10a_3_4 Case 4: A Vertex and a Solid
+
+Let us consider vertex *V1* and solid *Z2*. The vertex *V1* is inside the solid *Z2*.
+
+@figure{/specification/boolean_operations/images/boolean_image086.png,"",230}
+The result of *Section* operation is an empty compound.
+
+@subsubsection specification__boolean_10a_3_5 Case 5: Two edges intersecting at one point
+
+Let us consider edges *E1* and *E2*, that intersect in a 3D point:
+
+@figure{/specification/boolean_operations/images/boolean_image087.png,"",230}
+
+The result of *Section* operation is the compound that contains a new vertex *Vnew*.
+
+@figure{/specification/boolean_operations/images/boolean_image088.png,"",230}
+
+@subsubsection specification__boolean_10a_3_6 Case 6: Two edges having a common block
+
+Let us consider edges *E1* and *E2*, that have a common block:
+
+@figure{/specification/boolean_operations/images/boolean_image089.png,"",230}
+The result of *Section* operation is the compound that contains a new edge *Enew*.
+
+@figure{/specification/boolean_operations/images/boolean_image090.png,"",230}
+
+@subsubsection specification__boolean_10a_3_7 Case 7: An Edge and a Face intersecting at a point
+
+Let us consider edge *E1* and face *F2*, that intersect at a 3D point:
+@figure{/specification/boolean_operations/images/boolean_image091.png,"",230}
+
+The result of *Section* operation is the compound that contains a new vertex *Vnew*.
+
+@figure{/specification/boolean_operations/images/boolean_image092.png,"",230}
+@subsubsection specification__boolean_10a_3_8 Case 8: A Face and an Edge that have a common block
+
+Let us consider edge *E1* and face *F2*, that have a common block:
+
+@figure{/specification/boolean_operations/images/boolean_image093.png,"",230}
+
+The result of *Section* operation is the compound that contains new edge *Enew*. 
+
+@figure{/specification/boolean_operations/images/boolean_image094.png,"",230}
+@subsubsection specification__boolean_10a_3_9 Case 9: An Edge and a Solid intersecting at a point
+
+Let us consider edge *E1* and solid *Z2*, that intersect at a point:
+
+@figure{/specification/boolean_operations/images/boolean_image095.png,"",230}
+
+The result of *Section* operation is the compound that contains a new vertex *Vnew*. 
+
+@figure{/specification/boolean_operations/images/boolean_image096.png,"",230}
+
+@subsubsection specification__boolean_10a_3_10 Case 10: An Edge and a Solid that have a common block
+
+Let us consider edge *E1* and solid *Z2*, that have a common block at a face:
+
+@figure{/specification/boolean_operations/images/boolean_image097.png,"",230}
+The result of *Section* operation is the compound that contains a new edge *Enew*. 
+
+@figure{/specification/boolean_operations/images/boolean_image098.png,"",230}
+@subsubsection specification__boolean_10a_3_11 Case 11: Two intersecting faces
+
+Let us consider two intersecting faces *F1* and *F2*:
+@figure{/specification/boolean_operations/images/boolean_image099.png,"",230}
+
+The result of *Section* operation is the compound that contains a new edge *Enew*. 
+
+@figure{/specification/boolean_operations/images/boolean_image100.png,"",230}
+@subsubsection specification__boolean_10a_3_12 Case 12: Two faces that have a common part
+
+Let us consider two faces *F1* and *F2* that have a common part:
+
+@figure{/specification/boolean_operations/images/boolean_image133.png,"",230}
+The result of *Section* operation is the compound that contains 4 new edges.
+
+@figure{/specification/boolean_operations/images/boolean_image134.png,"",230}
+
+@subsubsection specification__boolean_10a_3_13 Case 13: Two faces that have overlapping edges
+
+Let us consider two faces *F1* and *F2* that have a overlapping edges:
+
+@figure{/specification/boolean_operations/images/boolean_image101.png,"",230}
+
+The result of *Section* operation is the compound that contains a new edge *Enew*.
+
+@figure{/specification/boolean_operations/images/boolean_image102.png,"",230}
+@subsubsection specification__boolean_10a_3_14 Case 14: Two faces that have overlapping vertices
+
+Let us consider two faces *F1* and *F2* that have overlapping vertices:
+
+@figure{/specification/boolean_operations/images/boolean_image103.png,"",230}
+The result of *Section* operation is the compound that contains a new vertex *Vnew*. 
+@figure{/specification/boolean_operations/images/boolean_image104.png,"",230}
+@subsubsection specification__boolean_10a_3_15 Case 15: A Face and a Solid that have an intersection curve
+
+Let us consider face *F1* and solid *Z2* that have an intersection curve:
+@figure{/specification/boolean_operations/images/boolean_image105.png,"",230}
+The result of *Section* operation is the compound that contains new edges.
+
+@figure{/specification/boolean_operations/images/boolean_image106.png,"",230}
+@subsubsection specification__boolean_10a_3_16 Case 16: A Face and a Solid that have overlapping faces.
+
+Let us consider face *F1* and solid *Z2* that have overlapping faces:
+
+@figure{/specification/boolean_operations/images/boolean_image107.png,"",230}
+The result of *Section* operation is the compound that contains new edges
+@figure{/specification/boolean_operations/images/boolean_image108.png,"",230}
+@subsubsection specification__boolean_10a_3_17 Case 17: A Face and a Solid that have overlapping edges.
+
+Let us consider face *F1* and solid *Z2* that have a common part on edge:
+
+@figure{/specification/boolean_operations/images/boolean_image109.png,"",230}
+
+The result of *Section* operation is the compound that contains a new edge *Enew*.
+
+@figure{/specification/boolean_operations/images/boolean_image110.png,"",230}
+@subsubsection specification__boolean_10a_3_18 Case 18: A Face and a Solid that have overlapping vertices.
+
+Let us consider face *F1* and solid *Z2* that have overlapping vertices:
+
+@figure{/specification/boolean_operations/images/boolean_image111.png,"",230}
+  
+The result of *Section* operation is the compound that contains a new vertex *Vnew*.
+@figure{/specification/boolean_operations/images/boolean_image112.png,"",230}
+
+@subsubsection specification__boolean_10a_3_19 Case 19: Two intersecting Solids
+
+Let us consider two intersecting solids *Z1* and *Z2*:
+@figure{/specification/boolean_operations/images/boolean_image113.png,"",230}
+
+The result of *Section* operation is the compound that contains new edges.
+@figure{/specification/boolean_operations/images/boolean_image114.png,"",230}
+
+@subsubsection specification__boolean_10a_3_20 Case 20: Two Solids that have overlapping faces
+
+Let us consider two solids *Z1* and *Z2* that have a common part on face:
+@figure{/specification/boolean_operations/images/boolean_image115.png,"",230}
+
+The result of *Section* operation is the compound that contains new edges.
+@figure{/specification/boolean_operations/images/boolean_image116.png,"",230}
+@subsubsection specification__boolean_10a_3_21 Case 21: Two Solids that have overlapping edges
+
+Let us consider two solids *Z1* and *Z2* that have overlapping edges:
+@figure{/specification/boolean_operations/images/boolean_image117.png,"",230}
+The result of *Section* operation is the compound that contains a new edge *Enew*.
+@figure{/specification/boolean_operations/images/boolean_image118.png,"",230}
+
+@subsubsection specification__boolean_10a_3_22 Case 22: Two Solids that have overlapping vertices
+
+Let us consider two solids *Z1* and *Z2* that have overlapping vertices: 
+@figure{/specification/boolean_operations/images/boolean_image119.png,"",230}
+
+The result of *Section* operation is the compound that contains a new vertex *Vnew*.
+@figure{/specification/boolean_operations/images/boolean_image120.png,"",230}
+
+@subsection specification__boolean_10a_4 Class BOPAlgo_Section
+
+SA is implemented in the class *BOPAlgo_Section*. The class has no specific fields.
+The main steps of the *BOPAlgo_Section*  are the same as of *BOPAlgo_Builder* except for the following steps:
+
+* Build Images for Wires;
+* Build Result of Type Wire;
+* Build Images for Faces;
+* Build Result of Type Face;
+* Build Images for Shells;
+* Build Result of Type Shell;
+* Build Images for Solids;
+* Build Result of Type Solid;
+* Build Images for Type CompSolid;
+* Build Result of Type CompSolid;
+* Build Images for Compounds;
+Some aspects of building the result are described in the next paragraph
+
+@subsection specification__boolean_10a_5 Building the Result
+
+| No | Contents        | Implementation |
+| :---- | :---- | :------ |
+| 1 | Build the result of the operation using all information contained in *FaceInfo*, Common Block, Shared entities of the arguments, etc. | *BOPAlgo_Section:: BuildSection()* |
+
+@section specification__boolean_10b Volume Maker Algorithm
+
+The Volume Maker algorithm has been designed for building the elementary volumes (solids) from a set of connected, intersecting, or nested shapes. The algorithm can also be useful for splitting solids into parts, or constructing new solid(s) from set of intersecting or connected faces or shells.
+The algorithm creates only closed solids. In general case the result solids are non-manifold: fragments of the input shapes (wires, faces) located inside the solids are added as internal sub-shapes to these solids.
+But the algorithm allows preventing the addition of the internal for solids parts into result. In this case the result solids will be manifold and not contain any internal parts. However, this option does not prevent from the occurrence of the internal edges or vertices in the faces.<br>
+Non-closed faces, free wires etc. located outside of any solid are always excluded from the result.
+
+The Volume Maker algorithm is implemented in the class BOPAlgo_MakerVolume. It is based on the General Fuse (GF) algorithm. All the options of the GF algorithm (see @ref specification__boolean_7_3a "GF Options") are also available in this algorithm.
+
+The requirements for the arguments are the same as for the arguments of GF algorithm - they could be of any type, but each argument should be valid and not self-interfered.
+
+The algorithm allows disabling the calculation of intersections among the arguments. In this case the algorithm will run much faster, but the user should guarantee that the arguments do not interfere with each other, otherwise the result will be invalid (e.g. contain unexpected parts) or empty.
+This option is useful e.g. for building a solid from the faces of one shell or from the shapes that have already been intersected.
+
+@subsection specification__boolean_10b_1 Usage
+
+#### C++ Level
+The usage of the algorithm on the API level:
+~~~~
+BOPAlgo_MakerVolume aMV;
+// Set the arguments
+TopTools_ListOfShape aLS = …; // arguments
+aMV.SetArguments(aLS);
+
+// Set options for the algorithm
+// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+...
+// Additional option of the algorithm
+Standard_Boolean bAvoidInternalShapes = Standard_False; // Set to True to exclude from the result any shapes internal to the solids
+aMV.SetAvoidInternalShapes(bAvoidInternalShapes);
+
+// Perform the operation
+aMV.Perform();
+if (aMV.HasErrors()) { //check error status
+  return;
+}
+//
+const TopoDS_Shape& aResult = aMV.Shape(); // result of the operation
+~~~~
+
+#### Tcl Level
+To use the algorithm in Draw the command mkvolume has been implemented. The usage of this command is following:
+~~~~
+Usage: mkvolume r b1 b2 ... [-c] [-ni] [-ai]
+Options:
+-c - use this option to have input compounds considered as set of separate arguments (allows passing multiple arguments as one compound);
+-ni - use this option to disable the intersection of the arguments;
+-ai - use this option to avoid internal for solids shapes in the result.
+~~~~
+
+@subsection specification__boolean_10b_2 Examples
+
+#### Example 1
+Creation of 9832 solids from sphere and set of 63 planes:
+
+<table align="center">
+<tr>
+  <td>@figure{/specification/boolean_operations/images/mkvolume_image001.png,"Arguments",200}</td>
+  <td>@figure{/specification/boolean_operations/images/mkvolume_image002.png,"Results",200}</td>
+</tr>
+</table>
+
+#### Example 2
+Creating compartments on a ship defined by hull shell and a set of planes. The ship is divided on compartments by five transverse bulkheads and a deck – six compartments are created:
+
+<table align="center">
+<tr>
+  <td>@figure{/specification/boolean_operations/images/mkvolume_image003.png,"Arguments",200}</td>
+  <td>@figure{/specification/boolean_operations/images/mkvolume_image004.png,"Results",200}</td>
+</tr>
+</table>
+
+@section specification__boolean_10c_Cells Cells Builder algorithm
+
+The Cells Builder algorithm is an extension of the General Fuse algorithm. The result of General Fuse algorithm contains all split parts of the arguments. The Cells Builder algorithm provides means to specify if any given split part of the arguments (referred to as Cell) can be taken or avoided in the result.
+
+The possibility of selecting any Cell allows combining any possible result and gives the Cells Builder algorithm a very wide sphere of application - from building the result of any Boolean operation to building the result of any application-specific operation.
+
+The algorithm builds Cells only once and then just reuses them for combining the result. This gives this algorithm the performance advantage over Boolean operations, which always rebuild the splits to obtain the desirable result.
+
+Thus, the Cells Builder algorithm can be especially useful for simulating Boolean expressions, i.e. a sequence of Boolean operations on the same arguments. Instead of performing many Boolean operations it allows getting the final result in a single operation. The Cells Builder will also be beneficial to obtain the results of different Boolean operations on the same arguments - Cut and Common, for example.
+
+The Cells Builder algorithm also provides the possibility to remove any internal boundaries between splits of the same type, i.e. to fuse any same-dimensional parts added into the result and to keep any other parts as separate. This possibility is implemented through the Cells material approach: to remove the boundary between two Cells, both Cells should be assigned with the same material ID. However, if the same material ID has been assigned to the Cells of different dimension, the removal of the internal boundaries for that material will not be performed. Currently, such case is considered a limitation for the algorithm.
+
+The algorithm can also create containers from the connected Cells added into result - WIRES from Edges, SHELLS from Faces and COMPSOLIDS from Solids.
+
+@subsection specification__boolean_10c_Cells_1 Usage
+
+The algorithm has been implemented in the *BOPAlgo_CellsBuilder* class.
+
+Cells Builder is based on the General Fuse algorithm. Thus all options of the General Fuse algorithm (see @ref specification__boolean_7_3a "GF Options") are also available in this algorithm.
+
+The requirements for the input shapes are the same as for General Fuse - each argument should be valid in terms of *BRepCheck_Analyzer* and *BOPAlgo_ArgumentAnalyzer*.
+
+The result of the algorithm is a compound containing the selected parts of the basic type (VERTEX, EDGE, FACE or SOLID). The default result is an empty compound. It is possible to add any Cell by using the methods *AddToRessult()* and *AddAllToResult()*. It is also possible to remove any part from the result by using methods *RemoveFromResult()* and *RemoveAllFromResult()*. The method *RemoveAllFromResult()* is also suitable for clearing the result.
+
+The Cells that should be added/removed to/from the result are defined through the input shapes containing the parts that should be taken *(ShapesToTake)* and the ones containing parts that should be avoided (ShapesToAvoid).
+To be taken into the result the part must be IN all shapes from *ShapesToTake* and OUT of all shapes from *ShapesToAvoid*.
+
+To remove Internal boundaries, it is necessary to set the same material to the Cells, between which the boundaries should be removed, and call the method *RemoveInternalBoundaries()*.
+The material should not be equal to 0, as this is the default material ID. The boundaries between Cells with this material ID will not be removed. The same Cell cannot be added with different materials.
+It is also possible to remove the boundaries when the result is combined. To do this, it is necessary to set the material for parts (not equal to 0) and set the flag *bUpdate* to TRUE.
+If the same material ID has been set for parts of different dimension, the removal of internal boundaries for this material will not be performed.
+
+It is possible to create typed Containers from the parts added into result by using method *MakeContainers()*. The type of the containers will depend on the type of the input shapes: WIRES for EDGE, SHELLS for FACES and COMPSOLIDS for SOLIDS. The result will be a compound containing containers.
+
+#### API usage
+Here is the example of the algorithm use on the API level:
+~~~~
+BOPAlgo_CellsBuilder aCBuilder;
+// Set the arguments
+TopTools_ListOfShape aLS = …; // arguments
+aCBuilder.SetArguments(aLS);
+
+// Set options for the algorithm
+// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+...
+
+aCBuilder.Perform(); // build splits of all arguments (GF)
+if (aCBuilder.HasErrors()) { // check error status
+  return;
+}
+//
+// collecting of the cells into result
+const TopoDS_Shape& anEmptyRes = aCBuilder.Shape(); // empty result, as nothing has been added yet 
+const TopoDS_Shape& anAllCells = aCBuilder.GetAllParts(); //all split parts 
+//
+TopTools_ListOfShape aLSToTake = ...; // parts of these arguments will be taken into result
+TopTools_ListOfShape aLSToAvoid = ...; // parts of these arguments will not be taken into result
+//
+Standard_Integer iMaterial = 1; // defines the material for the cells
+Standard_Boolean bUpdate = Standard_False; // defines whether to update the result right now or not
+// adding to result
+aCBuilder.AddToResult(aLSToTake, aLSToAvoid, iMaterial, bUpdate);
+aCBuilder.RemoveInternalBoundaries(); // removing of the boundaries
+TopoDS_Shape aResult = aCBuilder.Shape(); // the result
+// removing from result
+aCBuilder.AddAllToResult();
+aCBuilder.RemoveFromResult(aLSToTake, aLSToAvoid);
+aResult = aCBuilder.Shape(); // the result
+~~~~
+
+#### DRAW usage
+
+The following set of new commands has been implemented to run the algorithm in DRAW Test Harness:
+~~~~
+bcbuild          : Initialization of the Cells Builder. Use: *bcbuild r*
+bcadd            : Add parts to result. Use: *bcadd r s1 (0,1) s2 (0,1) ... [-m material [-u]]*
+bcaddall         : Add all parts to result. Use: *bcaddall r [-m material [-u]]*
+bcremove         : Remove parts from result. Use: *bcremove r s1 (0,1) s2 (0,1) ...*
+bcremoveall      : Remove all parts from result. Use: *bcremoveall*
+bcremoveint      : Remove internal boundaries. Use: *bcremoveint r*
+bcmakecontainers : Make containers from the parts added to result. Use: *bcmakecontainers r*
+~~~~
+
+Here is the example of the algorithm use on the DRAW level:
+~~~~
+psphere s1 15
+psphere s2 15
+psphere s3 15
+ttranslate s1 0 0 10
+ttranslate s2 20 0 10
+ttranslate s3 10 0 0 
+bclearobjects; bcleartools
+baddobjects s1 s2 s3
+bfillds
+# rx will contain all split parts
+bcbuild rx 
+# add to result the part that is common for all three spheres
+bcadd res s1 1 s2 1 s3 1 -m 1
+# add to result the part that is common only for first and third spheres
+bcadd res s1 1 s2 0 s3 1 -m 1
+# remove internal boundaries
+bcremoveint res
+~~~~
+
+@subsection specification__boolean_10c_Cells_2 Examples
+
+The following simple example illustrates the possibilities of the algorithm working on a cylinder and a sphere intersected by a plane:
+~~~~
+pcylinder c 10 30 
+psphere s 15
+ttranslate s 0 0 30
+plane p 0 0 20 1 0 0
+mkface f p -25 30 -17 17
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_001.png,"Arguments",160} 
+
+~~~~
+bclearobjects
+bcleartools
+baddobjects c s f
+bfillds
+bcbuild r
+~~~~
+
+#### 1. Common for all arguments
+
+~~~~
+bcremoveall
+bcadd res c 1 s 1 f 1
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_002.png,"The result of COMMON operation",126} 
+
+#### 2. Common between cylinder and face
+
+~~~~
+bcremoveall
+bcadd res f 1 c 1
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_003.png,"The result of COMMON operation between cylinder and face",90} 
+
+#### 3. Common between cylinder and sphere
+
+~~~~
+bcremoveall
+bcadd res c 1 s 1
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_004.png,"The result of COMMON operation between cylinder and sphere",120} 
+
+#### 4. Fuse of cylinder and sphere
+
+~~~~
+bcremoveall
+bcadd res c 1 -m 1
+bcadd res s 1 -m 1
+bcremoveint res
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_005.png,"The result of FUSE operation between cylinder and sphere",160} 
+
+#### 5. Parts of the face inside solids - FUSE(COMMON(f, c), COMMON(f, s))
+
+~~~~
+bcremoveall
+bcadd res f 1 s 1 -m 1
+bcadd res f 1 c 1 -m 1
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_006_1.png,"Parts of the face inside solids",160} 
+
+~~~~
+bcremoveint res
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_006_2.png,"Unified parts of the face inside solids",160} 
+
+#### 6. Part of the face outside solids
+
+~~~~
+bcremoveall
+bcadd res f 1 c 0 s 0
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_007.png,"Part of the face outside solids",160} 
+
+#### 7. Fuse operation (impossible using standard Boolean Fuse operation)
+
+~~~~
+bcremoveall
+bcadd res c 1 -m 1
+bcadd res s 1 -m 1
+bcadd res f 1 c 0 s 0
+bcremoveint res
+~~~~
+
+@figure{/specification/boolean_operations/images/cells_algorithm_008.png,"Fuse operation",160} 
+
+
+These examples may last forever. To define any new operation, it is just necessary to define, which Cells should be taken and which should be avoided.
+
+
+@section specification__boolean_10     Algorithm Limitations 
+
+The chapter describes the problems that are considered as Algorithm limitations. In most cases an Algorithm failure is caused by a combination of various factors, such as self-interfered arguments, inappropriate or ungrounded values of the argument tolerances, adverse mutual position of the arguments, tangency, etc.
+
+A lot of failures of GFA algorithm can be caused by bugs in low-level algorithms: Intersection Algorithm, Projection Algorithm, Approximation Algorithm, Classification Algorithm, etc.
+* The Intersection, Projection and Approximation Algorithms are mostly used at the Intersection step. Their bugs directly cause wrong section results (i.e. incorrect section edges, section points, missing section edges or micro edges). It is not possible to obtain a correct final result of the GFA if a section result is wrong.
+* The Projection Algorithm is used at the Intersection step. The purpose of Projection Algorithm is to compute 2D curves on surfaces. Wrong results here lead to incorrect or missing faces in the final GFA result. 
+* The Classification Algorithm is used at the Building step. The bugs in the Classification Algorithm lead to errors in selecting shape parts (edges, faces, solids) and ultimately to a wrong final GFA result.
+
+The description below illustrates some known GFA limitations. It does not enumerate exhaustively all problems that can arise in practice. Please address cases of Algorithm failure to the OCCT Maintenance Service.
+
+
+@subsection specification__boolean_10_1        Arguments
+
+@subsubsection specification__boolean_10_1_1   Common requirements 
+
+Each argument should be valid (in terms of *BRepCheck_Analyzer*), or conversely, if the argument is considered as non-valid (in terms of *BRepCheck_Analyzer*), it cannot be used as an argument of the algorithm.
+
+The class *BRepCheck_Analyzer* is used to check the overall validity of a shape. In OCCT a Shape (or its sub-shapes) is considered valid if it meets certain criteria. If the shape is found as invalid, it can be fixed by tools from *ShapeAnalysis, ShapeUpgrade* and *ShapeFix* packages.
+
+However, it is important to note that class *BRepCheck_Analyzer* is just a tool that can have its own problems; this means that due to a specific factor(s) this tool can sometimes provide a wrong result.
+
+Let us consider the following example:
+
+The Analyzer checks distances between couples of 3D check-points <i>(Pi, PSi)</i> of edge *E* on face *F*. Point *Pi* is obtained from the 3D curve (at the parameter *ti*) of the edge. *PSi* is obtained from 2D curve (at the parameter *ti*) of the edge on surface *S* of face *F*. To be valid the distance should be less than *Tol(E)* for all couples of check-points. The number of these check-points is a predefined value (e.g. 23). 
+
+Let us consider the case when edge *E* is recognized valid (in terms of *BRepCheck_Analyzer*).
+
+Further, after some operation, edge *E* is split into two edges *E1* and *E2*. Each split edge has the same 3D curve and 2D curve as the original edge *E*. 
+
+Let us check *E1* (or E2). The Analyzer again checks the distances between the couples of check-points points <i>(Pi, PSi)</i>. The number of these check-points is the same constant value (23), but there is no guarantee that the distances will be less than *Tol(E)*, because the points chosen for *E1* are not the same as for *E*. 
+
+Thus, if *E1* is recognized by the Analyzer as non-valid, edge *E*  should also be non-valid. However *E* has been recognized as valid. Thus the Analyzer gives a wrong result for *E*.
+
+The fact that the argument is a valid shape (in terms of *BRepCheck_Analyzer*) is a necessary but insufficient requirement to produce a valid result of the Algorithms.
+
+@subsubsection specification__boolean_10_1_3   Pure self-interference
+
+The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) should share these entities.
+
+#### Example 1: Compound of two edges
+The compound of two edges *E1* and *E2* is a self-interfered shape and cannot be used as the argument of the Algorithms.
+
+@figure{/specification/boolean_operations/images/operations_image036.svg,"Compound of two edges",230}
+
+#### Example 2: Self-interfered Edge
+The edge *E* is a self-interfered shape and cannot be used as an argument of the Algorithms.
+
+@figure{/specification/boolean_operations/images/operations_image037.svg,"Self-interfered Edge",140}
+#### Example 3: Self-interfered Face
+The face *F* is a self-interfered shape and cannot be used as an argument of the Algorithms.
+
+@figure{/specification/boolean_operations/images/operations_image038.svg,"Self-interfered Face",230}
+####   Example 4: Face of Revolution
+The face *F* has been obtained by revolution of edge *E* around line *L*.
+
+@figure{/specification/boolean_operations/images/operations_image039a.png,"Face of Revolution: Arguments",230}
+@figure{/specification/boolean_operations/images/operations_image039b.png,"Face of Revolution: Result",230}
+
+In spite of the fact that face *F* is valid (in terms of *BRepCheck_Analyzer*) it is a self-interfered shape and cannot be used as the argument of the Algorithms.
+
+@subsubsection specification__boolean_10_1_4   Self-interferences due to tolerances
+#### Example 1: Non-closed Edge
+
+Let us consider edge *E* based on a non-closed circle. @figure{/specification/boolean_operations/images/operations_image040.png,"Edge based on a non-closed circle",230}
+
+The distance between the vertices of *E* is *D=0.69799*. The values of the tolerances *Tol(V1)=Tol(V2)=0.5*.
+@figure{/specification/boolean_operations/images/operations_image041.png,"Distance and Tolerances",230}
+In spite of the fact that the edge *E* is valid in terms of *BRepCheck_Analyzer*, it is a self-interfered shape because its vertices are interfered. Thus, edge *E* cannot be used as an argument of the Algorithms.
+
+#### Example 2: Solid containing an interfered vertex
+
+Let us consider solid *S* containing vertex V. @figure{/specification/boolean_operations/images/operations_image042.png,"Solid containing an interfered vertex",230}
+
+The value of  tolerance Tol(V)= 50.000075982061.
+
+@figure{/specification/boolean_operations/images/operations_image043.png,"Tolerance",230}
+
+In spite of the fact that solid *S* is valid in terms of *BRepCheck_Analyzer* it is a self-interfered shape because vertex *V* is interfered with a lot of sub-shapes from *S* without any topological connection with them. Thus solid *S* cannot be used as an argument of the Algorithms.
+
+@subsubsection specification__boolean_10_1_5 Parametric representation
+The parameterization of some surfaces (cylinder, cone, surface of revolution) can be the cause of limitation.
+
+####   Example 1: Cylindrical surface
+The parameterization range for cylindrical surface is:
+
+@figure{/specification/boolean_operations/images/boolean_image135.png,"",230}
+
+The range of *U* coordinate is always restricted while the range of *V* coordinate is non-restricted.
+
+Let us consider a cylinder-based *Face 1* with radii *R=3* and *H=6*. 
+
+@figure{/specification/boolean_operations/images/operations_image044.png,"Face 1",230}
+
+@figure{/specification/boolean_operations/images/operations_image045.png,"P-Curves for Face 1",230}
+
+Let us also consider a cylinder-based *Face 2* with radii *R=3000* and *H=6000* (resulting from scaling Face 1 with scale factor *ScF=1000*). 
+
+@figure{/specification/boolean_operations/images/operations_image046.png,"Face 2",230}
+
+@figure{/specification/boolean_operations/images/operations_image047.png,"P-Curves for Face 2",230}
+
+Pay attention to the Zoom value of the Figures.
+
+It is obvious that starting with some value of *ScF*, e.g. *ScF>1000000*, all sloped p-Curves on *Face 2*  will be almost vertical. At least, there will be no difference between the values of angles computed by standard C Run-Time Library functions, such as *double acos(double x)*. The loss of accuracy in computation of angles can cause failure of some BP sub-algorithms, such as building faces from a set of edges or building solids from a set of faces.
+
+
+@subsubsection specification__boolean_10_1_6 Using tolerances of vertices to fix gaps
+
+It is possible to create shapes that use sub-shapes of lower order to avoid gaps in the tolerance-based data model.
+
+Let us consider the following example:
+
+@figure{/specification/boolean_operations/images/operations_image048.png,"Example",230}
+
+* Face *F* has two edges *E1* and *E2* and two vertices, the base plane is <i>{0,0,0, 0,0,1}</i>;
+* Edge *E1* is based on line <i>{0,0,0, 1,0,0}, Tol(E1) = 1.e-7; </i>
+* Edge *E2* is based on line <i>{0,1,0, 1,0,0}, Tol(E2) = 1.e-7;</i>
+* Vertex *V1*, point <i>{0,0.5,0}, Tol(V1) = 1;</i>
+* Vertex *V2*, point <i>{10,0.5,0}, Tol(V2) = 1;</i>
+* Face *F* is valid (in terms of *BRepCheck_Analyzer*).
+The values of tolerances *Tol(V1)* and *Tol(V2)* are big enough to fix the gaps between the ends of the edges, but the vertices *V1* and *V2* do not contain any information about the trajectories connecting the corresponding ends of the edges. Thus, the trajectories are undefined. This will cause failure of some sub-algorithms of BP. For example, the sub-algorithms for building faces from a set of edges use the information about all edges connected in a vertex. The situation when a vertex has several pairs of edges such as above will not be solved in a right way. 
+
+
+@subsection specification__boolean_11_1        Intersection problems
+@subsubsection specification__boolean_11_1_1 Pure intersections and common zones 
+
+#### Example: Intersecting Edges
+
+Let us consider the intersection between two edges:
+* *E1* is based on a line: <i>{0,-10,0, 1,0,0}, Tol(E1)=2.</i>
+* *E2* is based on a circle: <i>{0,0,0, 0,0,1}, R=10, Tol(E2)=2.</i>
+
+@figure{/specification/boolean_operations/images/operations_image049.png,"Intersecting Edges",320}
+
+The result of pure intersection between *E1* and *E2* is vertex *Vx {0,-10,0}*.
+
+The result of intersection taking into account tolerances is the common zone *CZ* (part of 3D-space where the distance between the curves is less than or equals to the sum of edge tolerances. 
+
+The Intersection Part of Algorithms uses the result of pure intersection *Vx* instead of *CZ* for the following reasons: 
+* The Algorithms do not produce Common Blocks between edges based on underlying curves of explicitly different type (e.g. Line / Circle). If the curves have different types, the rule of thumb is that the produced result is of type **vertex**. This rule does not work for non-analytic curves (Bezier, B-Spline) and their combinations with analytic curves.
+* The algorithm of intersection between two surfaces *IntPatch_Intersection* does not compute *CZ* of the intersection between curves and points. So even if *CZ* were computed by Edge/Edge intersection algorithm, its result could not be treated by Face/Face intersection algorithm.
+
+@subsubsection specification__boolean_11_2_2 Tolerances and inaccuracies
+
+The following limitations result from modeling errors or inaccuracies.
+
+#### Example: Intersection of planar faces
+
+Let us consider two planar rectangular faces *F1* and *F2*.
+
+The intersection curve between the planes is curve *C12*. The curve produces a new intersection edge *EC12*. The edge goes through vertices *V1* and *V2* thanks to big tolerance values of vertices *Tol(V1)* and *Tol(V2)*. So, two straight edges *E12* and *EC12* go through two vertices, which is  impossible in this case.
+
+@figure{/specification/boolean_operations/images/operations_image050.svg,"Intersecting Faces",320}
+
+
+The problem cannot be solved in general, because the length of *E12* can be infinite and the values of *Tol(V1)* and *Tol(V2)* theoretically can be infinite too.
+
+In a particular case the problem can be solved in several ways:
+* Reduce, if possible, the values of *Tol(V1)* and *Tol(V2)* (refinement of *F1*).
+* Analyze the value of *Tol(EC12)* and increase *Tol(EC12)* to get a common part between the edges *EC12* and *E12*. Then the common part will be rejected as there is an already existing edge *E12* for face *F1*.
+
+It is easy to see that if *C12* is slightly above the tolerance spheres of *V1* and *V2* the problem does not appear. 
+
+#### Example: Intersection of two edges
+
+Let us consider two edges *E1* and *E2*, which have common vertices *V1* and *V2*. The edges *E1* and *E2* have 3D-curves *C1* and *C2. Tol(E1)=1.e<sup>-7</sup>, Tol(E2)=1.e<sup>-7</sup>.*
+
+*C1* practically coincides in 3D with *C2*. The value of deflection is *Dmax* (e.g. *Dmax=1.e<sup>-6</sup>*). 
+
+@figure{/specification/boolean_operations/images/operations_image051.svg,"Intersecting Edges",420}
+
+The evident and prospective result should be the Common Block between *E1* and *E2*. However, the result of intersection differs. 
+
+@figure{/specification/boolean_operations/images/operations_image052.svg,"Result of Intersection",420}
+
+The result contains three new vertices *Vx1, Vx2* and *Vx3*, 8 new edges <i>(V1, Vx1, Vx2, Vx3, V2)</i> and no Common Blocks. This is correct due to the source data: *Tol(E1)=1.e<sup>-7</sup>, Tol(E2)=1.e<sup>-7</sup>* and <i>Dmax=1.e<sup>-6</sup></i>.
+
+In this particular case the problem can be solved by several ways:
+* Increase, if possible, the values *Tol(E1)* and *Tol(E2)* to get coincidence in 3D between *E1* and *E2* in terms of tolerance.
+* Replace *E1* by a more accurate model.
+
+The example can be extended from 1D (edges) to 2D (faces).
+
+@figure{/specification/boolean_operations/images/operations_image053.svg,"Intersecting Faces",420}
+
+The comments and recommendations are the same as for 1D case above.
+
+
+@subsubsection specification__boolean_11_2_3 Acquired Self-interferences
+####   Example 1: Vertex and edge
+
+Let us consider vertex *V1* and edge *E2*. 
+
+@figure{/specification/boolean_operations/images/operations_image054.svg,"Vertex and Edge",171}
+
+Vertex *V1* interferes with vertices *V12* and *V22*.
+So vertex *V21* should interfere with vertex *V22*, which is impossible because vertices *V21* and *V22* are the vertices of edge *E2*, thus *V21* is not equal to *V22*.
+
+The problem cannot be solved in general, because the length can be as small as possible to provide validity of *E2* (in the extreme case: *Length (E2) = Tol(V21) + Tol(V22) + e,* where *e-> 0*).
+
+In a particular case the problem can be solved by refinement of arguments, i.e. by decreasing the values of *Tol(V21)*, *Tol(V22)* and  *Tol(V1)*.
+
+#### Example 2: Vertex and wire
+  
+Let us consider vertex *V2* and wire consisting of edges *E11* and *E12*. 
+
+@figure{/specification/boolean_operations/images/operations_image055.svg,"Vertex and Wire",200}
+
+The arguments themselves are not self-intersected.
+Vertex *V2* interferes with edges *E11* and *E12*. Thus, edge *E11* should interfere with edge *E22*, but it is impossible because edges *E11* and *E12* cannot interfere by the condition.
+The cases when a non-self-interfered argument (or its sub-shapes) become interfered due to the intersections with other arguments (or their sub-shapes) are considered as limitations for the Algorithms.
+
+@section specification__boolean_11a Advanced Options
+
+The previous chapters describe so called Basic Operations. Most of tasks can be solved using Basic Operations. Nonetheless, there are cases that can not be solved straightforwardly by Basic Operations. The tasks are considered as limitations of Basic Operations. 
+
+The chapter is devoted to Advanced Options. In some cases the usage of Advanced Options allows overcoming the limitations, improving the quality of the result of operations, robustness and performance of the operators themselves.
+
+@subsection specification__boolean_11a_1  Fuzzy Boolean Operation
+
+Fuzzy Boolean operation is the option of Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations, in which additional user-specified tolerance is used. This option allows operators to handle robustly cases of touching and near-coincident, misaligned entities of the arguments.
+
+The Fuzzy option is useful on the shapes with gaps or embeddings between the entities of these shapes, which are not covered by the tolerance values of these entities. Such shapes can be the result of modeling mistakes, or translating process, or import from other systems with loss of precision, or errors in some algorithms. 
+
+Most likely, the Basic Operations will give unsatisfactory results on such models. The result may contain unexpected and unwanted small entities, faulty entities (in terms of *BRepCheck_Analyzer*), or there can be no result at all.
+
+With the Fuzzy option it is possible to get the expected result -- it is just necessary to define the appropriate value of fuzzy tolerance for the operation. To define that value it is necessary to measure the value of the gap (or the value of embedding depth) between the entities of the models, slightly increase it (to make the shifted entities coincident in terms of their tolerance plus the additional one) and pass it to the algorithm.
+
+Fuzzy option is included in interface of Intersection Part (class *BOPAlgo_PaveFiller*) and application programming interface (class  *BRepAlgoAPI_BooleanOperation*)
+
+@subsubsection specification__boolean_11a_1_1 Examples
+The following examples demonstrate the advantages of usage Fuzzy option operations over the Basic Operations in typical situations.
+
+#### Case 1
+
+In this example the cylinder (shown in yellow and transparent) is subtracted from the box (shown in red). The cylinder is shifted by  5e<sup>-5</sup> relatively to the box along its axis (the distance between rear faces of the box and cylinder is 5e<sup>-5</sup>).
+
+@figure{/specification/boolean_operations/images/boolean_image121.png,"",240}
+  
+The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 5e<sup>-5</sup>:
+
+@figure{/specification/boolean_operations/images/boolean_image122.png,"Result of CUT operation obtained with Basic Operations",240}
+
+@figure{/specification/boolean_operations/images/boolean_image123.png,"Result of CUT operation obtained with Fuzzy Option",240}
+
+In this example Fuzzy option allows eliminating a very thin part of the result shape produced by Basic algorithm due to misalignment of rear faces of the box and the cylinder. 
+
+#### Case 2
+
+In this example two boxes are fused. One of them has dimensions 10*10*10, and the other is 10*10.000001*10.000001 and adjacent to the first one. There is no gap in this case as the surfaces of the neighboring faces coincide, but one box is slightly greater than the other. 
+
+@figure{/specification/boolean_operations/images/boolean_image124.png,"",240}
+
+The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e<sup>-6</sup>: 
+
+@figure{/specification/boolean_operations/images/boolean_image125.png,"Result of CUT operation obtained with Basic Operations",240}
+
+@figure{/specification/boolean_operations/images/boolean_image126.png,"Result of CUT operation obtained with Fuzzy Option",240}
+
+In this example Fuzzy option allows eliminating an extremely narrow face in the result produced by Basic operation.
+
+#### Case 3
+
+In this example the small planar face (shown in orange) is subtracted from the big one (shown in yellow). There is a gap 1e<sup>-5</sup> between the edges of these faces.
+
+@figure{/specification/boolean_operations/images/boolean_image127.png,"",240}
+
+The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e<sup>-5</sup>: 
+
+@figure{/specification/boolean_operations/images/boolean_image128.png,"Result of CUT operation obtained with Basic Operations",240}
+
+@figure{/specification/boolean_operations/images/boolean_image129.png,"Result of CUT operation obtained with Fuzzy Option",240}
+
+In this example Fuzzy options eliminated a pin-like protrusion resulting from the gap between edges of the argument faces.
+
+#### Case 4
+
+In this example the small edge is subtracted from the big one. The edges are overlapping not precisely, with max deviation between them equal to 5.28004e<sup>-5</sup>. We will use 6e<sup>-5</sup> value for Fuzzy option.
+
+@figure{/specification/boolean_operations/images/boolean_image130.png,"",240}
+
+The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 6e<sup>-5</sup>: 
+
+@figure{/specification/boolean_operations/images/boolean_image131.png,"Result of CUT operation obtained with Basic Operations",240}
+
+@figure{/specification/boolean_operations/images/boolean_image132.png,"Result of CUT operation obtained with Fuzzy Option",240}
+
+This example stresses not only the validity, but also the performance issue. The usage of Fuzzy option with the appropriate value allows processing the case much faster than with the pure Basic operation. The performance gain for the case is 45 (Processor: Intel(R) Core(TM) i5-3450 CPU @ 3.10 GHz).
+
+@subsection specification__boolean_11a_2 Gluing Operation
+
+The Gluing operation is the option of the Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations.
+It has been designed to speed up the computation of the interferences among arguments of the operations on special cases, in which the arguments may be overlapping but do not have real intersections between their sub-shapes.
+
+This option cannot be used on the shapes having real intersections, like intersection vertex between edges, or intersection vertex between edge and a face or intersection line between faces:
+
+@figure{/specification/boolean_operations/images/glue_options_image002.png,"Intersecting faces",240}
+
+There are two possibilities of overlapping shapes:
+* The shapes can be partially coinciding - the faces do not have intersection curves, but overlapping. The faces of such arguments will be split during the operation. The following picture illustrates such shapes:
+
+@figure{/specification/boolean_operations/images/glue_options_image001.png,"Partially coinciding faces",240}
+
+* The shapes can be fully coinciding - there should be no partial overlapping of the faces, thus no intersection of type EDGE/FACE at all. In such cases the faces will not be split during the operation.
+
+@figure{/specification/boolean_operations/images/glue_options_image003.png,"Full coinciding faces of the boxes",240}
+
+Thus, there are two possible options - for full and partial coincidence of the shapes.
+
+Even though there are no real intersections on such cases without Gluing options the algorithm will still intersect the sub-shapes of the arguments with interfering bounding boxes.
+
+The performance improvement in gluing mode is achieved by excluding the most time consuming computations and in some case can go up to 90%:
+* Exclude computation of FACE/FACE intersections for partial coincidence;
+* Exclude computation of VERTEX/FACE, EDGE/FACE and FACE/FACE intersections for full coincidence.
+
+By setting the Gluing option for the operation user should guarantee that the arguments are really coinciding. The algorithm does not check this itself. Setting inappropriate option for the operation is likely to lead to incorrect result.
+
+@subsubsection specification__boolean_11a_2_1 Usage
+
+The Gluing option is an enumeration implemented in BOPAlgo_GlueEnum.hxx:
+* BOPAlgo_GlueOff - default value for the algorithms, Gluing is switched off;
+* BOPAlgo_GlueShift - Glue option for shapes with partial coincidence;
+* BOPAlgo_GlueFull - Glue option for shapes with full coincidence.
+
+#### API level
+For setting the Gluing options for the algorithm it is just necessary to call the SetGlue(const BOPAlgo_Glue) method with appropriate value:
+~~~~
+BOPAlgo_Builder aGF;
+//
+....
+// setting the gluing option to speed up intersection of the arguments
+aGF.SetGlue(BOPAlgo_GlueShift)
+//
+....
+~~~~
+
+#### TCL level
+For setting the Gluing options in DRAW it is necessary to call the <i>bglue</i> command with appropriate value:
+* 0 - default value, Gluing is off;
+* 1 - for partial coincidence;
+* 2 - for full coincidence
+
+~~~~
+bglue 1
+~~~~
+
+@subsubsection specification__boolean_11a_2_2 Examples
+#### Case1 - Fusing the 64 bspline boxes into one solid
+
+@figure{/specification/boolean_operations/images/glue_options_image004.png,"BSpline Boxes with partial coincidence",240}
+
+Performance improvement from using the GlueShift option in this case is about 70 percent.
+
+#### Case2 - Sewing faces of the shape after reading from IGES
+
+@figure{/specification/boolean_operations/images/glue_options_image005.png,"Faces with coinciding but not shared edges",240}
+
+Performance improvement in this case is also about 70 percent.
+
+@subsection specification__boolean_11a_3 Safe processing mode
+
+The safe processing mode is the advanced option in Boolean Operation component. This mode can be applied to all Basic operations such as General Fuse, Splitting, Boolean, Section, Maker Volume, Cells building.
+This option allows keeping the input arguments untouched. In other words, switching this option on prevents the input arguments from any modification such as tolerance increase, addition of the P-Curves on edges, etc.
+
+The option can be very useful for implementation of the Undo/Redo mechanism in the applications and allows performing the operation many times without changing the inputs.
+
+By default the safe processing option is switched off for the algorithms. Enabling this option might slightly decrease the performance of the operation, because instead of the modification of some entity it will be necessary to create the copy of this entity and modify it. However, this degradation should be very small because the copying is performed only in case of necessity.
+
+The option is also available in the Intersection algorithm - *BOPAlgo_PaveFiller*. To perform several different operations on the same arguments, the safe processing mode can be enabled in PaveFiller, prepared only once and then used in operations. It is enough to set this option to PaveFiller only and all algorithms taking this PaveFiller will also work in the safe mode.
+
+@subsubsection specification__boolean_11a_3_1 Usage
+
+#### API level
+
+To enable/disable the safe processing mode for the algorithm, it is necessary to call *SetNonDestructive()* method with the  appropriate value:
+~~~~
+BOPAlgo_Builder aGF;
+//
+....
+// enabling the safe processing mode to prevent modification of the input shapes
+aGF.SetNonDestructive(Standard_True);
+//
+....
+~~~~
+
+#### TCL level
+To enable the safe processing mode for the operation in DRAW, it is necessary to call the <i>bnondestructive</i> command with the appropriate value:
+* 0 - default value, the safe mode is switched off;
+* 1 - the safe mode will be switched on.
+
+~~~~
+bnondestructive 1
+~~~~
+
+@subsection specification__boolean_11a_4 How to disable check of input solids for inverted status
+
+By default, all input solids are checked for inverted status, i.e. the solids are classified to understand if they are holes in the space (negative volumes) or normal solids (positive volumes). The possibility to disable the check of the input solids for inverted status is the advanced option in Boolean Operation component. This option can be applied to all Basic operations, such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building.
+This option allows avoiding time-consuming classification of the input solids and processing them in the same way as positive volumes, saving up to 10 percent of time on the cases with a big number of input solids.
+
+The classification should be disabled only if the user is sure that there are no negative volumes among the input solids, otherwise the result may be invalid.
+
+@subsubsection specification__boolean_11a_4_1 Usage
+
+#### API level
+
+To enable/disable the classification of the input solids it is necessary to call *SetCheckInverted()* method with the appropriate value:
+~~~~
+BOPAlgo_Builder aGF;
+//
+....
+// disabling the classification of the input solid
+aGF.SetCheckInverted(Standard_False);
+//
+....
+~~~~
+
+#### TCL level
+To enable/disable the classification of the solids in DRAW, it is necessary to call *bcheckinverted* command with the appropriate value:
+* 0 - disabling the classification;
+* 1 - default value, enabling the classification.
+
+~~~~
+bcheckinverted 0
+~~~~
+
+@subsection specification__boolean_11a_5_obb Usage of Oriented Bounding Boxes
+
+Since Oriented Bounding Boxes are usually much tighter than Axes Aligned Bounding Boxes (for more information on OBB see the @ref occt_modat_6 "Bounding boxes" chapter of Modeling data User guide) its usage can significantly speed-up the intersection stage of the operation by reducing the number of interfering objects.
+
+@subsubsection specification__boolean_11a_5_obb_1 Usage
+
+#### API level
+To enable/disable the usage of OBB in the operation it is necessary to call the *SetUseOBB()* method with the approriate value:
+~~~~
+BOPAlgo_Builder aGF;
+//
+....
+// Enabling the usage of OBB in the operation
+aGF.SetUseOBB(Standard_True);
+//
+....
+~~~~
+
+#### TCL level
+To enable/disable the usage of OBB in the operation in DRAW it is necessary to call the *buseobb* command with the approriate value: 
+* 0 - disabling the usage of OBB;
+* 1 - enabling the usage of OBB.
+~~~~
+buseobb 1
+~~~~
+
+@section specification__boolean_ers Errors and warnings reporting system
+
+The chapter describes the Error/Warning reporting system of the algorithms in the Boolean Component.
+
+The errors and warnings are collected in the instance of the class *Message_Report* maintained as a field by common base class of Boolean operation algorithms *BOPAlgo_Options*.
+
+The error is reported in for problems which cannot be treated and cause the algorithm to fail. 
+In this case the result of the operation will be incorrect or incomplete or there will be no result at all. 
+
+The warnings are reported for the problems which can be potentially handled or ignored and thus do not cause the algorithms to stop their work (but probably affect the result). 
+
+All possible errors and warnings that can be set by the algorithm are listed in its header file.
+The complete list of errors and warnings that can be generated by Boolean operations is defined in *BOPAlgo_Alerts.hxx*.
+
+Use method *HasErrors()* to check for presence of error; method *HasError()* can be used to check for particular error.
+Methods *DumpErrors()* outputs textual description of collected errors into the stream.
+Similar methods *HasWarnings()*, *HasWarning()*, and *DumpWarnings()* are provided for warnings.
+
+Note that messages corresponding to errors and warnings are defined in resource file *BOPAlgo.msg*.
+These messages can be localized; for that put translated version to separate file and load it in the application by call to *Message_MsgFile::Load()* .
+
+Here is the example of how to use this system:
+~~~~~
+BOPAlgo_PaveFiller aPF;
+aPF.SetArguments(...);
+aPF.Perform();
+if (aPF.HasErrors()) {
+  aPF.DumpErrors(std::cerr);
+  //
+  if (aPF.HasError(STANDARD_TYPE(BOPAlgo_AlertNullInputShapes)) {
+    // some actions
+  }
+  if (aPF.HasWarning(STANDARD_TYPE(BOPAlgo_AlertTooSmallEdge)) {
+    // some actions
+  }
+  ...
+}
+~~~~~
+
+DRAW commands executing Boolean operations output errors and warnings generated by these operations in textual form.
+Additional option allows saving shapes for which warnings have been generated, as DRAW variables. 
+To activate this option, run command *bdrawwarnshapes* with argument 1 (or with 0 to deactivate):
+~~~~
+bdrawwarnshapes 1
+~~~~
+
+After setting this option and running an algorithm the result will look as follows:
+~~~~
+Warning: The interfering vertices of the same argument: ws_1_1 ws_1_2
+Warning: The positioning of the shapes leads to creation of small edges without valid range: ws_2_1
+~~~~
+
+
+@section specification__boolean_history History Information
+
+All operations in Boolean Component support @ref occt_modalg_hist "History information". This chapter describes how the History is filled for these operations.
+
+Additionally to Vertices, Edges and Faces the history is also available for the Solids.
+
+The rules for filling the History information about Deleted and Modified shapes are the same as for the API algorithms.
+
+Only the rules for Generated shapes require clarification.
+In terms of the algorithms in Boolean Component the shape from the arguments can have Generated shapes only if these new shapes 
+have been obtained as a result of pure intersection (not overlapping) of this shape with any other shapes from arguments. Thus, the Generated shapes are always:
+* VERTICES created from the intersection points and may be Generated from edges and faces only;
+* EDGES created from the intersection edges and may be Generated from faces only.
+
+So, only EDGES and FACES could have information about Generated shapes. For all other types of shapes the list of Generated shapes will be empty.
+
+@subsection specification__boolean_history_ex Examples
+
+Here are some examples illustrating the History information.
+
+@subsubsection specification__boolean_history_ex_del Deleted shapes
+
+The result of CUT operation of two overlapping planar faces (see the example below) does not contain any parts from the tool face. Thus, the tool face is considered as Deleted.
+If the faces are not fully coinciding, the result must contain some parts of the object face. In this case object face will be considered as not deleted.
+But if the faces are fully coinciding, the result must be empty, and both faces will be considered as Deleted.
+
+Example of the overlapping faces:
+
+~~~~
+plane p 0 0 0 0 0 1
+mkface f1 p -10 10 -10 10
+mkface f2 p 0 20 -10 10
+
+bclearobjects
+bcleartools
+baddobjects f1
+baddtools f2
+bfillds
+bbop r 2
+
+savehistory cut_hist
+isdeleted cut_hist f1
+# Not deleted
+
+isdeleted cut_hist f2
+# Deleted
+~~~~
+
+@subsubsection specification__boolean_history_ex_modif Modified shapes
+
+In the FUSE operation of two edges intersecting in one point (see the example below), both edges will be split by the intersection point. All these splits will be contained in the result.
+Thus, each of the input edges will be Modified into its two splits.
+But in the CUT operation on the same edges, the tool edge will be Deleted from the result and, thus, will not have any Modified shapes.
+
+Example of the intersecting edges:
+~~~~
+line l1 0 0 0 1 0 0
+mkedge e1 l1 -10 10
+
+line l2 0 0 0 0 1 0
+mkedge e2 l2 -10 10
+
+bclearobjects
+bcleartools
+baddobjects e1
+baddtools e2
+bfillds
+
+# fuse operation
+bbop r 1
+
+savehistory fuse_hist
+
+modified m1 fuse_hist e1
+nbshapes m1
+# EDGES: 2
+
+modified m2 fuse_hist e2
+nbshapes m2
+# EDGES: 2
+
+# cut operation
+bbop r 2
+
+savehistory cut_hist
+
+modified m1 cut_hist e1
+nbshapes m1
+# EDGES: 2
+
+modified m2 cut_hist e2
+# The shape has not been modified
+~~~~
+
+
+@subsubsection specification__boolean_history_gen Generated shapes
+
+Two intersecting edges will both have the intersection vertices Generated from them.
+
+As for the operation with intersecting faces, consider the following example:
+
+~~~~
+plane p1 0 0 0 0 0 1
+mkface f1 p1 -10 10 -10 10
+
+plane p2 0 0 0 1 0 0
+mkface f2 p2 -10 10 -10 10
+
+bclearobjects
+bcleartools
+baddobjects f1
+baddtools f2
+bfillds
+
+# fuse operation
+bbop r 1
+
+savehistory fuse_hist
+
+generated gf1 fuse_hist f1
+nbshapes gf1
+# EDGES: 1
+
+generated gf2 fuse_hist f2
+nbshapes gf2
+# EDGES: 1
+
+
+# common operation - result is empty
+bbop r 0
+
+savehistory com_hist
+
+generated gf1 com_hist f1
+# No shapes were generated from the shape
+
+generated gf2 com_hist f2
+# No shapes were generated from the shape
+
+~~~~
+
+@section specification__boolean_simplification BOP result simplification
+
+The API algorithms implementing Boolean Operations provide possibility to simplify the result shape by unification of the connected tangential edges and faces.
+This simplification is performed by the method *SimplifyResult* which is implemented in the class *BRepAlgoAPI_BuilderAlgo* (General Fuse operation).
+It makes it available for users of the classes *BRepAlgoAPI_BooleanOperation* (all Boolean Operations) and *BRepAlgoAPI_Splitter* (split operation).
+
+The simplification is performed by the means of *ShapeUpgrade_UnifySameDom* algorithm. The result of operation is overwritten with the simplified result.
+
+The simplification is performed without creation of the Internal shapes, i.e. shapes connections will never be broken. It is performed on the whole result shape.
+Thus, if the input shapes contained connected tangent edges or faces unmodified during the operation they will also be unified.
+
+History of the simplification is merged into the main history of operation, thus it will be accounted when asking for Modified, Generated and Deleted shapes.
+
+Some options of the main operation are passed into the Unifier:
+- Fuzzy tolerance of the operation is given to the Unifier as the linear tolerance.
+- Non destructive mode here controls the safe input mode in Unifier.
+
+For controlling this possibility in DRAW the command **bsimplify** has been implemented. See the @ref occt_draw_bop_options "Boolean Operations options" chapter in draw user guide.
+
+
+@subsection specification__boolean_simplification_examples Examples
+
+Here is the simple example of simplification of the result of Fuse operation of two boxes:
+
+~~~~
+bsimplify -f 1
+
+box b1 10 10 15
+box b2 3 7 0 10 10 15
+bclearobjects
+bcleartools
+baddobjects b1
+baddtools b2
+bfillds
+bapibop r 1
+~~~~
+
+<table align="center">
+  <tr>
+    <td>@figure{/specification/boolean_operations/images/bop_simple_001.png, "Not simplified result", 420}</td>
+    <td>@figure{/specification/boolean_operations/images/bop_simple_002.png, "Simplified result", 420}</td>
+  </tr>
+</table>
+
+
+@section specification__boolean_11b Usage 
+
+The chapter contains some examples of the OCCT Boolean Component usage. The usage is possible on two levels: C++ and Tcl. 
+
+@subsection specification__boolean_11b_1 Package BRepAlgoAPI
+
+The package *BRepAlgoAPI* provides the Application Programming Interface of the Boolean Component.
+
+The package consists of the following classes:
+* *BRepAlgoAPI_Algo* -- the root class that provides the interface for algorithms. 
+* *BRepAlgoAPI_BuilderAlgo* -- the class API level of General Fuse algorithm.
+* *BRepAlgoAPI_Splitter* -- the class API level of the Splitter algorithm.
+* *BRepAlgoAPI_BooleanOperation* -- the root class for the classes *BRepAlgoAPI_Fuse*. *BRepAlgoAPI_Common*, *BRepAlgoAPI_Cut* and *BRepAlgoAPI_Section*.
+* *BRepAlgoAPI_Fuse* -- the class provides Boolean fusion operation. 
+* *BRepAlgoAPI_Common* -- the class provides Boolean common operation.
+* *BRepAlgoAPI_Cut* -- the class provides Boolean cut operation.
+* *BRepAlgoAPI_Section* -- the class provides Boolean section operation.
+
+@figure{/specification/boolean_operations/images/operations_image065.png,"Diagram of BRepAlgoAPI package",420}
+
+The detailed description of the classes can be found in the corresponding .hxx files. The examples are below in this chapter.
+
+@subsection specification__boolean_11b_2 Package BOPTest
+The package *BOPTest* provides the usage of the Boolean Component on Tcl level. The method *BOPTest::APICommands* contains corresponding Tcl commands: 
+
+* *bapibuild* -- for General Fuse Operator;
+* *bapisplit* -- for Splitter Operator;
+* *bapibop* -- for Boolean Operator and Section Operator.
+
+The examples of how to use the commands are below in this chapter.
+
+@subsubsection specification__boolean_11b_2_1 Case 1. General Fuse operation
+
+The following example illustrates how to use General Fuse operator:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <BRepAlgoAPI_BuilderAlgo.hxx>
+ {…
+  BRepAlgoAPI_BuilderAlgo aBuilder;
+  //
+  // prepare the arguments
+  TopTools_ListOfShape& aLS=…;
+  //
+  // set the arguments 
+  aBuilder.SetArguments(aLS);
+  
+  // Set options for the algorithm
+  // setting options on this level is similar to setting options to GF algorithm on low level (see "GF Usage" chapter)
+  ...
+
+  // run the algorithm 
+  aBuilder.Build(); 
+  if (aBuilder.HasErrors()) {
+    // an error treatment
+    return;
+  }
+  //
+  // result of the operation aR
+  const TopoDS_Shape& aR=aBuilder.Shape();
+…
+}
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+box b1 10 10 10 
+box b2 3 4 5 10 10 10 
+box b3 5 6 7 10 10 10 
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the arguments
+baddobjects b1 b2 b3
+
+# set options for the algorithm (see "GF Usage" chapter)
+...
+
+# run the algorithm
+# r is the result of the operation
+bapibuild r 
+~~~~
+
+@subsubsection specification__boolean_11b_2_2 Case 2. Splitting operation
+
+The following example illustrates how to use the Splitter operator:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <BRepAlgoAPI_Splitter.hxx>
+//
+BRepAlgoAPI_BuilderAlgo aSplitter;
+//
+// prepare the arguments
+// objects
+TopTools_ListOfShape& aLSObjects = … ;
+// tools
+TopTools_ListOfShape& aLSTools = … ;
+//
+// set the arguments
+aSplitter.SetArguments(aLSObjects);
+aSplitter.SetTools(aLSTools);
+//
+// Set options for the algorithm
+// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+...
+//
+// run the algorithm 
+aSplitter.Build(); 
+// check error status
+if (aSplitter.HasErrors()) {
+  return;
+}
+//
+// result of the operation aResult
+const TopoDS_Shape& aResult = aSplitter.Shape();
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+# objects
+box b1 10 10 10 
+box b2 7 0 0 10 10 10
+
+# tools
+plane p 10 5 5 0 1 0
+mkface f p -20 20 -20 20
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the objects
+baddobjects b1 b2
+# set the tools
+baddtools f
+#
+# set options for the algorithm (see "GF Usage" chapter)
+...
+#
+# run the algorithm
+# r is the result of the operation
+bapisplit r 
+~~~~
+
+@subsubsection specification__boolean_11b_2_3 Case 3. Common operation
+
+The following example illustrates how to use Common operation:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include < BRepAlgoAPI_Common.hxx>
+ {…
+  Standard_Boolean bRunParallel;
+  Standard_Real aFuzzyValue;
+  BRepAlgoAPI_Common aBuilder;
+  
+  // perpare the arguments
+  TopTools_ListOfShape& aLS=…;
+  TopTools_ListOfShape& aLT=…;
+  //
+  bRunParallel=Standard_True;
+  aFuzzyValue=2.1e-5;
+  //
+  // set the arguments 
+  aBuilder.SetArguments(aLS);
+  aBuilder.SetTools(aLT);
+  //   
+  // Set options for the algorithm
+  // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+  ...
+  //
+  // run the algorithm 
+  aBuilder.Build(); 
+  if (aBuilder.HasErrors()) {
+    // an error treatment
+    return;
+  }
+  //
+  // result of the operation aR
+  const TopoDS_Shape& aR=aBuilder.Shape();
+…
+}
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+box b1 10 10 10 
+box b2 7 0 4 10 10 10 
+box b3 14 0 0 10 10 10 
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the arguments
+baddobjects b1 b3
+baddtools b2
+#
+# set options for the algorithm (see "GF Usage" chapter)
+...
+#
+# run the algorithm
+# r is the result of the operation
+# 0 means Common operation
+bapibop r 0
+~~~~
+
+@subsubsection specification__boolean_11b_2_4 Case 4. Fuse operation
+
+The following example illustrates how to use Fuse operation:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include < BRepAlgoAPI_Fuse.hxx>
+ {…
+  Standard_Boolean bRunParallel;
+  Standard_Real aFuzzyValue;
+  BRepAlgoAPI_Fuse aBuilder;
+  
+  // perpare the arguments
+  TopTools_ListOfShape& aLS=…;
+  TopTools_ListOfShape& aLT=…;
+  //
+  bRunParallel=Standard_True;
+  aFuzzyValue=2.1e-5;
+  //
+  // set the arguments 
+  aBuilder.SetArguments(aLS);
+  aBuilder.SetTools(aLT);
+  //   
+  // Set options for the algorithm
+  // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+  ...
+  //
+  // run the algorithm 
+  aBuilder.Build(); 
+  if (aBuilder.HasErrors()) {
+    // an error treatment
+    return;
+  }
+  //
+  // result of the operation aR
+  const TopoDS_Shape& aR=aBuilder.Shape();
+…
+}
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+box b1 10 10 10 
+box b2 7 0 4 10 10 10 
+box b3 14 0 0 10 10 10 
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the arguments
+baddobjects b1 b3
+baddtools b2
+#
+# set options for the algorithm (see "GF Usage" chapter)
+...
+#
+# run the algorithm
+# r is the result of the operation
+# 1 means Fuse operation
+bapibop r 1
+~~~~
+
+@subsubsection specification__boolean_11b_2_5 Case 5. Cut operation
+
+The following example illustrates how to use Cut operation:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include < BRepAlgoAPI_Cut.hxx>
+ {…
+  Standard_Boolean bRunParallel;
+  Standard_Real aFuzzyValue;
+  BRepAlgoAPI_Cut aBuilder;
+  
+  // perpare the arguments
+  TopTools_ListOfShape& aLS=…;
+  TopTools_ListOfShape& aLT=…;
+  //
+  bRunParallel=Standard_True;
+  aFuzzyValue=2.1e-5;
+  //
+  // set the arguments 
+  aBuilder.SetArguments(aLS);
+  aBuilder.SetTools(aLT);
+  //   
+  // Set options for the algorithm
+  // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+  ...
+  //
+  // run the algorithm 
+  aBuilder.Build(); 
+  if (aBuilder.HasErrors()) {
+    // an error treatment
+    return;
+  }
+  //
+  // result of the operation aR
+  const TopoDS_Shape& aR=aBuilder.Shape();
+…
+}
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+box b1 10 10 10 
+box b2 7 0 4 10 10 10 
+box b3 14 0 0 10 10 10 
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the arguments
+baddobjects b1 b3
+baddtools b2
+#
+# set options for the algorithm (see "GF Usage" chapter)
+...
+#
+# run the algorithm
+# r is the result of the operation
+# 2 means Cut operation
+bapibop r 2
+~~~~
+
+
+@subsubsection specification__boolean_11b_2_6 Case 6. Section operation
+
+The following example illustrates how to use Section operation:
+
+#### C++ Level
+
+~~~~
+#include <TopoDS_Shape.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include < BRepAlgoAPI_Section.hxx>
+ {…
+  Standard_Boolean bRunParallel;
+  Standard_Real aFuzzyValue;
+  BRepAlgoAPI_Section aBuilder;
+  
+  // perpare the arguments
+  TopTools_ListOfShape& aLS=…;
+  TopTools_ListOfShape& aLT=…;
+  //
+  bRunParallel=Standard_True;
+  aFuzzyValue=2.1e-5;
+  //
+  // set the arguments 
+  aBuilder.SetArguments(aLS);
+  aBuilder.SetTools(aLT);
+  //   
+  // Set options for the algorithm
+  // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter)
+  ...
+  //
+  // run the algorithm 
+  aBuilder.Build(); 
+  if (aBuilder.HasErrors()) {
+    // an error treatment
+    return;
+  }
+  //
+  // result of the operation aR
+  const TopoDS_Shape& aR=aBuilder.Shape();
+…
+}
+~~~~
+
+#### Tcl Level
+
+~~~~
+# prepare the arguments
+box b1 10 10 10 
+box b2 3 4 5 10 10 10 
+box b3 5 6 7 10 10 10 
+#
+# clear inner contents
+bclearobjects; bcleartools;
+#
+# set the arguments
+baddobjects b1 b3
+baddtools b2
+#
+# set options for the algorithm (see "GF Usage" chapter)
+...
+#
+# run the algorithm
+# r is the result of the operation
+# 4 means Section operation
+bapibop r 4
+~~~~
+
diff --git a/dox/specification/boolean_operations/images/boolean_image001.svg b/dox/specification/boolean_operations/images/boolean_image001.svg
new file mode 100644 (file)
index 0000000..c9de288
--- /dev/null
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="169.595"
+   height="115.66244"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="boolean_image001.svg">
+  <defs
+     id="defs4">
+    <clipPath
+       id="clipEmfPath1"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         id="rect2990"
+         height="17.998533"
+         width="17.278183"
+         y="14.642874"
+         x="3.1828232" />
+    </clipPath>
+    <clipPath
+       id="clipEmfPath2"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         id="rect2993"
+         height="18.151062"
+         width="17.429747"
+         y="17.388412"
+         x="54.86581" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="49.849591"
+     inkscape:cy="76.436836"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1042"
+     inkscape:window-height="640"
+     inkscape:window-x="18"
+     inkscape:window-y="263"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-99.629249,-395.59893)">
+    <g
+       id="g2995"
+       transform="matrix(2.2499232,0,0,2.2499232,101.67528,395.53094)">
+      <text
+         id="text2997"
+         style="font-size:13.94379711px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Calibri"
+         y="12.507455"
+         x="-0.90937805"
+         xml:space="preserve"> </text>
+      <path
+         id="path2999"
+         d="m 25.415222,0.49572229 c -13.84907,0 -25.07420523,11.29674871 -25.07420523,25.23417171 0,13.937423 11.22513523,25.234171 25.07420523,25.234171 13.84907,0 25.074205,-11.296748 25.074205,-25.234171 0,-13.937423 -11.225135,-25.23417171 -25.074205,-25.23417171"
+         style="fill:none;stroke:#000000;stroke-width:0.94726878px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3001"
+         d="m 24.941588,20.772671 c -2.491317,0 -4.518473,2.040088 -4.518473,4.547298 0,2.507211 2.027156,4.537766 4.518473,4.537766 2.491317,0 4.518472,-2.030555 4.518472,-4.537766 0,-2.50721 -2.027155,-4.547298 -4.518472,-4.547298"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3003"
+         d="m 24.941588,20.772671 c -2.491317,0 -4.518473,2.040088 -4.518473,4.547298 0,2.507211 2.027156,4.537766 4.518473,4.537766 2.491317,0 4.518472,-2.030555 4.518472,-4.537766 0,-2.50721 -2.027155,-4.547298 -4.518472,-4.547298"
+         style="fill:none;stroke:#000000;stroke-width:2.84180641px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <text
+         id="text3005"
+         style="font-size:13.94379711px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="27.60792"
+         x="3.1828232"
+         xml:space="preserve">V</text>
+      <text
+         id="text3007"
+         style="font-size:8.79065418px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="29.590809"
+         x="12.428167"
+         xml:space="preserve">1</text>
+      <text
+         id="text3009"
+         style="font-size:13.94379711px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="27.60792"
+         x="17.429747"
+         xml:space="preserve"> </text>
+      <path
+         id="path3011"
+         d="m 50.11052,0.49572229 c -13.84907,0 -25.074206,11.29674871 -25.074206,25.23417171 0,13.937423 11.225136,25.234171 25.074206,25.234171 13.84907,0 25.064732,-11.296748 25.064732,-25.234171 0,-13.937423 -11.215662,-25.23417171 -25.064732,-25.23417171"
+         clip-path="url(#clipEmfPath1)"
+         style="fill:none;stroke:#000000;stroke-width:0.94726878px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3013"
+         d="m 49.636885,20.772671 c -2.491317,0 -4.518472,2.040088 -4.518472,4.547298 0,2.507211 2.027155,4.537766 4.518472,4.537766 2.491317,0 4.509,-2.030555 4.509,-4.537766 0,-2.50721 -2.017683,-4.547298 -4.509,-4.547298"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3015"
+         d="m 49.636885,20.772671 c -2.491317,0 -4.518472,2.040088 -4.518472,4.547298 0,2.507211 2.027155,4.537766 4.518472,4.537766 2.491317,0 4.509,-2.030555 4.509,-4.537766 0,-2.50721 -2.017683,-4.547298 -4.509,-4.547298"
+         style="fill:none;stroke:#000000;stroke-width:2.84180641px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <text
+         id="text3017"
+         style="font-size:13.94379711px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="30.353456"
+         x="54.86581"
+         xml:space="preserve">V</text>
+      <text
+         id="text3019"
+         style="font-size:8.79065418px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="32.336346"
+         x="64.111153"
+         xml:space="preserve">2</text>
+      <text
+         id="text3021"
+         style="font-size:13.94379711px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="30.353456"
+         x="69.112732"
+         xml:space="preserve"> </text>
+      <path
+         id="path2999-0"
+         d="m 48.910577,0.49552764 c -13.84907,0 -25.074205,11.29674836 -25.074205,25.23417136 0,13.937423 11.225135,25.234171 25.074205,25.234171 13.849066,0 25.074206,-11.296748 25.074206,-25.234171 0,-13.937423 -11.22514,-25.23417136 -25.074206,-25.23417136"
+         style="fill:none;stroke:#000000;stroke-width:0.94726878px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffffff;stroke:#ffffff;stroke-width:0.105;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path4048"
+         sodipodi:cx="28.721825"
+         sodipodi:cy="25.876774"
+         sodipodi:rx="3.368609"
+         sodipodi:ry="3.368609"
+         d="m 32.090434,25.876774 c 0,1.860431 -1.508178,3.368609 -3.368609,3.368609 -1.860432,0 -3.368609,-1.508178 -3.368609,-3.368609 0,-1.860432 1.508177,-3.368609 3.368609,-3.368609 1.860431,0 3.368609,1.508177 3.368609,3.368609 z"
+         transform="translate(-4.1006914,-0.50166522)" />
+    </g>
+  </g>
+</svg>
diff --git a/dox/specification/boolean_operations/images/boolean_image002.svg b/dox/specification/boolean_operations/images/boolean_image002.svg
new file mode 100644 (file)
index 0000000..801bf48
--- /dev/null
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="285.03979"
+   height="232.59326"
+   id="svg3125"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="boolean_image002.svg">
+  <defs
+     id="defs3127">
+    <clipPath
+       id="clipEmfPath1"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         id="rect3138"
+         height="18.041756"
+         width="17.14065"
+         y="31.838394"
+         x="3.3078444" />
+    </clipPath>
+    <clipPath
+       id="clipEmfPath2"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         id="rect3141"
+         height="18.041756"
+         width="17.291004"
+         y="34.719009"
+         x="54.579433" />
+    </clipPath>
+    <clipPath
+       id="clipEmfPath3"
+       clipPathUnits="userSpaceOnUse">
+      <rect
+         id="rect3144"
+         height="17.890144"
+         width="17.14065"
+         y="0"
+         x="62.548332" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="29.908313"
+     inkscape:cy="188.48498"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1567"
+     inkscape:window-height="945"
+     inkscape:window-x="76"
+     inkscape:window-y="58"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata3130">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(57.231034,-388.06268)">
+    <g
+       id="g3146"
+       transform="matrix(3.0357354,0,0,3.0357354,-1.0688486,379.46075)">
+      <text
+         id="text3148"
+         style="font-size:13.83280373px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Calibri"
+         y="12.886969"
+         x="0"
+         xml:space="preserve"> </text>
+      <path
+         id="path3150"
+         d="m 25.626397,18.363931 0,0 c -0.253726,0 -0.460467,-0.217942 -0.460467,-0.483262 0.0094,-0.26532 0.225535,-0.46431 0.488659,-0.46431 l 0,0 c 0.253727,0.0095 0.460467,0.227418 0.45107,0.483262 0,0.26532 -0.216138,0.473785 -0.479262,0.46431 z m -1.823073,0.04738 0,0 c -0.263124,0.01895 -0.488659,-0.180038 -0.507454,-0.435883 -0.02819,-0.265319 0.169152,-0.492737 0.422878,-0.511688 l 0,0 c 0.263124,-0.01895 0.488659,0.170563 0.507454,0.435883 0.02819,0.255844 -0.169151,0.483261 -0.422878,0.511688 z m -1.860663,0.180039 0,0 c -0.253726,0.0379 -0.488658,-0.151612 -0.51685,-0.407456 -0.03759,-0.26532 0.150356,-0.502213 0.404083,-0.53064 l 0.0094,0 c 0.253727,-0.02843 0.488659,0.151612 0.516851,0.416932 0.02819,0.255844 -0.150357,0.492737 -0.413481,0.521164 z m -1.794881,0.322174 -0.0094,0 c -0.24433,0.05685 -0.498057,-0.09476 -0.55444,-0.350601 -0.05638,-0.255845 0.09397,-0.511689 0.347699,-0.568543 l 0,0 c 0.253727,-0.05685 0.507454,0.104233 0.563837,0.360077 0.05638,0.246369 -0.10337,0.502213 -0.347699,0.559067 z m -1.804279,0.46431 0,0 c -0.244329,0.07581 -0.507453,-0.07581 -0.573234,-0.322174 -0.07518,-0.255845 0.06578,-0.511689 0.319507,-0.587494 l 0,0 c 0.253727,-0.07581 0.507454,0.0758 0.582632,0.322174 0.06578,0.255844 -0.07518,0.511688 -0.328905,0.587494 z m -1.738498,0.615921 0,0 c -0.244329,0.09476 -0.51685,-0.0379 -0.601426,-0.274795 -0.08458,-0.246369 0.03759,-0.521165 0.281919,-0.615922 l 0,0 c 0.244329,-0.08528 0.51685,0.0379 0.601426,0.284272 0.08458,0.246368 -0.03759,0.521164 -0.281919,0.606445 z m -1.682114,0.72963 0,0 c -0.234932,0.113709 -0.51685,0.0095 -0.629618,-0.227417 -0.112767,-0.236893 -0.0094,-0.511688 0.216138,-0.625397 l 0.0094,0 c 0.225535,-0.113709 0.507453,-0.01895 0.620221,0.217941 0.112767,0.236893 0.01879,0.521165 -0.216138,0.634873 z m -1.635127,0.843339 0,0 c -0.216138,0.132659 -0.507454,0.05685 -0.648413,-0.161088 -0.131562,-0.227417 -0.05638,-0.511688 0.159754,-0.653824 l 0,0 c 0.225535,-0.13266 0.51685,-0.06633 0.648412,0.161087 0.131562,0.217942 0.06578,0.511689 -0.159753,0.653825 z m -1.606936,0.985474 0,0 c -0.216138,0.13266 -0.507454,0.06633 -0.639016,-0.161088 -0.140959,-0.217941 -0.06578,-0.511688 0.150357,-0.653824 l 0,0 c 0.225535,-0.13266 0.516851,-0.06633 0.648413,0.161087 0.131562,0.227418 0.06578,0.511689 -0.159754,0.653825 z m -1.465977,1.099182 -0.0094,0 C 9.9987087,23.812467 9.7073928,23.765089 9.547639,23.55662 9.3972824,23.348154 9.4442688,23.054407 9.6510091,22.89332 l 0,0 c 0.2067403,-0.151611 0.4980559,-0.113708 0.6578099,0.09476 0.150357,0.217942 0.112767,0.511689 -0.09397,0.6633 z m -1.390798,1.212891 0,0 c -0.197343,0.170563 -0.4980561,0.161088 -0.6672073,-0.0379 -0.1785484,-0.189515 -0.1597538,-0.492737 0.028192,-0.6633 l 0,-0.0095 c 0.197343,-0.170563 0.4980561,-0.161087 0.6672072,0.0379 0.1785485,0.189514 0.1597539,0.492737 -0.028192,0.672775 z m -1.3062227,1.298173 0,0 C 7.3392799,26.351956 7.047964,26.370908 6.850621,26.190869 6.6626753,26.010831 6.6438808,25.717084 6.8224292,25.518094 l 0,0 c 0.1691511,-0.189515 0.4698643,-0.208466 0.65781,-0.02843 0.197343,0.180039 0.2067402,0.473786 0.037589,0.672776 z m -1.2122498,1.383454 0,0 c -0.1597539,0.208466 -0.4510697,0.255844 -0.65781,0.09476 -0.2067403,-0.151611 -0.2537267,-0.454834 -0.093973,-0.6633 l 0,0 c 0.1503565,-0.208465 0.4416724,-0.255844 0.6578099,-0.09476 0.2067403,0.151612 0.2443295,0.454834 0.093973,0.6633 z m -1.1276743,1.516114 0,0 C 5.0275477,29.279951 4.7268346,29.317854 4.5200943,29.166243 4.313354,29.005156 4.2663676,28.711409 4.4261214,28.502943 l 0,0 c 0.1597539,-0.217941 0.4510697,-0.255844 0.65781,-0.104233 0.2067403,0.161087 0.2537267,0.454834 0.093973,0.6633 z m -0.9679203,1.572968 0,0 C 4.0690246,30.862395 3.787106,30.928725 3.5615712,30.796065 3.3454336,30.663405 3.2702553,30.369658 3.4112146,30.142241 l 0,0 C 3.5427766,29.9243 3.8340924,29.848494 4.05023,29.99063 c 0.2255349,0.13266 0.2913158,0.426407 0.1597539,0.644348 z m -0.855153,1.639299 0,0 C 3.2420635,32.511171 2.9601449,32.605929 2.7252128,32.49222 2.4996779,32.378511 2.3963078,32.09424 2.5090752,31.857347 l 0,0 c 0.1127674,-0.227417 0.394686,-0.33165 0.6296181,-0.217941 0.2349322,0.113708 0.328905,0.39798 0.2161376,0.634873 z m -0.7329883,1.686676 -0.0094,0 c -0.084573,0.246367 -0.3570941,0.379027 -0.6014235,0.28427 -0.2443294,-0.08528 -0.3664942,-0.360077 -0.2725213,-0.606446 l 0,0 c 0.084576,-0.246368 0.3570968,-0.369553 0.6014263,-0.284271 0.2443294,0.09476 0.3664941,0.360077 0.2819185,0.606445 z m -0.6390154,1.753007 0,0 c -0.065781,0.255844 -0.328905,0.39798 -0.5826317,0.322174 -0.2443294,-0.06633 -0.3852887,-0.33165 -0.3195077,-0.587494 l 0,0 c 0.075178,-0.246368 0.3383023,-0.39798 0.5826317,-0.322174 0.2537267,0.07581 0.394686,0.33165 0.3195077,0.587494 z m -0.4698643,1.800386 0,0.0095 C 1.4565792,37.77019 1.2028525,37.931277 0.94912582,37.874423 0.69539912,37.817568 0.54504255,37.5712 0.60142626,37.315356 l 0,-0.0095 C 0.65780996,37.059487 0.9021394,36.8984 1.1558661,36.955255 c 0.2537267,0.05685 0.4134806,0.312698 0.3570968,0.559067 z m -0.3476995,1.819336 0,0 c -0.028192,0.26532 -0.263124,0.445359 -0.52624799,0.416932 -0.25372671,-0.0379 -0.43227513,-0.274796 -0.40408328,-0.53064 l 0,0 c 0.0375891,-0.26532 0.27252128,-0.445359 0.52624799,-0.416932 0.26312398,0.0379 0.44167238,0.274796 0.40408328,0.53064 z m -0.197343,1.866716 0,0 C 0.9491258,41.456242 0.72359097,41.655232 0.46986427,41.63628 0.20674028,41.61733 0.01879457,41.389912 0.03758914,41.124592 l 0,0 c 0.01879457,-0.255844 0.24432942,-0.454834 0.49805613,-0.435883 0.26312399,0.01895 0.4510697,0.246369 0.43227513,0.511689 z m -0.0563837,1.847764 0,0 c 0,0.255844 -0.20674028,0.473785 -0.46046698,0.483261 -0.26312399,0 -0.47926156,-0.19899 -0.47926156,-0.46431 l 0,0 c -0.0093973,-0.26532 0.197343,-0.483261 0.46046699,-0.483261 0.2537267,-0.0095 0.46986427,0.19899 0.47926155,0.46431 z m 0.0751783,1.866715 0,0 C 1.0149068,45.170723 0.81756386,45.39814 0.55443987,45.426567 0.30071316,45.445517 0.07517831,45.246529 0.05638374,44.990685 l 0,0 c -0.02819185,-0.26532 0.16915114,-0.492737 0.42287784,-0.511689 0.263124,-0.01895 0.48865885,0.170563 0.50745342,0.435883 z m 0.2067402,1.828812 0,0 c 0.046987,0.26532 -0.1221647,0.511689 -0.38528863,0.559067 -0.2537267,0.04738 -0.49805612,-0.123184 -0.54504255,-0.379028 l 0,0 c -0.0469864,-0.26532 0.12216471,-0.511688 0.37589142,-0.559067 0.2537267,-0.04738 0.50745336,0.123184 0.55443976,0.379028 z m 0.3570969,1.847764 0,0 c 0.056384,0.255845 -0.093973,0.502213 -0.3476996,0.559067 -0.25372665,0.06633 -0.50745335,-0.09476 -0.56383706,-0.350601 l 0,0 c -0.0563837,-0.255844 0.10337014,-0.511688 0.35709684,-0.568543 0.24432942,-0.05685 0.49805612,0.104233 0.55443982,0.360077 z m 0.4792615,1.762483 0,0 c 0.093973,0.246368 -0.037589,0.521164 -0.2819185,0.615921 -0.2443294,0.08528 -0.5074534,-0.0379 -0.6014263,-0.284271 l 0,0 c -0.084576,-0.246369 0.037589,-0.521164 0.2819186,-0.606446 0.2443294,-0.09476 0.5168507,0.02843 0.6014262,0.274796 z m 0.6484127,1.781434 0,0 c 0.084576,0.246368 -0.037589,0.521164 -0.2819185,0.615921 -0.2443294,0.08528 -0.5074534,-0.0379 -0.6014263,-0.284271 l 0,0 c -0.084576,-0.246369 0.037589,-0.521164 0.2819186,-0.606446 0.2443294,-0.09476 0.5074534,0.02843 0.6014262,0.274796 z m 0.7517829,1.686677 0,0 c 0.1127674,0.236892 0.018794,0.521164 -0.2161376,0.634872 -0.2349321,0.113709 -0.5168507,0.0095 -0.6296181,-0.227417 l 0,0 c -0.1127674,-0.227417 -0.0094,-0.511688 0.2255348,-0.625397 0.2255349,-0.113708 0.5074534,-0.01895 0.6202209,0.217942 z m 0.8739475,1.629822 0,0 c 0.131562,0.217942 0.065781,0.511689 -0.1597538,0.644349 -0.2161376,0.142135 -0.5074535,0.06633 -0.6484127,-0.151612 l 0,0 c -0.131562,-0.227417 -0.065781,-0.521164 0.1597538,-0.653824 0.2161376,-0.13266 0.5074534,-0.06633 0.6484127,0.161087 z m 0.9773177,1.554017 0,0 c 0.1597538,0.208466 0.1221647,0.511689 -0.093973,0.6633 -0.2067402,0.161087 -0.4980561,0.123184 -0.6578099,-0.08528 l 0,-0.0095 c -0.1503566,-0.208466 -0.1127675,-0.502213 0.093973,-0.6633 0.2067403,-0.151611 0.5074534,-0.113709 0.65781,0.09476 z m 1.1276742,1.516114 0,0.0095 c 0.1597539,0.208465 0.1127675,0.502212 -0.093973,0.6633 -0.2067403,0.151611 -0.4980561,0.113708 -0.65781,-0.09476 l 0,0 C 5.5068092,58.891553 5.5443984,58.58833 5.7511387,58.436719 5.9578789,58.275632 6.2585921,58.313534 6.4089486,58.522 z m 1.2310444,1.383454 0,0 c 0.1785484,0.189514 0.1597539,0.492737 -0.028192,0.6633 -0.197343,0.180038 -0.4886589,0.170563 -0.6672073,-0.02843 l 0,0 c -0.1785484,-0.189514 -0.1597538,-0.492737 0.028192,-0.672776 0.197343,-0.170563 0.4886588,-0.161087 0.6672072,0.0379 z m 1.31562,1.279221 0,0.0095 c 0.1879457,0.170563 0.2067403,0.473786 0.037589,0.6633 -0.1785484,0.19899 -0.4792615,0.208465 -0.6672072,0.0379 l 0,0 C 8.1286519,61.715315 8.1192546,61.412092 8.2884057,61.222578 8.4669541,61.033064 8.75827,61.014112 8.955613,61.184675 z m 1.400195,1.19394 0,0 c 0.206741,0.161087 0.253727,0.454834 0.09397,0.6633 -0.150356,0.208466 -0.441672,0.255844 -0.6484123,0.09476 l -0.0094,0 c -0.2067403,-0.151611 -0.2443294,-0.445359 -0.093973,-0.6633 0.1597539,-0.208466 0.4510693,-0.246368 0.6578093,-0.09476 z m 1.484772,1.089707 0,0 c 0.225534,0.142136 0.291315,0.426407 0.159753,0.653824 -0.131562,0.227417 -0.422877,0.293747 -0.648412,0.161087 l 0,0 c -0.225535,-0.142135 -0.291316,-0.426407 -0.159754,-0.653824 0.140959,-0.227417 0.422878,-0.293747 0.648413,-0.161087 z m 1.606935,0.985474 0,0.0095 c 0.216138,0.13266 0.291316,0.426407 0.159754,0.644348 -0.140959,0.227417 -0.422878,0.293747 -0.648412,0.161087 l 0,0 c -0.225535,-0.13266 -0.291316,-0.426407 -0.159754,-0.653824 0.131562,-0.217941 0.422878,-0.293747 0.648412,-0.161087 z m 1.635128,0.824387 0,0.0095 c 0.234932,0.104233 0.338302,0.388504 0.225535,0.625397 -0.112768,0.236893 -0.394686,0.341125 -0.629618,0.227417 l 0,0 c -0.234932,-0.113709 -0.328905,-0.39798 -0.216138,-0.634873 0.10337,-0.236893 0.385289,-0.33165 0.620221,-0.227417 z m 1.691511,0.710678 0,0 c 0.24433,0.09476 0.375892,0.360078 0.281919,0.606446 -0.08458,0.246369 -0.357097,0.379029 -0.601426,0.284271 l 0,0 c -0.24433,-0.08528 -0.366494,-0.360077 -0.281919,-0.606445 0.09397,-0.246369 0.357097,-0.369553 0.601426,-0.284272 z m 1.747896,0.606446 0,0 c 0.253726,0.07581 0.394685,0.33165 0.328904,0.587494 -0.07518,0.255844 -0.338302,0.39798 -0.582631,0.322174 l 0,0 c -0.253727,-0.06633 -0.394686,-0.33165 -0.328905,-0.578018 0.07518,-0.255844 0.338302,-0.39798 0.582632,-0.33165 z m 1.804278,0.454834 0,0 c 0.253727,0.05685 0.404084,0.312699 0.3477,0.568543 -0.05638,0.255844 -0.300713,0.416931 -0.55444,0.350601 l -0.0094,0 c -0.24433,-0.05685 -0.404084,-0.303222 -0.3477,-0.559067 0.05638,-0.255844 0.310111,-0.416931 0.563837,-0.360077 z m 1.804279,0.303223 0,0 c 0.253727,0.02843 0.441673,0.26532 0.413481,0.53064 -0.03759,0.255844 -0.272522,0.445358 -0.526248,0.407456 l 0,0 c -0.263124,-0.02843 -0.441673,-0.26532 -0.413481,-0.521165 0.02819,-0.26532 0.263124,-0.445358 0.526248,-0.416931 z m 1.851265,0.180039 0,0 c 0.253727,0.01895 0.45107,0.246368 0.432275,0.511688 -0.01879,0.255844 -0.244329,0.454834 -0.507453,0.435883 l 0,0 c -0.263124,-0.02843 -0.45107,-0.255844 -0.432275,-0.511689 0.01879,-0.26532 0.244329,-0.454834 0.507453,-0.435882 z m 1.832471,0.01895 0,0 c 0.253727,0 0.469864,0.19899 0.479262,0.46431 0.0094,0.26532 -0.197343,0.483261 -0.460467,0.483261 l 0,0 c -0.253727,0.0095 -0.469865,-0.19899 -0.479262,-0.46431 -0.0094,-0.255844 0.197343,-0.473785 0.460467,-0.483261 z m 1.841868,-0.104233 0.0094,0 c 0.253727,-0.01895 0.479262,0.170563 0.507454,0.435883 0.01879,0.255844 -0.178549,0.483261 -0.432276,0.511688 l 0,0 c -0.263124,0.01895 -0.488658,-0.180038 -0.507453,-0.435882 -0.01879,-0.26532 0.169151,-0.492737 0.422878,-0.511689 z m 1.823073,-0.246368 0,0 c 0.253727,-0.04738 0.498056,0.123184 0.545043,0.379028 0.04699,0.255844 -0.122165,0.502213 -0.375892,0.549591 l 0,0 c -0.253726,0.04738 -0.498056,-0.113708 -0.545042,-0.379028 -0.04699,-0.255844 0.112767,-0.502213 0.375891,-0.549591 z m 1.823074,-0.379029 0,0 c 0.253726,-0.06633 0.507453,0.09476 0.563837,0.350601 0.05638,0.255845 -0.10337,0.511689 -0.357097,0.568543 l 0,0 c -0.253727,0.05685 -0.507454,-0.104233 -0.563837,-0.360077 -0.05638,-0.255844 0.10337,-0.502213 0.357097,-0.559067 z m 1.738497,-0.540115 0,0 c 0.24433,-0.09476 0.507454,0.0379 0.601427,0.284271 0.09397,0.236893 -0.03759,0.511688 -0.281919,0.606445 l 0,0 c -0.244329,0.08528 -0.507453,-0.0379 -0.601426,-0.284271 -0.09397,-0.246368 0.03759,-0.511688 0.281918,-0.606445 z m 1.757293,-0.653825 0.0094,0 c 0.234932,-0.08528 0.507453,0.0379 0.601426,0.284272 0.08458,0.246368 -0.03759,0.511688 -0.281918,0.606445 l 0,0 c -0.24433,0.09476 -0.507454,-0.0379 -0.601426,-0.284271 -0.09397,-0.236893 0.03759,-0.511689 0.272521,-0.606446 z m 1.663319,-0.795959 0,0 c 0.234932,-0.113709 0.516851,-0.01895 0.629618,0.217941 0.112768,0.236893 0.0094,0.521164 -0.225534,0.634873 l 0,0 c -0.234933,0.113708 -0.516851,0.0095 -0.629619,-0.217942 -0.112767,-0.236893 -0.0094,-0.521164 0.225535,-0.634872 z m 1.588142,-0.919145 0,0 c 0.225534,-0.13266 0.507453,-0.06633 0.648412,0.161088 0.131562,0.217941 0.06578,0.511688 -0.159754,0.644348 l 0,0.0095 c -0.216137,0.13266 -0.507453,0.06633 -0.648412,-0.161087 -0.131562,-0.227418 -0.06578,-0.511689 0.159754,-0.653825 z m 1.52236,-1.023377 0.0094,0 c 0.20674,-0.161087 0.498056,-0.113708 0.65781,0.09476 0.150357,0.208465 0.112767,0.502212 -0.09397,0.663299 l -0.0094,0 c -0.20674,0.161088 -0.498056,0.113709 -0.65781,-0.09476 -0.150357,-0.208465 -0.112768,-0.502212 0.09397,-0.6633 z m 1.456579,-1.127609 0,0 c 0.197343,-0.170563 0.488659,-0.161087 0.667207,0.02843 0.178549,0.19899 0.159754,0.492737 -0.02819,0.672775 l 0,0 c -0.197343,0.180039 -0.488658,0.161088 -0.667207,-0.02843 -0.178548,-0.19899 -0.159754,-0.492737 0.02819,-0.672775 z m 1.390798,-1.269746 0,0 c 0.197343,-0.180038 0.488659,-0.170563 0.667208,0.02843 0.178548,0.189515 0.159753,0.492737 -0.02819,0.6633 l 0,0 c -0.197343,0.180039 -0.488659,0.170563 -0.667208,-0.02843 -0.178548,-0.189514 -0.159753,-0.492737 0.02819,-0.6633 z m 1.249839,-1.364502 0,0 c 0.169151,-0.189515 0.469864,-0.208466 0.667207,-0.02843 0.187946,0.170563 0.206741,0.473786 0.02819,0.6633 l 0,0 c -0.169151,0.19899 -0.469864,0.217942 -0.65781,0.0379 -0.197343,-0.170563 -0.216137,-0.473785 -0.03759,-0.672775 z m 1.155866,-1.430833 0,0 c 0.150357,-0.217941 0.441673,-0.255844 0.65781,-0.104233 0.206741,0.161087 0.24433,0.454834 0.09397,0.6633 l 0,0 c -0.159754,0.208466 -0.45107,0.255844 -0.65781,0.104233 -0.20674,-0.161087 -0.253727,-0.454834 -0.09397,-0.6633 z m 1.043099,-1.516114 0,0 c 0.140959,-0.227417 0.422878,-0.303223 0.648413,-0.161087 0.225535,0.13266 0.291316,0.426407 0.159754,0.644348 l 0,0 c -0.131562,0.227417 -0.422878,0.303223 -0.648413,0.161087 C 45.811766,56.693189 45.736588,56.399441 45.86815,56.1815 z m 0.949126,-1.59192 0,0 c 0.112767,-0.236892 0.394686,-0.33165 0.620221,-0.217941 0.234932,0.113709 0.338302,0.388504 0.225534,0.625397 l 0,0 c -0.112767,0.236893 -0.394685,0.341126 -0.629618,0.227417 -0.225534,-0.113708 -0.328905,-0.39798 -0.216137,-0.634873 z m 0.808166,-1.705628 0,0 c 0.112768,-0.236893 0.394686,-0.341126 0.629618,-0.227417 0.234933,0.113709 0.328905,0.39798 0.216138,0.634873 l 0,0 c -0.10337,0.236893 -0.385289,0.33165 -0.620221,0.227417 -0.234932,-0.113709 -0.338302,-0.39798 -0.225535,-0.634873 z m 0.667208,-1.72458 0,0 c 0.08458,-0.246368 0.357096,-0.369552 0.601426,-0.284271 0.244329,0.08528 0.366494,0.360077 0.281918,0.606446 l 0,0 c -0.09397,0.246368 -0.357096,0.379028 -0.601426,0.284271 -0.244329,-0.08528 -0.375891,-0.360077 -0.281918,-0.606446 z m 0.573234,-1.771958 0,0 c 0.06578,-0.246368 0.328905,-0.39798 0.573234,-0.322174 0.253727,0.06633 0.394686,0.33165 0.328905,0.587494 l 0,0 c -0.07518,0.246369 -0.328905,0.39798 -0.582631,0.322174 -0.24433,-0.06633 -0.394686,-0.33165 -0.319508,-0.587494 z m 0.404083,-1.800385 0,0 c 0.04699,-0.255844 0.291316,-0.426407 0.545043,-0.379029 0.253727,0.04738 0.422878,0.293747 0.375891,0.549592 l 0,0 c -0.04699,0.255844 -0.291316,0.426407 -0.545042,0.379028 -0.253727,-0.04738 -0.422878,-0.293747 -0.375892,-0.549591 z m 0.272522,-1.847764 0,0 c 0.03759,-0.255844 0.272521,-0.445359 0.526248,-0.416931 0.253726,0.0379 0.441672,0.274795 0.41348,0.530639 l 0,0 c -0.02819,0.255845 -0.263124,0.445359 -0.526248,0.416932 -0.253727,-0.02843 -0.441672,-0.26532 -0.41348,-0.53064 z m 0.140959,-1.838288 0,0 c 0.0094,-0.26532 0.225535,-0.473786 0.479261,-0.46431 0.263124,0 0.469865,0.217941 0.460467,0.483261 l 0,0 c 0,0.255844 -0.216137,0.46431 -0.479261,0.46431 -0.253727,-0.0095 -0.460467,-0.227417 -0.460467,-0.483261 z m 0,-1.876191 0,0 c 0,-0.26532 0.197343,-0.483262 0.460467,-0.483262 0.263124,-0.0095 0.479261,0.19899 0.479261,0.454835 l 0,0.0095 c 0.0094,0.255844 -0.197343,0.473786 -0.460467,0.483262 -0.253726,0 -0.469864,-0.19899 -0.479261,-0.46431 z m -0.140959,-1.847764 0,0 c -0.02819,-0.255844 0.150356,-0.492737 0.41348,-0.521164 0.253727,-0.0379 0.488659,0.151611 0.526248,0.407455 l 0,0 c 0.02819,0.26532 -0.159754,0.502213 -0.41348,0.53064 -0.253727,0.02843 -0.488659,-0.151611 -0.526248,-0.416931 z m -0.272522,-1.838288 0,0 c -0.04699,-0.255845 0.122165,-0.511689 0.375892,-0.559068 0.253726,-0.04738 0.498056,0.123185 0.545042,0.379029 l 0,0 c 0.04699,0.255844 -0.122164,0.511688 -0.375891,0.559067 -0.253727,0.04738 -0.498056,-0.123184 -0.545043,-0.379028 z m -0.404083,-1.809862 0,0 c -0.07518,-0.246368 0.06578,-0.511688 0.319508,-0.587494 0.244329,-0.06633 0.507453,0.07581 0.582631,0.33165 l 0,0 c 0.06578,0.246369 -0.07518,0.511689 -0.328905,0.587494 -0.244329,0.06633 -0.507453,-0.0758 -0.573234,-0.33165 z m -0.582632,-1.762482 0,0 c -0.08457,-0.246369 0.03759,-0.521164 0.281919,-0.615921 0.244329,-0.08528 0.516851,0.0379 0.601426,0.284271 l 0,0 c 0.09397,0.246369 -0.02819,0.521164 -0.272521,0.606446 -0.24433,0.09476 -0.516851,-0.02843 -0.610824,-0.274796 z m -0.65781,-1.72458 0,0 c -0.112767,-0.236893 -0.01879,-0.521164 0.216138,-0.634872 0.234932,-0.113709 0.516851,-0.0095 0.629618,0.217941 l 0,0.0095 c 0.112767,0.227417 0.0094,0.511688 -0.225535,0.625397 -0.234932,0.113708 -0.507453,0.01895 -0.620221,-0.217942 z m -0.817563,-1.715104 0,0 c -0.112768,-0.236892 -0.0094,-0.511688 0.225534,-0.625397 0.225535,-0.113708 0.507454,-0.01895 0.620221,0.217942 l 0,0 c 0.112768,0.236893 0.0188,0.521164 -0.216137,0.634872 -0.234932,0.113709 -0.516851,0.0095 -0.629618,-0.227417 z m -0.939729,-1.582444 0,0 c -0.140959,-0.217941 -0.06578,-0.511688 0.150357,-0.653824 0.225534,-0.13266 0.51685,-0.06633 0.648412,0.161087 l 0,0 c 0.131562,0.227417 0.06578,0.511689 -0.159754,0.653824 -0.216137,0.13266 -0.507453,0.06633 -0.639015,-0.161087 z m -1.052496,-1.516114 0,0 c -0.159754,-0.208465 -0.112767,-0.502212 0.09397,-0.6633 0.20674,-0.151611 0.498056,-0.113708 0.65781,0.09476 l 0,0 c 0.159754,0.208465 0.112767,0.511688 -0.09397,0.663299 -0.20674,0.161088 -0.498056,0.113709 -0.65781,-0.09476 z m -1.146469,-1.440308 0,0 c -0.178548,-0.189514 -0.159754,-0.492737 0.02819,-0.672776 0.187946,-0.170562 0.488659,-0.161087 0.667207,0.0379 l 0,0 c 0.169151,0.189515 0.159754,0.492737 -0.03759,0.672776 -0.187946,0.170563 -0.488659,0.161087 -0.65781,-0.0379 z m -1.249839,-1.355027 0,0 c -0.197343,-0.180038 -0.20674,-0.473785 -0.03759,-0.672775 0.178549,-0.189515 0.479262,-0.208466 0.667207,-0.02843 l 0,0 c 0.197343,0.180039 0.206741,0.473786 0.03759,0.672776 -0.178549,0.189514 -0.479262,0.208466 -0.667208,0.02843 z m -1.390798,-1.279221 0,0 c -0.197343,-0.170563 -0.20674,-0.473786 -0.03759,-0.6633 0.178548,-0.19899 0.479261,-0.208466 0.667207,-0.0379 l 0,0 c 0.197343,0.180039 0.20674,0.483262 0.02819,0.672776 -0.169151,0.189514 -0.469864,0.208466 -0.65781,0.02843 z m -1.456579,-1.118134 0,0 c -0.206741,-0.161087 -0.253727,-0.454834 -0.09397,-0.6633 0.150356,-0.217941 0.45107,-0.255844 0.65781,-0.104233 l 0,0 c 0.20674,0.161087 0.253727,0.454834 0.09397,0.6633 -0.150357,0.208466 -0.45107,0.255844 -0.65781,0.104233 z m -1.531758,-1.032853 0,0 c -0.216137,-0.13266 -0.291316,-0.426407 -0.150356,-0.644348 0.131562,-0.227417 0.422878,-0.293747 0.648412,-0.161087 l 0,0 c 0.216138,0.13266 0.291316,0.426407 0.150357,0.653824 -0.131562,0.217941 -0.422878,0.293747 -0.648413,0.151611 z m -1.588141,-0.909668 0,0 c -0.234932,-0.113709 -0.328905,-0.39798 -0.216138,-0.634873 0.112768,-0.236893 0.385289,-0.33165 0.620221,-0.217941 l 0,0 c 0.234932,0.113708 0.338303,0.388504 0.225535,0.625397 -0.112767,0.236893 -0.394686,0.341125 -0.629618,0.227417 z m -1.653922,-0.79596 0,0 c -0.24433,-0.09476 -0.366494,-0.369553 -0.281919,-0.615921 0.09397,-0.236893 0.357097,-0.369553 0.601427,-0.274796 l 0,0 c 0.244329,0.08528 0.375891,0.360077 0.281918,0.606446 -0.08458,0.246368 -0.357097,0.369552 -0.601426,0.284271 z m -1.76669,-0.653824 0,0 c -0.244329,-0.09476 -0.366494,-0.360077 -0.281918,-0.606446 0.09397,-0.246368 0.366494,-0.379028 0.601426,-0.284271 l 0.0094,0 c 0.234932,0.08528 0.366494,0.360077 0.272521,0.606446 -0.08457,0.246368 -0.357096,0.369552 -0.601426,0.284271 z m -1.738498,-0.540116 0,0 c -0.253726,-0.05685 -0.41348,-0.312698 -0.357096,-0.568542 0.05638,-0.246369 0.31011,-0.407456 0.563837,-0.350602 l 0,0 c 0.253726,0.05685 0.41348,0.312699 0.357096,0.559067 -0.05638,0.255844 -0.31011,0.416932 -0.563837,0.360077 z m -1.823073,-0.379028 0,0 c -0.253727,-0.04738 -0.422878,-0.293747 -0.375891,-0.549592 0.04699,-0.265319 0.291315,-0.435882 0.545042,-0.388504 l 0,0 c 0.263124,0.05685 0.422878,0.303223 0.375892,0.559067 -0.04699,0.255845 -0.291316,0.426407 -0.545043,0.379029 z m -1.813676,-0.246369 0,0 c -0.263124,-0.01895 -0.45107,-0.246368 -0.432275,-0.511688 0.01879,-0.255844 0.244329,-0.454834 0.507453,-0.435883 l 0,0 c 0.263124,0.02843 0.45107,0.255844 0.432275,0.511688 -0.01879,0.26532 -0.253726,0.454835 -0.507453,0.435883 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.15035656px;stroke-linecap:butt;stroke-linejoin:bevel;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3152"
+         d="m 24.827628,38.03551 c -2.471486,0 -4.473108,2.018326 -4.473108,4.510439 0,2.501588 2.001622,4.519915 4.473108,4.519915 2.480883,0 4.482505,-2.018327 4.482505,-4.519915 0,-2.492113 -2.001622,-4.510439 -4.482505,-4.510439"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         id="path3154"
+         d="m 24.827628,38.03551 c -2.471486,0 -4.473108,2.018326 -4.473108,4.510439 0,2.501588 2.001622,4.519915 4.473108,4.519915 2.480883,0 4.482505,-2.018327 4.482505,-4.519915 0,-2.492113 -2.001622,-4.510439 -4.482505,-4.510439"
+         style="fill:none;stroke:#000000;stroke-width:2.81918573px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <text
+         id="text3156"
+         style="font-size:13.83280373px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="44.725365"
+         x="3.3078444"
+         xml:space="preserve">V</text>
+      <text
+         id="text3158"
+         style="font-size:8.72068119px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="46.696312"
+         x="12.479595"
+         xml:space="preserve">1</text>
+      <text
+         id="text3160"
+         style="font-size:13.83280373px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#000000;font-family:Arial"
+         y="44.725365"
+         x="17.441362"
+         xml:space="preserve"> </text>
+      <path
+         id="path3162"
+         d="m 50.12512,18.363931 0,0 c -0.253726,0 -0.460467,-0.217942 -0.460467,-0.483262 0.0094,-0.26532 0.225535,-0.46431 0.488659,-0.46431 l 0,0 c 0.253727,0.0095 0.460467,0.227418 0.45107,0.483262 0,0.26532 -0.216138,0.473785 -0.479262,0.46431 z m -1.823073,0.04738 -0.0094,0 c -0.253727,0.01895 -0.479262,-0.180038 -0.498057,-0.435883 -0.02819,-0.265319 0.169152,-0.492737 0.422878,-0.511688 l 0.0094,0 c 0.253726,-0.01895 0.479261,0.170563 0.498056,0.435883 0.02819,0.255844 -0.169151,0.483261 -0.422878,0.511688 z m -1.860663,0.180039 0,0 c -0.253726,0.0379 -0.488658,-0.151612 -0.51685,-0.407456 -0.03759,-0.26532 0.150356,-0.502213 0.404083,-0.53064 l 0,0 c 0.263124,-0.02843 0.498056,0.151612 0.526248,0.416932 0.02819,0.255844 -0.150357,0.492737 -0.413481,0.521164 z m -1.804278,0.322174 0,0 c -0.253727,0.05685 -0.498057,-0.104233 -0.55444,-0.360077 -0.05638,-0.246369 0.10337,-0.502213 0.357097,-0.559067 l 0,0 c 0.253726,-0.05685 0.498056,0.104233 0.554439,0.360077 0.05638,0.255844 -0.10337,0.502213 -0.357096,0.559067 z m -1.794882,0.46431 0,0 c -0.244329,0.07581 -0.507453,-0.07581 -0.573234,-0.322174 -0.07518,-0.255845 0.06578,-0.521164 0.319507,-0.587494 l 0,0 c 0.24433,-0.07581 0.507454,0.0758 0.582632,0.322174 0.06578,0.255844 -0.07518,0.511688 -0.328905,0.587494 z m -1.738498,0.615921 0,0 c -0.244329,0.09476 -0.51685,-0.0379 -0.601426,-0.284271 -0.08458,-0.236893 0.03759,-0.511689 0.281919,-0.606446 l 0,0 c 0.244329,-0.08528 0.51685,0.0379 0.601426,0.284272 0.08458,0.246368 -0.03759,0.521164 -0.281919,0.606445 z m -1.682114,0.72963 -0.0094,0 c -0.225535,0.113709 -0.507453,0.0095 -0.620221,-0.227417 -0.112767,-0.236893 -0.0094,-0.521164 0.225535,-0.634873 l 0,0 c 0.234932,-0.104233 0.507453,-0.0095 0.620221,0.227417 0.112767,0.236893 0.01879,0.521165 -0.216138,0.634873 z m -1.635127,0.833863 0,0 c -0.225535,0.13266 -0.507454,0.06633 -0.648413,-0.161087 -0.131562,-0.217942 -0.06578,-0.511689 0.159754,-0.644349 l 0,0 c 0.225535,-0.142135 0.507453,-0.06633 0.648412,0.151612 0.131562,0.227417 0.06578,0.521164 -0.159753,0.653824 z m -1.606936,0.985474 0,0 c -0.225535,0.142136 -0.507454,0.06633 -0.648413,-0.151612 -0.131562,-0.227417 -0.05638,-0.521164 0.159754,-0.653824 l 0,0 c 0.225535,-0.13266 0.516851,-0.06633 0.648413,0.161087 0.131562,0.217942 0.06578,0.511689 -0.159754,0.644349 z m -1.475374,1.108658 0,0 c -0.20674,0.151612 -0.498056,0.113709 -0.65781,-0.09476 -0.150357,-0.217941 -0.112767,-0.511688 0.10337,-0.6633 l 0,0 c 0.20674,-0.161087 0.498056,-0.113708 0.65781,0.09476 0.150357,0.208466 0.10337,0.502213 -0.10337,0.6633 z m -1.390798,1.203416 0,0 c -0.187946,0.180038 -0.488659,0.161087 -0.65781,-0.0379 -0.178549,-0.189514 -0.159754,-0.492737 0.02819,-0.6633 l 0,0 c 0.197343,-0.180039 0.488658,-0.161087 0.667207,0.02843 0.169151,0.19899 0.159754,0.492737 -0.03759,0.672776 z m -1.306223,1.298172 0,0 c -0.169151,0.189515 -0.469864,0.208466 -0.65781,0.02843 -0.197343,-0.170562 -0.20674,-0.473785 -0.03759,-0.663299 l 0,0 c 0.178548,-0.19899 0.479261,-0.208466 0.667207,-0.0379 0.197343,0.180038 0.20674,0.483261 0.02819,0.672775 z m -1.21225,1.383454 0,0 c -0.150356,0.208466 -0.451069,0.255845 -0.65781,0.09476 -0.20674,-0.151611 -0.244329,-0.445358 -0.09397,-0.663299 l 0,0 c 0.159754,-0.208466 0.45107,-0.246369 0.65781,-0.09476 0.206741,0.161088 0.253727,0.454835 0.09397,0.6633 z m -1.118277,1.52559 0,0 c -0.159754,0.208466 -0.451069,0.246369 -0.65781,0.09476 -0.20674,-0.161087 -0.253726,-0.454834 -0.09397,-0.6633 l 0,0 c 0.150357,-0.208465 0.441673,-0.255844 0.65781,-0.09476 0.206741,0.151612 0.24433,0.454834 0.09397,0.6633 z m -0.977317,1.572968 0,0 c -0.131562,0.217942 -0.422878,0.293747 -0.639016,0.151612 -0.225535,-0.13266 -0.291316,-0.426407 -0.159754,-0.653824 l 0,0 c 0.14096,-0.217942 0.422878,-0.293748 0.648413,-0.151612 0.216138,0.13266 0.291316,0.426407 0.150357,0.653824 z m -0.845756,1.629823 0,0 c -0.112768,0.236893 -0.394686,0.33165 -0.629618,0.217941 -0.234932,-0.113708 -0.338303,-0.388504 -0.225535,-0.625397 l 0,0 c 0.112767,-0.236893 0.394686,-0.341125 0.629618,-0.227417 0.234932,0.113709 0.338302,0.39798 0.225535,0.634873 z m -0.742386,1.686677 0,0 c -0.09397,0.246368 -0.357096,0.379028 -0.601426,0.284271 -0.244329,-0.08528 -0.375891,-0.360077 -0.281918,-0.606446 l 0,0 c 0.08458,-0.246368 0.357096,-0.369552 0.601426,-0.284271 0.244329,0.09476 0.366494,0.360077 0.281918,0.606446 z m -0.629618,1.753006 0,0 c -0.07518,0.255845 -0.338302,0.39798 -0.582631,0.322175 -0.253727,-0.06633 -0.394686,-0.33165 -0.328905,-0.587494 l 0.0094,0 c 0.06578,-0.246369 0.328905,-0.39798 0.573234,-0.322175 0.253727,0.07581 0.394686,0.341126 0.328905,0.587494 z m -0.479261,1.809862 0,0 c -0.05638,0.255844 -0.310111,0.416931 -0.55444,0.350601 -0.253727,-0.05685 -0.413481,-0.303223 -0.357097,-0.559067 l 0,0 c 0.05638,-0.255844 0.31011,-0.416931 0.563837,-0.360077 0.253727,0.05685 0.404083,0.312698 0.3477,0.568543 z m -0.338303,1.809861 0,0 c -0.03759,0.26532 -0.272521,0.445358 -0.526248,0.416931 -0.263124,-0.0379 -0.441672,-0.274796 -0.41348,-0.53064 l 0,0 c 0.03759,-0.255844 0.272521,-0.445358 0.526248,-0.416931 0.253727,0.0379 0.441672,0.274795 0.41348,0.53064 z m -0.197343,1.866715 0,0 c -0.01879,0.26532 -0.253726,0.454834 -0.507453,0.435883 -0.263124,-0.01895 -0.45107,-0.255844 -0.432275,-0.511689 l 0,0 c 0.01879,-0.26532 0.253727,-0.454834 0.507453,-0.435882 0.263124,0.01895 0.45107,0.255844 0.432275,0.511688 z m -0.06578,1.847764 0,0 c 0,0.255844 -0.20674,0.473786 -0.460467,0.483261 -0.263124,0.0095 -0.479261,-0.19899 -0.479261,-0.46431 l 0,0 c -0.0094,-0.26532 0.197343,-0.473785 0.460467,-0.483261 0.253727,-0.0095 0.469864,0.19899 0.479261,0.46431 z m 0.07518,1.866715 0,0 c 0.01879,0.255844 -0.169151,0.483262 -0.432275,0.511689 -0.253727,0.01895 -0.479262,-0.180039 -0.498057,-0.435883 l 0,0 c -0.02819,-0.26532 0.169152,-0.492737 0.422878,-0.511689 0.263124,-0.01895 0.488659,0.170563 0.507454,0.435883 z m 0.197343,1.838288 0,0 c 0.04699,0.255845 -0.122165,0.502213 -0.375892,0.549592 -0.253726,0.04738 -0.498056,-0.123184 -0.545042,-0.379029 l 0,0 c -0.04699,-0.26532 0.122164,-0.511688 0.375891,-0.559067 0.253727,-0.04738 0.498056,0.123185 0.545043,0.388504 z m 0.366494,1.838289 0,0 c 0.05638,0.255844 -0.10337,0.511688 -0.357097,0.568542 -0.244329,0.05685 -0.498056,-0.104232 -0.55444,-0.360077 l 0,0 c -0.05638,-0.255844 0.09397,-0.511688 0.3477,-0.568542 0.253726,-0.05686 0.507453,0.104232 0.563837,0.360077 z m 0.479261,1.771958 0,0 c 0.08458,0.246368 -0.03759,0.511688 -0.281918,0.606445 -0.24433,0.08528 -0.516851,-0.0379 -0.601426,-0.284271 l 0,0 c -0.09397,-0.246368 0.03759,-0.521164 0.281918,-0.606445 0.24433,-0.09476 0.507454,0.0379 0.601426,0.284271 z m 0.648413,1.781434 0,0 c 0.08458,0.246368 -0.03759,0.511688 -0.281919,0.606445 -0.244329,0.08528 -0.51685,-0.0379 -0.601426,-0.284271 l 0,0 c -0.09397,-0.246368 0.03759,-0.521164 0.281919,-0.606446 0.244329,-0.09476 0.507453,0.0379 0.601426,0.284272 z m 0.751783,1.677201 0,0 c 0.112767,0.236893 0.0094,0.521164 -0.225535,0.634873 -0.234932,0.113708 -0.507453,0.01895 -0.620221,-0.217942 l 0,0 c -0.112767,-0.236893 -0.01879,-0.521164 0.216138,-0.634872 0.234932,-0.113709 0.51685,-0.01895 0.629618,0.217941 z m 0.86455,1.629822 0,0 c 0.140959,0.217942 0.06578,0.511689 -0.150356,0.653825 -0.225535,0.13266 -0.516851,0.06633 -0.648413,-0.161087 l 0,0 c -0.140959,-0.227418 -0.06578,-0.511689 0.150356,-0.653825 0.225535,-0.13266 0.516851,-0.06633 0.648413,0.161087 z m 0.986715,1.563493 0,0 c 0.150357,0.208466 0.112768,0.502213 -0.09397,0.6633 -0.20674,0.151611 -0.507453,0.113708 -0.65781,-0.09476 l 0,0 c -0.159754,-0.208466 -0.112767,-0.511689 0.09397,-0.6633 0.20674,-0.161087 0.498056,-0.113709 0.65781,0.09476 z m 1.127674,1.516114 0,0 c 0.150357,0.208466 0.112768,0.502213 -0.09397,0.6633 -0.206741,0.151611 -0.507454,0.113708 -0.65781,-0.09476 l 0,0 c -0.159754,-0.208466 -0.112768,-0.511689 0.09397,-0.6633 0.206741,-0.161087 0.498057,-0.113709 0.65781,0.09476 z m 1.221647,1.373978 0,0 c 0.178549,0.19899 0.159754,0.492737 -0.02819,0.672776 -0.187946,0.170563 -0.488659,0.161087 -0.667208,-0.0379 l 0,0 c -0.169151,-0.189514 -0.159754,-0.492737 0.03759,-0.6633 0.187946,-0.180038 0.488659,-0.161087 0.65781,0.02843 z m 1.31562,1.288697 0,0 c 0.197343,0.170563 0.206741,0.473786 0.03759,0.672776 -0.178549,0.189514 -0.469865,0.208465 -0.667208,0.02843 l 0,0 c -0.187945,-0.170563 -0.20674,-0.473786 -0.02819,-0.672776 0.169152,-0.189514 0.469865,-0.208465 0.65781,-0.02843 z m 1.400196,1.19394 0.0094,0 c 0.206741,0.151611 0.24433,0.454834 0.09397,0.6633 -0.159754,0.208466 -0.45107,0.246368 -0.65781,0.09476 l 0,0 c -0.20674,-0.161087 -0.253727,-0.454834 -0.10337,-0.6633 0.159754,-0.208466 0.45107,-0.255844 0.65781,-0.09476 z m 1.484771,1.089707 0,0 c 0.225535,0.13266 0.291316,0.426407 0.159754,0.653824 -0.131562,0.217941 -0.422878,0.293747 -0.648413,0.151611 l 0,0 c -0.216137,-0.132659 -0.291316,-0.426407 -0.150356,-0.644348 0.131562,-0.227417 0.422877,-0.303223 0.639015,-0.161087 z m 1.606936,0.985474 0,0 c 0.225535,0.13266 0.291316,0.426407 0.159754,0.653824 -0.131562,0.217942 -0.422878,0.293747 -0.648413,0.161087 l 0,-0.0095 c -0.216138,-0.13266 -0.291316,-0.426407 -0.159754,-0.644349 0.140959,-0.227417 0.422878,-0.293747 0.648413,-0.161087 z m 1.644525,0.824387 0,0 c 0.234932,0.113709 0.328905,0.39798 0.216137,0.634873 -0.112767,0.236893 -0.394686,0.33165 -0.62022,0.217941 l -0.0094,0 c -0.225535,-0.113708 -0.328905,-0.39798 -0.216137,-0.634873 0.112767,-0.236892 0.394686,-0.33165 0.629618,-0.217941 z m 1.691511,0.710678 0,0 c 0.24433,0.08528 0.366494,0.360078 0.281919,0.606446 -0.09397,0.246369 -0.357097,0.369553 -0.601427,0.284271 l 0,0 c -0.244329,-0.09476 -0.375891,-0.369552 -0.281918,-0.615921 0.08458,-0.236893 0.357097,-0.369553 0.601426,-0.274796 z m 1.738498,0.606446 0.0094,0 c 0.24433,0.06633 0.385289,0.33165 0.319508,0.587494 -0.07518,0.246369 -0.328905,0.39798 -0.582632,0.322174 l 0,0 c -0.253726,-0.07581 -0.394686,-0.33165 -0.319507,-0.587494 0.06578,-0.246368 0.328905,-0.39798 0.573234,-0.322174 z m 1.804279,0.445359 0,0 c 0.253726,0.05685 0.41348,0.312698 0.357097,0.568542 -0.05638,0.255844 -0.310111,0.416932 -0.563838,0.360077 l 0,0 c -0.253726,-0.05685 -0.41348,-0.312698 -0.357096,-0.568542 0.05638,-0.246369 0.31011,-0.407456 0.563837,-0.360077 z m 1.804279,0.312698 0,0 c 0.253726,0.02843 0.441672,0.26532 0.41348,0.521164 -0.02819,0.26532 -0.263124,0.445359 -0.526248,0.416932 l 0,0 c -0.253727,-0.02843 -0.441672,-0.26532 -0.41348,-0.521165 0.03759,-0.26532 0.263124,-0.445358 0.526248,-0.416931 z m 1.851265,0.180039 0,0 c 0.263124,0.01895 0.451069,0.246368 0.432275,0.511688 -0.01879,0.255844 -0.24433,0.454834 -0.507454,0.426407 l 0,0 c -0.253726,-0.01895 -0.451069,-0.246368 -0.432275,-0.502213 0.0188,-0.26532 0.253727,-0.454834 0.507454,-0.435882 z m 1.83247,0.01895 0,0 c 0.263124,0 0.479262,0.19899 0.479262,0.46431 0.0094,0.26532 -0.197343,0.483261 -0.460467,0.483261 l 0,0 c -0.253727,0.0095 -0.469864,-0.19899 -0.479262,-0.454834 -0.0094,-0.26532 0.197343,-0.483261 0.460467,-0.492737 z m 1.851266,-0.104233 0,0 c 0.253726,-0.01895 0.479261,0.170563 0.507453,0.435883 0.01879,0.255844 -0.169151,0.483261 -0.432275,0.511688 l 0,0 c -0.263124,0.01895 -0.488659,-0.170562 -0.507454,-0.435882 -0.01879,-0.255845 0.169152,-0.492737 0.432276,-0.511689 z m 1.813676,-0.246368 0,0 c 0.253726,-0.04738 0.498056,0.123184 0.545042,0.379028 0.04699,0.255844 -0.112767,0.502213 -0.375891,0.559067 l 0,0 c -0.253727,0.04738 -0.498056,-0.123184 -0.545043,-0.379028 -0.04699,-0.255845 0.122165,-0.511689 0.375892,-0.559067 z m 1.823073,-0.379029 0,0 c 0.253727,-0.05685 0.507453,0.104233 0.563837,0.360077 0.05638,0.255844 -0.10337,0.502213 -0.357097,0.559067 l 0,0 c -0.253726,0.06633 -0.507453,-0.09476 -0.563837,-0.350601 -0.05638,-0.255844 0.10337,-0.511689 0.357097,-0.568543 z m 1.738498,-0.53064 0,0 c 0.244329,-0.09476 0.516851,0.02843 0.601426,0.274796 0.09397,0.246368 -0.02819,0.521164 -0.272521,0.606445 l 0,0 c -0.24433,0.09476 -0.516851,-0.02843 -0.610824,-0.274795 -0.08457,-0.246369 0.03759,-0.521164 0.281919,-0.606446 z m 1.76669,-0.653824 0,0 c 0.244329,-0.09476 0.51685,0.02843 0.601426,0.274796 0.09397,0.246368 -0.03759,0.521164 -0.272521,0.615921 l -0.0094,0 c -0.234932,0.08528 -0.507453,-0.0379 -0.601426,-0.284271 -0.08458,-0.246369 0.03759,-0.521165 0.281919,-0.606446 z m 1.653922,-0.79596 0,0 c 0.234932,-0.113708 0.51685,-0.01895 0.629618,0.217942 0.112767,0.236892 0.01879,0.521164 -0.216138,0.634872 l 0,0 c -0.234932,0.113709 -0.51685,0.0095 -0.629618,-0.227417 -0.112767,-0.227417 -0.01879,-0.511688 0.216138,-0.625397 z m 1.588141,-0.919144 0,0 c 0.225535,-0.13266 0.516851,-0.06633 0.648413,0.161087 0.140959,0.217942 0.06578,0.511689 -0.150357,0.644349 l 0,0 c -0.225535,0.142135 -0.516851,0.0758 -0.648413,-0.151612 -0.140959,-0.227417 -0.06578,-0.511688 0.150357,-0.653824 z m 1.531757,-1.023377 0,0 c 0.206741,-0.151611 0.507454,-0.113708 0.65781,0.09476 0.159754,0.208466 0.112768,0.511689 -0.09397,0.6633 l 0,0 c -0.206741,0.161087 -0.498057,0.113709 -0.65781,-0.09476 -0.159754,-0.208466 -0.112768,-0.502213 0.09397,-0.6633 z m 1.45658,-1.12761 0,0 c 0.187945,-0.170562 0.488659,-0.161087 0.667207,0.0379 0.169151,0.189514 0.159754,0.492737 -0.03759,0.6633 l 0,0 c -0.187946,0.180039 -0.488659,0.161087 -0.65781,-0.02843 -0.178549,-0.189514 -0.169151,-0.492737 0.02819,-0.672776 z m 1.390798,-1.269745 0,0 c 0.187946,-0.180039 0.488659,-0.161087 0.667207,0.02843 0.169151,0.189514 0.159754,0.492737 -0.03759,0.672776 l 0,0 c -0.187946,0.170562 -0.488659,0.161087 -0.65781,-0.0379 -0.178548,-0.189514 -0.159754,-0.492737 0.02819,-0.6633 z m 1.249839,-1.355027 0,0 c 0.169151,-0.19899 0.469864,-0.208466 0.65781,-0.0379 0.197343,0.180039 0.216137,0.473786 0.03759,0.672776 l 0,0 c -0.169151,0.189514 -0.469864,0.208465 -0.667207,0.02843 -0.187946,-0.170563 -0.20674,-0.473786 -0.02819,-0.6633 z m 1.146469,-1.440308 0,0 c 0.159754,-0.208466 0.451069,-0.255844 0.65781,-0.09476 0.216137,0.151611 0.253726,0.445358 0.10337,0.6633 l 0,0 c -0.159754,0.208465 -0.45107,0.246368 -0.65781,0.09476 -0.20674,-0.161087 -0.253727,-0.454835 -0.10337,-0.6633 z m 1.052496,-1.516114 0,0 c 0.140959,-0.227417 0.422878,-0.293747 0.648412,-0.161087 0.225535,0.13266 0.291316,0.426407 0.159754,0.653824 l 0,0 C 71.034082,56.91113 70.742766,56.97746 70.517232,56.8448 70.301094,56.71214 70.225916,56.418393 70.357478,56.190976 z m 0.949126,-1.582444 0,0 c 0.112767,-0.236893 0.394686,-0.341126 0.629618,-0.227417 0.234932,0.113708 0.328905,0.39798 0.216137,0.634872 l 0,0 c -0.112767,0.236893 -0.385288,0.341126 -0.620221,0.227418 -0.234932,-0.113709 -0.338302,-0.39798 -0.225534,-0.634873 z m 0.808166,-1.705628 0,0 c 0.112768,-0.236893 0.394686,-0.341126 0.629618,-0.227418 0.234932,0.113709 0.338302,0.39798 0.225535,0.625397 l 0,0.0095 C 72.857156,53.5378 72.575237,53.642033 72.340305,53.528325 72.105373,53.414616 72.0114,53.13982 72.11477,52.902928 z m 0.667207,-1.72458 0,0 c 0.09397,-0.246369 0.357097,-0.379029 0.601427,-0.284271 0.244329,0.08528 0.375891,0.360077 0.281918,0.606445 l 0,0 c -0.08458,0.246369 -0.357097,0.369553 -0.601426,0.284271 -0.24433,-0.09476 -0.366494,-0.360077 -0.281919,-0.606445 z m 0.573235,-1.771958 0,0 c 0.07518,-0.255845 0.328905,-0.39798 0.582631,-0.322175 0.253727,0.06633 0.394686,0.33165 0.319508,0.578019 l 0,0 c -0.06578,0.255844 -0.328905,0.39798 -0.573234,0.33165 -0.253727,-0.07581 -0.394686,-0.33165 -0.328905,-0.587494 z m 0.41348,-1.800386 0,0 c 0.04699,-0.26532 0.291316,-0.435882 0.545043,-0.388504 0.253727,0.04738 0.422878,0.293747 0.375891,0.559067 l 0,0 c -0.04699,0.255844 -0.291316,0.426407 -0.545042,0.379029 -0.253727,-0.04738 -0.422878,-0.293747 -0.375892,-0.549592 z m 0.272522,-1.847764 0,0 c 0.02819,-0.255844 0.263124,-0.445358 0.526248,-0.416931 0.253726,0.02843 0.441672,0.26532 0.41348,0.53064 l 0,0 c -0.03759,0.255844 -0.272521,0.445358 -0.526248,0.416931 -0.253727,-0.0379&nb